Python 中的 AWS Lambda 将新文件复制到另一个 s3 存储桶
AWS Lambda in Python to copy new files to another s3 bucket
我创建了一个 Lambda,每次我将文件添加到 s3://test-bucket-01/ 时都会触发它,它将 s3://test-bucket-01/ 中的所有文件复制到 s3: //测试桶-02/
我希望它只添加刚刚添加的新文件吗?
当前代码:
import boto3
s3 = boto3.resource('s3')
def lambda_handler(event, context):
bucket = s3.Bucket('test-bucket-01')
dest_bucket = s3.Bucket('tb-bucket-02')
print(bucket)
print(dest_bucket)
for obj in bucket.objects.all():
dest_key = obj.key
print(dest_key)
s3.Object(dest_bucket.name, dest_key).copy_from(CopySource = {'Bucket': obj.bucket_name, 'Key': obj.key})
结果:
Function Logs:
START RequestId: XXXXXXX-XXXXXXX-XXXXXXX Version: $LATEST
s3.Bucket(name='test-bucket-01')
s3.Bucket(name='test-bucket-02')
test-data-01.json
test-data-02.json
test-data-03.json
您不需要列出存储桶来复制所有文件,因为事件变量是一个 json,其中包含您已复制到 test-bucket-01 中的文件。
示例:
{
"Records": [
{
"eventVersion": "2.0",
"eventSource": "aws:s3",
"awsRegion": "us-east-1",
"eventTime": "1970-01-01T00:00:00.000Z",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "EXAMPLE"
},
"requestParameters": {
"sourceIPAddress": "127.0.0.1"
},
"responseElements": {
"x-amz-request-id": "C3D13FE58DE4C810",
"x-amz-id-2": "FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD"
},
"s3": {
"s3SchemaVersion": "1.0",
"configurationId": "testConfigRule",
"bucket": {
"name": "sourcebucket",
"ownerIdentity": {
"principalId": "EXAMPLE"
},
"arn": "arn:aws:s3:::mybucket"
},
"object": {
"key": "key/to/HappyFace.jpg",
"size": 1024,
"eTag": "d41d8cd98f00b204e9800998ecf8427e"
}
}
}
]
}
在这种情况下,此事件通知 ObjectCreated:Put 事件。一个新文件已复制到 "sourcebucket" 键为 "key/to/HappyFace.jpg" 的存储桶。
您为什么不想使用 native functional of AWS S3 将新文件从一个存储桶复制到另一个存储桶?
更简单、更可靠。您可以通过前缀复制文件、更改存储计划以及使用此本机功能的许多其他功能。
那么答案是什么?如何仅在添加新文件时触发lambda?
我创建了一个 Lambda,每次我将文件添加到 s3://test-bucket-01/ 时都会触发它,它将 s3://test-bucket-01/ 中的所有文件复制到 s3: //测试桶-02/
我希望它只添加刚刚添加的新文件吗?
当前代码:
import boto3
s3 = boto3.resource('s3')
def lambda_handler(event, context):
bucket = s3.Bucket('test-bucket-01')
dest_bucket = s3.Bucket('tb-bucket-02')
print(bucket)
print(dest_bucket)
for obj in bucket.objects.all():
dest_key = obj.key
print(dest_key)
s3.Object(dest_bucket.name, dest_key).copy_from(CopySource = {'Bucket': obj.bucket_name, 'Key': obj.key})
结果:
Function Logs:
START RequestId: XXXXXXX-XXXXXXX-XXXXXXX Version: $LATEST
s3.Bucket(name='test-bucket-01')
s3.Bucket(name='test-bucket-02')
test-data-01.json
test-data-02.json
test-data-03.json
您不需要列出存储桶来复制所有文件,因为事件变量是一个 json,其中包含您已复制到 test-bucket-01 中的文件。
示例:
{
"Records": [
{
"eventVersion": "2.0",
"eventSource": "aws:s3",
"awsRegion": "us-east-1",
"eventTime": "1970-01-01T00:00:00.000Z",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "EXAMPLE"
},
"requestParameters": {
"sourceIPAddress": "127.0.0.1"
},
"responseElements": {
"x-amz-request-id": "C3D13FE58DE4C810",
"x-amz-id-2": "FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD"
},
"s3": {
"s3SchemaVersion": "1.0",
"configurationId": "testConfigRule",
"bucket": {
"name": "sourcebucket",
"ownerIdentity": {
"principalId": "EXAMPLE"
},
"arn": "arn:aws:s3:::mybucket"
},
"object": {
"key": "key/to/HappyFace.jpg",
"size": 1024,
"eTag": "d41d8cd98f00b204e9800998ecf8427e"
}
}
}
]
}
在这种情况下,此事件通知 ObjectCreated:Put 事件。一个新文件已复制到 "sourcebucket" 键为 "key/to/HappyFace.jpg" 的存储桶。
您为什么不想使用 native functional of AWS S3 将新文件从一个存储桶复制到另一个存储桶?
更简单、更可靠。您可以通过前缀复制文件、更改存储计划以及使用此本机功能的许多其他功能。
那么答案是什么?如何仅在添加新文件时触发lambda?