Uso de una plantilla de AWS CloudFormation para automatizar la configuración de S3 Object Lambda - Amazon Simple Storage Service

Uso de una plantilla de AWS CloudFormation para automatizar la configuración de S3 Object Lambda

Puede utilizar una plantilla de AWS CloudFormation para crear rápidamente un punto de acceso de Amazon S3 Object Lambda. La plantilla de CloudFormation crea automáticamente recursos relevantes, configura roles de AWS Identity and Access Management (IAM) y define una función de AWS Lambda que gestiona de manera automática las solicitudes a través del punto de acceso Object Lambda. Con la plantilla de CloudFormation, puede implementar prácticas recomendadas, mejorar su posición de seguridad y reducir los errores causados por los procesos manuales.

Este repositorio GitHub contiene la plantilla de CloudFormation y código fuente de la función de Lambda. Para obtener instrucciones sobre cómo utilizar la plantilla, consulte Creación de puntos de acceso Object Lambda.

La función de Lambda proporcionada en la plantilla no ejecuta ninguna transformación. En su lugar, devuelve los objetos tal como están desde el origen de datos subyacente. Puede clonar la función y agregar su propio código de transformación para modificar y procesar los datos a medida que se devuelven a una aplicación. Para obtener más información sobre cómo modificar una función, consulte Modificación de la función de Lambda y Escritura de funciones de Lambda para puntos de acceso de S3 Object Lambda.

Modificación de la plantilla

Creación de un nuevo punto de acceso de soporte

S3 Object Lambda utiliza dos puntos de acceso: uno Object Lambda y otro S3 estándar, al que se denomina punto de acceso de apoyo. Cuando usted realiza una solicitud a un punto de acceso de Object Lambda, S3 invoca Lambda en su nombre o delega la solicitud al punto de acceso de soporte, según la configuración de S3 Object Lambda. Puede crear un nuevo punto de acceso de soporte pasando el siguiente parámetro como parte del comando aws cloudformation deploy al implementar la plantilla.

CreateNewSupportingAccessPoint=true
Configuración de una carga de funciones

Puede configurar una carga para proporcionar datos complementarios a la función de Lambda pasando el siguiente parámetro como parte del comando aws cloudformation deploy al implementar la plantilla.

LambdaFunctionPayload="format=json"
Habilitación del monitoreo de Amazon CloudWatch

Puede habilitar el monitoreo de CloudWatch pasando el siguiente parámetro como parte del comando aws cloudformation deploy al implementar la plantilla.

EnableCloudWatchMonitoring=true

Este parámetro habilita el punto de acceso de Object Lambda para las métricas de solicitudes de Amazon S3 y crea dos alarmas de CloudWatch para supervisar los errores del lado del cliente y del servidor.

nota

El uso de Amazon CloudWatch generará costos adicionales. Para obtener más información acerca de las métricas de CloudWatch para Amazon S3, consulte Monitorización y registro de puntos de acceso.

Para obtener información sobre los precios, consulte Precios de CloudWatch.

Configuración de simultaneidad aprovisionada

Para reducir la latencia, puede configurar la simultaneidad aprovisionada para la función de Lambda que respalda el punto de acceso de Object Lambda editando la plantilla para incluir las siguientes líneas en Resources.

LambdaFunctionVersion: Type: AWS::Lambda::Version Properties: FunctionName: !Ref LambdaFunction ProvisionedConcurrencyConfig: ProvisionedConcurrentExecutions: Integer
nota

Se aplicarán cargos adicionales por la simultaneidad aprovisionada. Para obtener más información sobre la periodicidad aprovisionada, consulte Administración de la simultaneidad aprovisionada de Lambda en la Guía para desarrolladores de AWS Lambda.

Para obtener más información sobre precios, consulta precios de AWS Lambda.

Modificación de la función de Lambda

Cambiar los valores del encabezado de una solicitud GetObject

De forma predeterminada, la función de Lambda reenvía todos los encabezados, excepto Content-Length y ETag, de la solicitud URL prefirmada al cliente GetObject. Según el código de transformación de la función de Lambda, puede elegir enviar nuevos valores de encabezado al cliente GetObject.

Puede actualizar la función de Lambda para enviar nuevos valores de encabezado pasándolos a la operación WriteGetObjectResponse de la API.

Por ejemplo, si la función de Lambda traduce el texto de los objetos de Amazon S3 a un idioma diferente, puede pasar un nuevo valor en el encabezado Content-Language. Para ello, modifique la función writeResponse como se indica a continuación.

async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest }, ...headers, ContentLanguage: 'my-new-language' }).promise(); }

Para obtener una lista completa de los encabezados compatibles, consulte WriteGetObjectResponse en la Referencia de la API de Amazon Simple Storage Service.

Devolución de encabezados de metadatos

Puede actualizar la función de Lambda para enviar nuevos valores de encabezado pasándolos a la solicitud de la operación WriteGetObjectResponse de la API.

async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest, 'my-new-header': 'my-new-value' }, ...headers }).promise(); }
Devolución de un nuevo código de estado

Puede devolver un código de estado personalizado al cliente GetObject pasándolo a la solicitud de la operación WriteGetObjectResponse de la API.

async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest }, ...headers, StatusCode: Integer }).promise(); }

Para obtener una lista completa de los códigos de estado compatibles, consulte WriteGetObjectResponse en la Referencia de la API de Amazon Simple Storage Service.

Aplicación de Range y partNumber al objeto de origen

De forma predeterminada, el punto de acceso de Object Lambda creado por la plantilla de CloudFormation puede gestionar parámetros Range y partNumber. La función de Lambda aplica el rango o el número de parte solicitado al objeto transformado. Para ello, la función debe descargar todo el objeto y ejecutar la transformación. En algunos casos, los rangos de objetos transformados pueden asignarse exactamente a los rangos de objetos de origen. Esto significa que solicitar un rango de bytes A-B en el objeto de origen y ejecutar la transformación puede producir el mismo resultado que solicitar todo el objeto, ejecutar la transformación y devolver el rango de bytes A-B en el objeto transformado.

En estos casos, puede cambiar la implementación de la función de Lambda para aplicar el rango o el número de parte directamente al objeto de origen. Este método reduce la latencia general de la función y la memoria requerida. Para obtener más información, consulte Trabajar con encabezados Range y partNumber.

Deshabilitación de Range y gestión de partNumber

De forma predeterminada, el punto de acceso de Object Lambda creado por la plantilla de CloudFormation puede gestionar parámetros Range y partNumber. Si no necesita este comportamiento, puede desactivarlo eliminando las siguientes líneas de la plantilla:

AllowedFeatures: - GetObject-Range - GetObject-PartNumber - HeadObject-Range - HeadObject-PartNumber
Transformación de objetos grandes

De forma predeterminada, la función de Lambda procesa todo el objeto en la memoria antes de que pueda comenzar a transmitir la respuesta a S3 Object Lambda. Puede modificar la función para transmitir la respuesta a medida que realiza la transformación. Hacer esto ayuda a reducir la latencia de transformación y el tamaño de la memoria de la función de Lambda. Para ver un ejemplo de implementación, consulte el Ejemplo de contenido comprimido de streaming.