在本文中,我们将使AWS Lambda函数将文件从一个s3存储桶复制到另一个s3存储桶。当在源存储桶中接收到文件时,lambda函数将被触发。我们将利用Amazon S3活动。上传到源存储桶中的每个文件都是一个事件,这需要触发Lambda函数,然后Lambda函数可以处理该文件并将其复制到目标存储桶中。
下面给出了配置Lambda函数的步骤:
- 从草稿模板中选择作者。在此,我们需要从头开始编写代码。
- 提供函数名称。
- 选择运行时。 AWS提供了几种运行时,例如Java, Python,NodeJS,Ruby等。
- 选择执行角色。执行角色是提供给Lambda 函数的权限。
注意: Lambda必须有权访问S3源桶和目标桶。因此,创建一个附加了AmazonS3FullAccess策略的IAM角色。在这种情况下,s3tos3具有对s3存储桶的完全访问权限。
创建函数,我们需要添加一个触发器来调用lambda函数。添加触发器的步骤如下。
- 在“选择触发器”中,选择“ S3”。有许多AWS服务可以充当触发器。由于本文的重点是将对象从一个存储桶移动到另一个存储桶,因此我们选择S3。
- 在存储桶中,选择源存储桶。该存储桶将充当触发器。我们将指定与此存储桶关联的事件类型,该事件类型将进一步调用我们的lambda函数。
- 选择“事件类型”作为“所有对象创建事件” 。所有对象创建事件都包括放置,复制,发布和分段上传。这些动作中的任何一个都会调用我们的lambda函数。在我们的例子中,当我们将文件上传到源存储桶时,事件类型为PUT。
- 前缀和后缀是可选的。前缀和后缀用于将文件名与预定义的前缀和后缀进行匹配。
设置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中单击“查看日志”来验证结果。