我想自动将对象从第一个s3 bucket移动到第二个bucket。当一个文件被创建或上传到第一个bucket时,它应该被移到第二个bucket。传输后,源存储桶上不应该有该文件的任何副本。
我看到过aws3同步的例子,但这会在源bucket上留下一个副本,而且它不是自动的。
cli中的aws-mv命令将跨文件移动,但说明如何自动化该过程。创建一个lambda通知并将文件发送到第二个bucket可以解决问题,但我正在寻找一个更自动化、更简单的解决方案。不确定我们是否可以对SQS做些什么?我们可以在源bucket上设置什么东西来自动将对象发送到第二个bucket吗?感谢的任何想法
没有"移动";AmazonS3中的命令。相反,它涉及CopyObject()
和DeleteObject()
。即使是AWS CLIaws mv
命令也会执行"复制"one_answers"删除"操作。
实现目标的最简单方法是:
- 在源bucket上配置事件以触发AWS Lambda函数
- 编写Lambda函数,将对象复制到目标bucket,然后删除源对象
下面是一些示例代码:
import boto3
import urllib
TARGET_BUCKET = 'my-target-bucket'
def lambda_handler(event, context):
# Get incoming bucket and key
source_bucket = event['Records'][0]['s3']['bucket']['name']
source_key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'])
# Copy object to different bucket
s3_resource = boto3.resource('s3')
copy_source = {
'Bucket': source_bucket,
'Key': source_key
}
s3_resource.Bucket(TARGET_BUCKET).Object(source_key).copy(copy_source)
# Delete the source object
s3_resource.Bucket(TARGET_BUCKET).Object(source_key).delete()
它会将对象复制到目标bucket中的相同路径,然后删除源对象。
Lambda函数应分配一个IAM角色,该角色对源存储桶中的GetObject
和目标存储桶中CopyObject
+PutObject
具有足够的权限。
这是一个后续问题。如何设置到目标S3存储桶的S3复制。目标存储桶上的文件可以触发Lambda来清理源存储桶。底线问题:与S3复制((相比,S3复制是否更高效?