

# Uso de una plantilla de AWS CloudFormation para automatizar la configuración de S3 Object Lambda
<a name="olap-using-cfn-template"></a>

**nota**  
A partir del 7 de noviembre de 2025, S3 Object Lambda solo estará disponible para los clientes actuales que utilizan el servicio actualmente, así como para socios seleccionados de la red de socios de AWS (APN). Para obtener más información sobre capacidades similares a las de S3 Object Lambda, haga clic aquí: [Cambio de disponibilidad de Amazon S3 Object Lambda](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html).

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](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration) 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](olap-create.md).

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](#modifying-lambda-function) y [Escritura de funciones de Lambda para puntos de acceso de S3 Object Lambda](olap-writing-lambda.md). 

## Modificación de la plantilla
<a name="modifying-cfn-template"></a>

**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](access-points-monitoring-logging.md).  
Para obtener información sobre los precios, consulte [Precios de CloudWatch](https://aws.amazon.com/cloudwatch/pricing/). 

**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](https://docs.aws.amazon.com/lambda/latest/dg/provisioned-concurrency.html) en la *Guía para desarrolladores de AWS Lambda*.  
Para obtener más información sobre precios, consulta [precios de AWS Lambda](https://aws.amazon.com/lambda/pricing/).

## Modificación de la función de Lambda
<a name="modifying-lambda-function"></a>

**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 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax](https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax) 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 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax](https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax) 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 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax](https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax) 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 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax](https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax) 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](range-get-olap.md).

**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](olap-writing-lambda.md#olap-getobject-response).