📜  AWS Lambda –基于事件在S3之间复制对象

📅  最后修改于: 2021-04-17 03:41:37             🧑  作者: Mango

在本文中,我们将使AWS Lambda函数将文件从一个s3存储桶复制到另一个s3存储桶。当在源存储桶中接收到文件时,lambda函数将被触发。我们将利用Amazon S3活动。上传到源存储桶中的每个文件都是一个事件,这需要触发Lambda函数,然后Lambda函数可以处理该文件并将其复制到目标存储桶中。

下面给出了配置Lambda函数的步骤:

  • 从草稿模板中选择作者。在此,我们需要从头开始编写代码。

  • 提供函数名称
  • 选择运行时。 AWS提供了几种运行时,例如Java, Python,NodeJS,Ruby等。

  • 选择执行角色。执行角色是提供给Lambda 函数的权限。

注意: Lambda必须有权访问S3源桶和目标桶。因此,创建一个附加了AmazonS3FullAccess策略的IAM角色。在这种情况下,s3tos3具有对s3存储桶的完全访问权限。

创建函数,我们需要添加一个触发器来调用lambda函数。添加触发器的步骤如下。

  1. 在“选择触发器”中,选择“ S3”。有许多AWS服务可以充当触发器。由于本文的重点是将对象从一个存储桶移动到另一个存储桶,因此我们选择S3。
  2. 在存储桶中,选择源存储桶。该存储桶将充当触发器。我们将指定与此存储桶关联的事件类型,该事件类型将进一步调用我们的lambda函数。
  3. 选择“事件类型”作为“所有对象创建事件” 。所有对象创建事件都包括放置,复制,发布和分段上传。这些动作中的任何一个都会调用我们的lambda函数。在我们的例子中,当我们将文件上传到源存储桶时,事件类型为PUT。
  4. 前缀后缀是可选的。前缀和后缀用于将文件名与预定义的前缀和后缀进行匹配。

设置Lambda S3触发器最引人注目的是,无论何时上传文件,它都会触发我们的函数。我们利用事件对象来收集所有必需的信息。

示例事件对象如下所示。该对象将传递给我们的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"
        }
      }
    }
  ]
}

您的Lambda函数利用此事件字典来确定文件上载的位置。 Lambda代码如下:

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

注意:编写代码后,请不要忘记单击“部署”。

现在,当我们在源存储桶‘gfg-source-bucket’中上传文件时,这将触发‘s3Tos3-demo’lambda函数,该函数会将上传的文件复制到目标存储桶‘gfg-destination-bucket ‘中。图像显示如下:

在源存储桶中上传的文件

文件复制到目标存储桶

目的地铲斗

还可以通过在lambda函数单击“监视”选项卡,然后在Cloudwatch中单击“查看日志”来验证结果

CloudWatch日志