HTTPEntenda as especificações de entrega, solicitação e resposta do endpoint - Amazon Data Firehose

A entrega de streams do Amazon Data Firehose para tabelas Apache Iceberg no Amazon S3 está em versão prévia e está sujeita a alterações.

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

HTTPEntenda as especificações de entrega, solicitação e resposta do endpoint

Para que o Amazon Data Firehose entregue dados com sucesso aos endpoints personalizados, esses HTTP endpoints devem aceitar solicitações e enviar respostas usando determinados formatos de solicitação e resposta do Amazon Data Firehose. Esta seção descreve as especificações de formato das HTTP solicitações que o serviço Amazon Data Firehose envia para HTTP endpoints personalizados, bem como as especificações de formato das HTTP respostas que o serviço Amazon Data Firehose espera. HTTPOs endpoints têm 3 minutos para responder a uma solicitação antes que o Amazon Data Firehose atinja o tempo limite dessa solicitação. O Amazon Data Firehose trata respostas que não seguem o formato adequado como falhas na entrega.

Formato de solicitação

Caminho e URL parâmetros

Eles são configurados diretamente por você como parte de um único URL campo. O Amazon Data Firehose os envia conforme configurados, sem modificação. Somente destinos https são compatíveis. URLas restrições são aplicadas durante a configuração do fluxo de entrega.

nota

Atualmente, somente a porta 443 é suportada para entrega de dados de HTTP terminais.

HTTPCabeçalhos - Versão do protocolo X-Amz-Firehose

Esse cabeçalho é usado para indicar a versão dos formatos de solicitação/resposta. Atualmente, a única versão é a 1.0.

HTTPCabeçalhos - X-Amz-Firehose-Request-Id

O valor desse cabeçalho é opaco GUID que pode ser usado para fins de depuração e desduplicação. As implementações de endpoint devem registrar em log o valor desse cabeçalho, se possível, tanto para solicitações bem-sucedidas quanto malsucedidas. O ID da solicitação é mantido entre as várias tentativas da mesma solicitação.

HTTPCabeçalhos - Tipo de conteúdo

O valor do cabeçalho Content-Type é sempre application/json.

HTTPCabeçalhos - Codificação de conteúdo

Um stream do Firehose pode ser configurado para ser usado para GZIP compactar o corpo ao enviar solicitações. Quando essa compactação está habilitada, o valor do cabeçalho Content-Encoding é definido como gzip, de acordo com a prática padrão. Se a compactação não estiver habilitada, o cabeçalho Content-Encoding estará totalmente ausente.

HTTPCabeçalhos - Tamanho do conteúdo

Isso é usado da maneira padrão.

HTTPCabeçalhos - X-Amz-Firehose-Source-Arn:

O ARN do stream Firehose representado em formato de ASCII string. A região de ARN codificação, o ID AWS da conta e o nome do stream. Por exemplo, arn:aws:firehose:us-east-1:123456789:deliverystream/testStream.

HTTPCabeçalhos - X-Amz-Firehose-Access-Key

Esse cabeçalho contém uma API chave ou outras credenciais. Você pode criar ou atualizar a API -key (também conhecida como token de autorização) ao criar ou atualizar seu fluxo de entrega. O Amazon Data Firehose restringe o tamanho da chave de acesso a 4096 bytes. O Amazon Data Firehose não tenta interpretar essa chave de forma alguma. A chave configurada é copiada literalmente para o valor desse cabeçalho.

O conteúdo pode ser arbitrário e potencialmente representar um JWT token ou um ACCESS _KEY. Se um endpoint exigir credenciais de vários campos (por exemplo, nome de usuário e senha), os valores de todos os campos devem ser armazenados juntos em uma única chave de acesso em um formato que o endpoint entenda (ou). JSON CSV Esse campo pode ser codificado na base 64 se o conteúdo original for binário. O Amazon Data Firehose não modifica e/ou codifica o valor configurado e usa o conteúdo como está.

HTTPCabeçalhos - X-Amz-Firehose-Common-Attributes

Esse cabeçalho transporta os atributos comuns (metadados) relativos à solicitação inteira e/ou a todos os registros dentro da solicitação. Eles são configurados diretamente por você ao criar um stream do Firehose. O valor desse atributo é codificado como um JSON objeto com o seguinte esquema:

"$schema": http://json-schema.org/draft-07/schema# properties: commonAttributes: type: object minProperties: 0 maxProperties: 50 patternProperties: "^.{1,256}$": type: string minLength: 0 maxLength: 1024

Veja um exemplo abaixo:

"commonAttributes": { "deployment -context": "pre-prod-gamma", "device-types": "" }
Corpo: tamanho máximo

O tamanho máximo do corpo é configurado por você e pode ter até 64 MiB, antes de compactado.

Corpo: esquema

O corpo carrega um único JSON documento com o seguinte JSON esquema (escrito emYAML):

"$schema": http://json-schema.org/draft-07/schema# title: FirehoseCustomHttpsEndpointRequest description: > The request body that the Firehose service sends to custom HTTPS endpoints. type: object properties: requestId: description: > Same as the value in the X-Amz-Firehose-Request-Id header, duplicated here for convenience. type: string timestamp: description: > The timestamp (milliseconds since epoch) at which the Firehose server generated this request. type: integer records: description: > The actual records of the Firehose stream, carrying the customer data. type: array minItems: 1 maxItems: 10000 items: type: object properties: data: description: > The data of this record, in Base64. Note that empty records are permitted in Firehose. The maximum allowed size of the data, before Base64 encoding, is 1024000 bytes; the maximum length of this field is therefore 1365336 chars. type: string minLength: 0 maxLength: 1365336 required: - requestId - records

Veja um exemplo abaixo:

{ "requestId": "ed4acda5-034f-9f42-bba1-f29aea6d7d8f", "timestamp": 1578090901599 "records": [ { "data": "aGVsbG8=" }, { "data": "aGVsbG8gd29ybGQ=" } ] }

Formato de resposta

Comportamento padrão em caso de erro

Se uma resposta não estiver em conformidade com os requisitos abaixo, o servidor Firehose a tratará como se tivesse um código de status 500 sem corpo.

Código de status

O código MUST de HTTP status está na faixa 2XX, 4XX ou 5XX.

O servidor Amazon Data Firehose NOT segue os redirecionamentos (códigos de status 3XX). Somente o código de resposta 200 é considerado uma entrega bem-sucedida dos registros para HTTP /EP. O código de resposta 413 (tamanho excedido) é considerado uma falha permanente, e o lote de registros não é enviado para o bucket de erros, se configurado. Todos os outros códigos de resposta são considerados erros passíveis de novas tentativas e estão sujeitos ao algoritmo de novas tentativas de recuo que será explicado posteriormente.

Cabeçalhos HTTP: tipo de conteúdo

O único tipo de conteúdo aceitável é aplicação/json.

HTTPCabeçalhos - Codificação de conteúdo

A codificação de conteúdo MUST NOT deve ser usada. O corpo MUST deve ser descomprimido.

HTTPCabeçalhos - Tamanho do conteúdo

O cabeçalho Content-Length MUST estará presente se a resposta tiver um corpo.

Corpo: tamanho máximo

O corpo da resposta deve ter no máximo 1 MiB.

"$schema": http://json-schema.org/draft-07/schema# title: FirehoseCustomHttpsEndpointResponse description: > The response body that the Firehose service sends to custom HTTPS endpoints. type: object properties: requestId: description: > Must match the requestId in the request. type: string timestamp: description: > The timestamp (milliseconds since epoch) at which the server processed this request. type: integer errorMessage: description: > For failed requests, a message explaining the failure. If a request fails after exhausting all retries, the last Instance of the error message is copied to error output S3 bucket if configured. type: string minLength: 0 maxLength: 8192 required: - requestId - timestamp

Veja um exemplo abaixo:

Failure Case (HTTP Response Code 4xx or 5xx) { "requestId": "ed4acda5-034f-9f42-bba1-f29aea6d7d8f", "timestamp": "1578090903599", "errorMessage": "Unable to deliver records due to unknown error." } Success case (HTTP Response Code 200) { "requestId": "ed4acda5-034f-9f42-bba1-f29aea6d7d8f", "timestamp": 1578090903599 }
Lidar com respostas de erro

Em todos os casos de erro, o servidor Amazon Data Firehose tenta novamente a entrega do mesmo lote de registros usando um algoritmo de recuo exponencial. As novas tentativas são recuadas usando um tempo de recuo inicial (1 segundo) com um fator de instabilidade de (15%) e cada nova tentativa subsequente é recuada usando a fórmula (initial-backoff-time * (multiplicador (2) ^ retry_count)) com variação adicional. O tempo de recuo é limitado por um intervalo máximo de 2 minutos. Por exemplo, na 'n'-ésima repetição, o tempo de recuo é = MAX (120, 2^n) * aleatório (0,85, 1,15).

Os parâmetros especificados na equação anterior estão sujeitos a alterações. Consulte a documentação do AWS Firehose para ver o tempo exato de recuo inicial, o tempo máximo de recuo, o multiplicador e as porcentagens de instabilidade usadas no algoritmo de recuo exponencial.

Em cada nova tentativa subsequente, a chave de acesso e/ou o destino para o qual os registros são entregues podem mudar com base na configuração atualizada do stream do Firehose. O serviço Amazon Data Firehose usa o mesmo ID de solicitação em todas as novas tentativas da melhor maneira possível. Esse último recurso pode ser usado para fins de desduplicação pelo servidor do ponto HTTP final. Se a solicitação ainda não for entregue após o tempo máximo permitido (com base na configuração do stream do Firehose), o lote de registros poderá, opcionalmente, ser entregue a um bucket de erros com base na configuração do stream.

Exemplos

Exemplo de uma solicitação CWLog originada.

{ "requestId": "ed4acda5-034f-9f42-bba1-f29aea6d7d8f", "timestamp": 1578090901599, "records": [ { "data": { "messageType": "DATA_MESSAGE", "owner": "123456789012", "logGroup": "log_group_name", "logStream": "log_stream_name", "subscriptionFilters": [ "subscription_filter_name" ], "logEvents": [ { "id": "0123456789012345678901234567890123456789012345", "timestamp": 1510109208016, "message": "log message 1" }, { "id": "0123456789012345678901234567890123456789012345", "timestamp": 1510109208017, "message": "log message 2" } ] } } ] }