¿Cómo puedo usar una función de Lambda para copiar archivos de un bucket de Amazon S3 a otro?

4 minutos de lectura
0

Quiero usar una función de AWS Lambda para copiar archivos de un bucket de Amazon Simple Storage Service (Amazon S3) a otro bucket.

Solución

Siga estos pasos para crear una función de Lambda que copie archivos de un bucket de Amazon S3 de origen a otro bucket de S3 de destino.

Creación de buckets de Amazon S3 de origen y destino

Nota: Si ya ha creado los buckets de S3 de origen y destino, omita este paso.

Siga estos pasos:

  1. Abra la consola de Amazon S3.
  2. Elija Crear bucket.
  3. En Nombre del bucket, introduzca un nombre para el bucket de origen.
  4. En la lista desplegable Región de AWS, elija su región de AWS.
  5. Elija Crear bucket.
  6. Repita los pasos 1 a 4 para su bucket de destino.

Para obtener más información, consulte Crear un bucket.

Creación de la función de Lambda

Siga estos pasos:

  1. Abra la página Funciones en la consola de Lambda.

  2. Seleccione Crear una función y, a continuación, elija Crear desde cero.

  3. En Nombre de la función, introduzca un nombre para la función.

  4. En la lista desplegable Tiempo de ejecución, elija Python 3.11.

  5. Expanda Cambiar el rol de ejecución predeterminado y, a continuación, elija Create a new role with basic permissions.

  6. Elija Crear una función.

  7. Seleccione la pestaña Código y, a continuación, pegue el siguiente código de Python:

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

    Nota: Busque el nombre source_bucket en el objeto de evento que recibe la función de Lambda. Puede almacenar el nombre destination_bucket como variable de entorno.

  8. Elija Desplegar.

Lambda crea un rol de ejecución que conceda permiso a la función para cargar registros en Amazon CloudWatch. Para obtener más información, consulte Create a Lambda function with the console.

Creación de un desencadenador de Amazon S3 para la función de Lambda

Siga estos pasos:

  1. Abra la página Funciones en la consola de Lambda.
  2. En Funciones, elija la función de Lambda.
  3. En Información general de la función, seleccione Agregar desencadenador.
  4. En la lista desplegable Configuración del desencadenador, elija S3.
  5. En Bucket, introduzca el nombre de su bucket de origen.
  6. En la lista desplegable Tipo de evento, elija Todos los eventos de creación de objetos.
    Nota: Configure este paso de modo que se utilice el tipo de evento POST, PUT o Carga multiparte para cargar el objeto.
  7. Seleccione el contrato I acknowledge that using the same S3 bucket for both input and output is not recommended y, a continuación, elija Agregar.

Para obtener más información, consulte Tutorial: Using an Amazon S3 trigger to invoke a Lambda function.

Concesión de permisos de IAM para el rol de ejecución de la función de Lambda

Para copiar archivos al bucket S3 de destino, añada los permisos de AWS Identity and Access Management (IAM) para el rol de ejecución de la función de Lambda. Utilice una política similar a la siguiente política basada en 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/*"
      ]
    }
  ]
}

Nota:

  • Sustituya destination-s3-bucket por su bucket de destino de S3 y source-s3-bucket por su bucket de origen de S3.
  • Sustituya /* al final del ARN del recurso por el valor de prefijo necesario para que su entorno limite los permisos.
  • Se recomienda conceder permisos de privilegios mínimos para realizar una tarea.
  • Para copiar objetos con etiquetas de objeto, el rol de ejecución debe tener los permisos s3:GetObjectTagging y s3:PutObjectTagging. Debe tener el permiso s3:GetObjectTagging para el objeto de origen en el bucket de origen y el permiso s3:PutObjectTagging para los objetos del bucket de destino.

Para obtener más información, consulte Granting function access to AWS services.

Información relacionada

¿Cómo puedo solucionar los errores 403 de acceso denegado de Amazon S3?

¿Cómo permito que mi función de Lambda acceda a mi bucket de Amazon S3?

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 6 meses