Saltar al contenido

¿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

Sigue 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 S3 de origen y destino

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

Sigue estos pasos:

  1. Abre la consola de Amazon S3.
  2. Elige Crear bucket.
  3. En Nombre del bucket, introduce un nombre para el bucket de origen.
  4. Elige Crear bucket.
  5. Repite los pasos 1 a 4 para tu bucket de destino.

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

Creación de la función de Lambda

Sigue estos pasos:

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

  2. Selecciona Crear una función y, a continuación, elige Crear desde cero.

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

  4. En la lista desplegable Versión ejecutable, elige Python 3.13.

  5. Expande Cambiar el rol de ejecución predeterminado y, a continuación, elige Crear un nuevo rol con permisos básicos.

  6. Elige Crear una función.

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

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

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

  8. Selecciona Desplegar.

Lambda crea un rol de ejecución que otorga a la función permiso para cargar registros en Amazon CloudWatch. Para obtener más información, consulta Creación de una función de Lambda con la consola.

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

Sigue estos pasos:

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

Para obtener más información, consulta Tutorial: Uso de un desencadenador de Amazon S3 para invocar una función de Lambda.

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

Para copiar archivos al bucket de S3 de destino, agrega los permisos de AWS Identity and Access Management (IAM) para el rol de ejecución de la función de Lambda. Utiliza una política basada en recursos similar a la siguiente:

{
    "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:

  • Sustituye destination-s3-bucket por tu bucket de destino de S3 y source-s3-bucket por tu bucket de origen de S3.
  • Sustituye /* al final del ARN del recurso por el valor de prefijo necesario para que tu 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. Debes 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, consulta Concesión de acceso a la función de Lambda a servicios de AWS.

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 AWSActualizada hace 10 meses