AWS Lambda: copia de objetos entre S3 en función de eventos

En este artículo, haremos que AWS Lambda funcione para copiar archivos de un depósito s3 a otro depósito s3. La función lambda se activará al recibir el archivo en el depósito de origen. Haremos uso de Amazon S3 Events. Cada archivo que se cargue en el depósito de origen será un evento, esto debe activar una función Lambda que luego puede procesar este archivo y copiarlo en el depósito de destino.

Los pasos para configurar la función Lambda se dan a continuación:

  • Seleccione la plantilla Autor desde cero . En esto, necesitamos escribir el código desde cero.

  • Proporcione el nombre de la función .
  • Seleccione Tiempo de ejecución . Hay varios tiempos de ejecución proporcionados por AWS, como Java, Python, NodeJS, Ruby, etc.

  • Seleccione el rol de ejecución . Los roles de ejecución son permisos proporcionados a la función Lambda.

Nota: Lambda debe tener acceso a los depósitos de origen y destino de S3. Por lo tanto, cree un rol de IAM que tenga una política de AmazonS3FullAccess adjunta. En este caso, s3tos3 tiene acceso total a los depósitos de s3.

Una vez que se crea la función, debemos agregar un disparador que invoque la función lambda. Los pasos para agregar un disparador se dan a continuación.

  1. En Seleccionar disparador , seleccione S3. Existen numerosos servicios de AWS que pueden actuar como disparadores. Dado que este artículo se centra en mover objetos de un cubo a otro, elegimos S3.
  2. En Cubo, seleccione el cubo de origen. Este cubo actuará como un disparador. Especificaremos el tipo de evento asociado con este depósito que invocará aún más nuestra función lambda.
  3. Seleccione Tipo de evento como Todos los eventos de creación de objetos . Todos los eventos de creación de objetos incluyen poner, copiar, publicar y cargar varias partes. Cualquiera de las acciones invocará nuestra función lambda. En nuestro caso, cuando cargamos un archivo en el depósito de origen, el tipo de evento es PUT.
  4. El prefijo y el sufijo son opcionales. El prefijo y el sufijo se utilizan para hacer coincidir los nombres de archivo con prefijos y sufijos predefinidos.

Lo más destacable de configurar el disparador de Lambda S3 es que cada vez que se carga un archivo, activará nuestra función. Hacemos uso del objeto de evento para recopilar toda la información requerida.

El objeto de evento de muestra se muestra a continuación. Este objeto se pasa a nuestra función Lambda.

{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventSource": "aws:s3",
      "awsRegion": "ap-south-1",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "GeeksforGeeks"
      },
      "requestParameters": {
        "sourceIPAddress": "XXX.X.X.X"
      },
      "responseElements": {
        "x-amz-request-id": "EXAMPLE123456789",
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "testConfigRule",
        "bucket": {
          "name": "gfg-source-bucket",
          "ownerIdentity": {
            "principalId": "GeeksforGeeks"
          },
          "arn": "arn:aws:s3:::gfg-source-bucket"
        },
        "object": {
          "key": "geeksforgeeks.txt",
          "size": 1024,
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901"
        }
      }
    }
  ]
}

Su función de Lambda utiliza este diccionario de eventos para identificar la ubicación donde se carga el archivo. El código lambda se da a continuación:

import json
import boto3
s3_client=boto3.client('s3')

# lambda function to copy file from 1 s3 to another s3
def lambda_handler(event, context):
    #specify source bucket
    source_bucket_name=event['Records'][0]['s3']['bucket']['name']
    #get object that has been uploaded
    file_name=event['Records'][0]['s3']['object']['key']
    #specify destination bucket
    destination_bucket_name='gfg-destination-bucket'
    #specify from where file needs to be copied
    copy_object={'Bucket':source_bucket_name,'Key':file_name}
    #write copy statement 
    s3_client.copy_object(CopySource=copy_object,Bucket=destination_bucket_name,Key=file_name)

    return {
        'statusCode': 3000,
        'body': json.dumps('File has been Successfully Copied')
    }

Nota: Después de escribir el código, no olvide hacer clic en Implementar. 

Ahora, cuando cargamos un archivo en el depósito de origen ‘gfg-source-bucket’ , esto activará la función lambda ‘s3Tos3-demo’ que copiará el archivo cargado en el depósito de destino ‘gfg-destination-bucket ‘. Las imágenes se han mostrado a continuación:

Archivo subido en Source Bucket

Archivo copiado en el depósito de destino

Cubo de destino

El resultado también se puede verificar haciendo clic en la pestaña Monitoreo en la función lambda y luego haciendo clic en Ver registros en Cloudwatch.

Registros de CloudWatch

Publicación traducida automáticamente

Artículo escrito por rohanchopra96 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *