Como usar uma função do Lambda para copiar arquivos de um bucket do Amazon S3 para outro?

4 minuto de leitura
0

Quero usar uma função do AWS Lambda para copiar arquivos de um bucket do Amazon Simple Storage Service (Amazon S3) para outro bucket.

Resolução

Siga estas etapas para criar uma função do Lambda que copie arquivos de um bucket de origem do Amazon S3 para um bucket de destino do S3.

Crie os buckets de origem e destino do Amazon S3

Observação: ignore esta etapa caso já tenha criado os buckets de origem e destino do S3.

Realize as etapas a seguir:

  1. Abra o console do Amazon S3.
  2. Selecione Criar bucket.
  3. Em Nome do bucket, insira um nome para o bucket de origem.
  4. Na lista suspensa Região da AWS, selecione sua região da AWS.
  5. Selecione Criar bucket.
  6. Repita as etapas de 1 a 4 para seu bucket de destino.

Para mais informações, consulte Criação de um bucket.

Crie a função do Lambda

Realize as etapas a seguir:

  1. Abra a página Funções no console do Lambda.

  2. Selecione Criar função e, depois, selecione Criar do zero.

  3. Em Nome da função, insira um nome para sua função.

  4. Na lista suspensa Runtime, selecione Python 3.11.

  5. Expanda Alterar perfil de execução padrão e, em seguida, selecione Criar um novo perfil com permissões básicas.

  6. Selecione Criar função.

  7. Selecione a guia Código e, depois, cole o código Python a seguir:

    import boto3import botocore
    import json
    import os
    import logging
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    
    s3 = boto3.resource('s3')
    
    def lambda_handler(event, context):
        logger.info("New files uploaded to the source bucket.")
    
        key = event['Records'][0]['s3']['object']['key']
    
        source_bucket = event['Records'][0]['s3']['bucket']['name']
        destination_bucket = os.environ['destination_bucket']
    
        source = {'Bucket': source_bucket, 'Key': key}
    
        try:
            response = s3.meta.client.copy(source, destination_bucket, key)
            logger.info("File copied to the destination bucket successfully!")
    
        except botocore.exceptions.ClientError as error:
            logger.error("There was an error copying the file to the destination bucket")
            print('Error Message: {}'.format(error))
    
        except botocore.exceptions.ParamValidationError as error:
            logger.error("Missing required parameters while calling the API.")
            print('Error Message: {}'.format(error))

    Observação: encontre o nome de source_bucket a partir do objeto de evento recebido pela função do Lambda. Você pode armazenar o nome de destination_bucket como uma variável de ambiente.

  8. Selecione Implantar.

O Lambda criará um perfil de execução que concede à função permissão para fazer upload de logs para o Amazon CloudWatch. Para mais informações, consulte Create a Lambda function with the console.

Crie um gatilho do Amazon S3 para a função do Lambda

Realize as etapas a seguir:

  1. Abra a página Funções no console do Lambda.
  2. Em Funções, selecione a função do Lambda.
  3. Em Visão geral da função, selecione Adicionar gatilho.
  4. Na lista suspensa Configuração do gatilho, selecione S3.
  5. Em Bucket, insira o nome do seu bucket de origem.
  6. Na lista suspensa Tipo de evento, selecione Todos os eventos de criação de objetos.
    Observação: configure essa etapa para usar o tipo de evento POST, PUT ou multipart upload para carregar o objeto.
  7. Selecione o acordo Eu reconheço que usar o mesmo bucket do S3 para entrada e saída não é recomendado e, em seguida, selecione Adicionar.

Para mais informações, consulte Tutorial: using an Amazon S3 trigger to invoke a Lambda function.

Forneça permissões do IAM para o perfil de execução da função do Lambda

Para copiar arquivos para o bucket de destino do S3, adicione permissões do AWS Identity and Access Management (IAM) para o perfil de execução da função do Lambda. Use uma política similar à seguinte política baseada em recursos:

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "putObject",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::destination-s3-bucket/*"
      ]
    },
    {
      "Sid": "getObject",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::source-s3-bucket/*"
      ]
    }
  ]
}

Observação:

  • substitua destination-s3-bucket pelo bucket de destino do S3 e source-s3-bucket pelo bucket de origem do S3.
  • Substitua /* no final do ARN do recurso pelo valor de prefixo necessário para seu ambiente para limitar as permissões.
  • É uma prática recomendada conceder permissões de privilégios mínimos para a realização de tarefas.
  • Para copiar objetos que tenham tags de objeto, o perfil de execução deve ter as permissões s3:GetObjectTagging e s3:PutObjectTagging. É preciso ter a permissão s3:GetObjectTagging para o objeto de origem no bucket de origem e a permissão s3:PutObjectTagging para objetos no bucket de destino.

Para mais informações, consulte Granting function access to AWS services.

Informações relacionadas

Como solucionar erros 403 Acesso Negado do Amazon S3?

Como permitir que meu perfil de execução do Lambda acesse meu bucket do Amazon S3?

AWS OFICIAL
AWS OFICIALAtualizada há 6 meses