Comprenda las especificaciones de solicitud y respuesta de entrega de HTTP terminales - Amazon Data Firehose

La entrega de transmisiones de Amazon Data Firehose a Apache Iceberg Tables en Amazon S3 está en versión preliminar y está sujeta a cambios.

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Comprenda las especificaciones de solicitud y respuesta de entrega de HTTP terminales

Para que Amazon Data Firehose pueda entregar datos correctamente a puntos de HTTP enlace personalizados, estos puntos de enlace deben aceptar solicitudes y enviar respuestas utilizando determinados formatos de solicitud y respuesta de Amazon Data Firehose. En esta sección se describen las especificaciones de formato de las HTTP solicitudes que el servicio Amazon Data Firehose envía a HTTP puntos de enlace personalizados, así como las especificaciones de formato de HTTP las respuestas que espera el servicio Amazon Data Firehose. HTTPlos puntos de conexión disponen de 3 minutos para responder a una solicitud antes de que Amazon Data Firehose agote el tiempo de espera para esa solicitud. Amazon Data Firehose trata las respuestas que no siguen el formato adecuado como errores de entrega.

Formato de solicitudes

Ruta y parámetros URL

Usted los configura directamente como parte de un único URL campo. Amazon Data Firehose los envía tal y como están configurados sin modificarlos. Solo se admiten los destinos HTTPS. URLlas restricciones se aplican durante la configuración del flujo de entrega.

nota

Actualmente, solo se admite el puerto 443 para la entrega de datos de HTTP punto final.

HTTPEncabezados: versión X-Amz-Firehose Protocol

Este encabezado se usa para indicar la versión de los formatos de solicitudes o respuestas. Actualmente, la única versión es la 1.0.

HTTPEncabezados - X-Amz-Firehose-Request-Id

El valor de este encabezado es opaco y se puede utilizar con fines de depuración y GUID deduplicación. Si es posible, las implementaciones de puntos de conexión deben registrar el valor de este encabezado, tanto para las solicitudes que son correctas como para las que no lo son. El ID de solicitud se mantiene igual durante varios intentos de la misma solicitud.

HTTPEncabezados: tipo de contenido

El valor del encabezado Content-Type es siempre application/json.

HTTPEncabezados: codificación de contenido

Se puede configurar una transmisión Firehose para que se utilice GZIP para comprimir el cuerpo al enviar solicitudes. Cuando esta compresión está habilitada, el valor del encabezado Content-Encoding se establece en gzip, según la práctica habitual. Si la compresión no está habilitada, el encabezado Content-Encoding no aparece.

HTTPEncabezados: longitud del contenido

Se usa de forma estándar.

HTTPEncabezados: X-Amz-Firehose-Source-Arn:

El flujo ARN de Firehose representado en formato de ASCII cadena. ARNCodifica la región, el identificador de la AWS cuenta y el nombre de la transmisión. Por ejemplo, arn:aws:firehose:us-east-1:123456789:deliverystream/testStream.

HTTPCabeceras - X-Amz-Firehose-Access-Key

Este encabezado contiene una clave u otras credenciales. API Puedes crear o actualizar la API clave (también conocida como token de autorización) al crear o actualizar tu flujo de entrega. Amazon Data Firehose restringe el tamaño de la clave de acceso a 4096 bytes. Amazon Data Firehose no intenta interpretar esta clave de ninguna manera. La clave configurada se copia palabra por palabra en el valor de este encabezado.

El contenido puede ser arbitrario y puede representar un JWT token o un ACCESS _KEY. Si un punto final requiere credenciales de varios campos (por ejemplo, nombre de usuario y contraseña), los valores de todos los campos deben almacenarse juntos en una única clave de acceso en un formato que el punto final comprenda (JSONo). CSV Este campo puede codificarse en base64 si el contenido original es binario. Amazon Data Firehose no modifica ni codifica el valor configurado y utiliza el contenido tal cual.

HTTPEncabezados - X-Amz-Firehose-Common-Attributes

Este encabezado contiene los atributos comunes (metadatos) que pertenecen a toda la solicitud o a todos los registros de la solicitud. Tú los configuras directamente al crear una transmisión de Firehose. El valor de este atributo está codificado como un JSON objeto con el siguiente 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

A continuación se muestra un ejemplo:

"commonAttributes": { "deployment -context": "pre-prod-gamma", "device-types": "" }
Cuerpo: tamaño máximo

Configura el tamaño máximo del cuerpo, que puede ser de hasta 64 MiB antes de la compresión.

Cuerpo: esquema

El cuerpo contiene un único JSON documento con el siguiente JSON esquema (escrito enYAML):

"$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

A continuación se muestra un ejemplo:

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

Formato de respuesta

Comportamiento predeterminado en caso de error

Si una respuesta no cumple con los requisitos que se indican a continuación, el servidor Firehose la tratará como si tuviera un código de estado 500 sin cuerpo.

Código de estado

El código HTTP de estado MUST debe estar en el rango 2XX, 4XX o 5XX.

El servidor Amazon Data Firehose NOT sigue las redirecciones (códigos de estado 3XX). Solo el código de respuesta 200 se considera una entrega correcta de los registros a /EP. HTTP El código de respuesta 413 (tamaño excedido) se considera un error permanente y, si está configurado, el lote de registros no se envía al bucket de errores. Todos los demás códigos de respuesta se consideran errores recuperables y están sujetos a un algoritmo de reintentos de retroceso que se explica más adelante.

Encabezados: tipo de contenido

El único tipo de contenido aceptable es application/json.

HTTPEncabezados: codificación de contenido

Se debe utilizar la codificación de contenido MUSTNOT. Descomprima el cuerpoMUST.

HTTPEncabezados: longitud del contenido

El encabezado Content-Length MUST debe estar presente si la respuesta tiene un cuerpo.

Cuerpo: tamaño máximo

El cuerpo de la respuesta debe tener un tamaño de 1 MiB o menos.

"$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

A continuación se muestra un ejemplo:

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 }
Gestión de las respuestas de errores

En todos los casos de error, el servidor Amazon Data Firehose vuelve a intentar entregar el mismo lote de registros mediante un algoritmo de retroceso exponencial. Los reintentos se retrasan utilizando un tiempo de espera inicial (1 segundo) con un factor de fluctuación del (15%) y cada reintento posterior se retrasa utilizando la fórmula (initial-backoff-time * (multiplier (2) ^ retry_count)) con una fluctuación adicional. El tiempo de retroceso está limitado a un intervalo máximo de 2 minutos. Por ejemplo, en el enésimo reintento, el tiempo de espera es = MAX (120, 2^n) * aleatorio (0,85, 1,15).

Los parámetros especificados en la ecuación anterior están sujetos a cambios. Consulte la documentación de AWS Firehose para conocer el tiempo de retroceso inicial exacto, el tiempo máximo de retroceso y los porcentajes de multiplicador y fluctuación utilizados en el algoritmo de retroceso exponencial.

En cada intento posterior, la clave de acceso o el destino al que se envían los registros pueden cambiar en función de la configuración actualizada de la transmisión Firehose. El servicio Amazon Data Firehose utiliza el mismo identificador de solicitud en todos los reintentos de la mejor manera posible. El servidor de punto final puede utilizar esta última función con fines de deduplicación. HTTP Si la solicitud sigue sin entregarse después del tiempo máximo permitido (según la configuración de la transmisión de Firehose), el lote de registros se puede entregar opcionalmente a un depósito de errores según la configuración de la transmisión.

Ejemplos

Ejemplo de una solicitud 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" } ] } } ] }