Ir para o conteúdo

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

4 minuto de leitura
0

Quero utilizar uma função do AWS Lambda para copiar arquivos de um bucket do Amazon Simple Storage Service (Amazon S3) para um 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.

Criar buckets do S3 de origem e destino

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

Conclua as seguintes etapas:

  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. Selecione Criar bucket.
  5. 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

Conclua as seguintes etapas:

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

  2. Selecione Criar função, e em seguida, 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.13.

  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 boto3
    import 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. É possível armazenar o nome do destination_bucket como uma variável de ambiente.

  8. Selecione Implantar.

O Lambda criará um perfil de execução que concede à função a permissão para carregar 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

Conclua as seguintes etapas:

  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 obter 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

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

{
    "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 recurso ARN pelo valor de prefixo necessário para o seu ambiente a fim de limitar as permissões.
  • É recomendado conceder permissões de privilégios mínimos para realizar uma tarefa.
  • Para copiar objetos que tenham tags de objeto, o perfil de execução deverá ter as permissões s3:GetObjectTagging e s3:PutObjectTagging. É preciso ter a permissão s3:GetObjectTagging para o objeto de origem presente no próprio bucket de origem, e a permissão s3:PutObjectTagging para objetos presentes no bucket de destino.

Para mais informações, consulte Como conceder acesso à função do Lambda para serviços da AWS.

Informações relacionadas

Como soluciono erros 403 Access Denied do Amazon S3?

Como faço para permitir que minha função do Lambda acesse meu bucket do Amazon S3?

AWS OFICIALAtualizada há um ano