Automatizar a configuração do S3 Object Lambda com um modelo do CloudFormation - Amazon Simple Storage Service

Automatizar a configuração do S3 Object Lambda com um modelo do CloudFormation

Você pode usar um modelo do AWS CloudFormation para criar rapidamente um ponto de acesso do Amazon S3 Object Lambda. O modelo do CloudFormation cria automaticamente recursos relevantes, configura perfis do AWS Identity and Access Management (IAM) e configura uma função do AWS Lambda que lida automaticamente com solicitações por meio do ponto de acesso do Object Lambda. Com o modelo do CloudFormation, é possível implementar práticas recomendadas, melhorar seu procedimento de segurança e reduzir erros causados por processos manuais.

Esse repositório GitHub contém o modelo do CloudFormation e o código-fonte da função do Lambda. Para obter instruções sobre como usar o modelo, consulte Criar pontos de acesso do Object Lambda.

A função do Lambda fornecida no modelo não executa nenhuma transformação. Em vez disso, ele retorna seus objetos na condição em que estão do bucket do S3. Você pode clonar a função e adicionar seu próprio código de transformação para modificar e processar dados à medida que eles são retornados a uma aplicação. Para obter mais informações sobre como modificar a função, consulte Modificar a função Lambda e Escrever funções do Lambda para pontos de acesso do S3 Object Lambda.

Modificar o template

Criar um ponto de acesso de suporte

O S3 Object Lambda usa dois pontos de acesso: um ponto de acesso do Object Lambda e um ponto de acesso padrão do S3, chamado de ponto de acesso de suporte. Quando você faz uma solicitação a um ponto de acesso do Object Lambda, o S3 chama o Lambda em seu nome ou delega a solicitação ao ponto de acesso de suporte, de acordo com a configuração do S3 Object Lambda. É possível criar um ponto de acesso de suporte transmitindo o seguinte parâmetro como parte do comando aws cloudformation deploy ao implantar o modelo.

CreateNewSupportingAccessPoint=true
Configurar uma carga útil de função

Você pode configurar uma carga útil para fornecer dados complementares à função Lambda transmitindo o seguinte parâmetro como parte do comando aws cloudformation deploy ao implantar o template.

LambdaFunctionPayload="format=json"
Habilitar o monitoramento do Amazon CloudWatch

Você pode habilitar o monitoramento do CloudWatch transmitindo o seguinte parâmetro como parte do comando aws cloudformation deploy ao implantar o template.

EnableCloudWatchMonitoring=true

Esse parâmetro habilita o ponto de acesso do Object Lambda para métricas de solicitação do Amazon S3 e cria dois alarmes do CloudWatch para monitorar erros no lado do cliente e no lado do servidor.

nota

O uso do Amazon CloudWatch incorrerá em custos adicionais. Para obter mais informações sobre métricas de solicitação do Amazon S3, consulte Monitorar e registrar de pontos de acesso.

Para obter detalhes sobre os preços, consulte Definição de preço do CloudWatch.

Configurar a simultaneidade provisionada

Para reduzir a latência, é possível configurar a simultaneidade provisionada para a função do Lambda com base no ponto de acesso do Object Lambda editando o modelo para incluir as seguintes linhas em Resources.

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

Haverá cobranças adicionais pela simultaneidade de provisionamento. Para obter mais informações sobre simultaneidade provisionada, consulte Gerenciar a simultaneidade provisionada do Lambda no Guia do desenvolvedor do AWS Lambda.

Para obter detalhes de preço, consulte Definição de preço do AWS Lambda.

Modificar a função Lambda

Alterar os valores do cabeçalho de uma solicitação GetObject

Por padrão, a função do Lambda encaminha todos os cabeçalhos, exceto Content-Length e ETag, da solicitação de URL pré-assinado ao cliente do GetObject. Com base em seu código de transformação na função Lambda, é possível escolher enviar novos valores de cabeçalho ao cliente do GetObject.

Você pode atualizar sua função do Lambda para enviar novos valores de cabeçalho, transmitindo-os na operação de API WriteGetObjectResponse.

Por exemplo, se a função Lambda traduzir texto em objetos do Amazon S3 para um idioma diferente, você poderá transmitir um novo valor no cabeçalho Content-Language. Faça isso modificando a função writeResponse, conforme mostrado abaixo:

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 obter uma lista completa dos cabeçalhos compatíveis, consulte WriteGetObjectResponse na Referência da API do Amazon Simple Storage Service.

Retornar cabeçalhos de metadados

Você pode atualizar sua função do Lambda para enviar novos valores de cabeçalho, transmitindo-os na solicitação de operação de API WriteGetObjectResponse.

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(); }
Retornar um novo código de status

É possível retornar um código de status personalizado ao cliente do GetObject transmitindo-o na solicitação de operação de API WriteGetObjectResponse.

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 obter uma lista completa dos códigos de status compatíveis, consulte WriteGetObjectResponse na Referência da API do Amazon Simple Storage Service.

Aplicar os parâmetros Range e partNumber no objeto de origem

Por padrão, o ponto de acesso do Object Lambda criado pelo modelo do CloudFormation pode lidar com os parâmetros Range e partNumber. A função Lambda aplica o intervalo ou o número da parte solicitado ao objeto transformado. Para isso, a função precisa baixar o objeto inteiro e executar a transformação. Em alguns casos, os intervalos de objetos transformados podem mapear exatamente para seus intervalos de objetos de origem. Isso significa que solicitar o intervalo de bytes A–B no objeto de origem e executar a transformação poderá produzir o mesmo resultado que solicitar o objeto inteiro, executar a transformação e retornar o intervalo de bytes A–B no objeto transformado.

Nesses casos, é possível alterar a implementação da função Lambda para aplicar o intervalo ou o número da parte diretamente no objeto de origem. Essa abordagem reduz a latência geral da função e a memória necessárias. Para ter mais informações, consulte Trabalhar com cabeçalhos Range e partNumber.

Desabilitar o tratamento de Range e partNumber

Por padrão, o ponto de acesso do Object Lambda criado pelo modelo do CloudFormation pode lidar com os parâmetros Range e partNumber. Se você não precisar desse comportamento, poderá desabilitá-lo removendo as seguintes linhas do modelo:

AllowedFeatures: - GetObject-Range - GetObject-PartNumber - HeadObject-Range - HeadObject-PartNumber
Transformar objetos grandes

Por padrão, a função Lambda processa todo o objeto na memória antes que ele possa começar a transmitir a resposta ao S3 Object Lambda. É possível modificar a função para transmitir a resposta à medida que ela executa a transformação. Isso ajuda a reduzir a latência de transformação e o tamanho da memória da função do Lambda. Para obter um exemplo de implementação, consulte o Exemplo de conteúdo compactado de transmissão.