如何自动将对象从源S3存储桶移至目标桶且不留源副本?
解决方案
方案1:S3事件通知 + Lambda(推荐,最简便的实时自动化方案)
虽然你提到考虑过Lambda,但其实这个方案配置步骤极少,完全满足实时自动移动的需求:
- 步骤1:在源S3桶的事件通知中,配置触发条件为「对象创建(所有)」,目标选择Lambda函数。
- 步骤2:创建一个极简的Lambda函数(Python/Node.js均可),核心逻辑是先复制文件到目标桶,再删除源桶文件。
示例Python代码:import boto3 s3 = boto3.client('s3') DEST_BUCKET = '你的目标桶名称' def lambda_handler(event, context): for record in event['Records']: source_bucket = record['s3']['bucket']['name'] source_key = record['s3']['object']['key'] # 复制到目标桶 s3.copy_object( Bucket=DEST_BUCKET, Key=source_key, CopySource={'Bucket': source_bucket, 'Key': source_key} ) # 删除源桶文件 s3.delete_object(Bucket=source_bucket, Key=source_key) - 步骤3:给Lambda函数配置IAM权限(允许读取源桶、写入目标桶、删除源桶对象)。
这个方案是实时触发,几乎无延迟,无需维护额外服务或脚本。
方案2:SQS + 自定义轮询脚本(适合已有脚本运维体系的场景)
SQS本身无法直接执行移动操作,必须配合外部脚本轮询队列:
- 步骤1:在源S3桶的事件通知中,将对象创建事件发送到指定SQS队列。
- 步骤2:编写脚本(如Shell/Python)持续轮询队列,获取对象创建消息后调用
aws s3 mv完成移动。
示例Shell脚本片段(需提前安装jq工具解析JSON):while true; do # 从SQS获取消息 MESSAGE=$(aws sqs receive-message --queue-url 你的队列URL --max-number-of-messages 1 --wait-time-seconds 20) if [ -n "$MESSAGE" ]; then # 解析源桶和对象键 SOURCE_BUCKET=$(echo "$MESSAGE" | jq -r '.Messages[0].Body | fromjson | .Records[0].s3.bucket.name') SOURCE_KEY=$(echo "$MESSAGE" | jq -r '.Messages[0].Body | fromjson | .Records[0].s3.object.key') # 执行移动 aws s3 mv s3://$SOURCE_BUCKET/$SOURCE_KEY s3://你的目标桶/$SOURCE_KEY # 删除已处理的SQS消息 RECEIPT_HANDLE=$(echo "$MESSAGE" | jq -r '.Messages[0].ReceiptHandle') aws sqs delete-message --queue-url 你的队列URL --receipt-handle "$RECEIPT_HANDLE" fi done - 步骤3:将脚本部署在EC2实例、ECS容器或本地服务器上,确保持续运行。
这个方案需要维护脚本运行状态,不如Lambda省心,但如果你的团队已有成熟脚本运维流程,可以考虑。
方案3:S3跨区域复制(CRR)+ 生命周期规则(适合非实时、批量场景)
如果不需要实时移动,可先通过CRR复制对象到目标桶,再用生命周期规则自动删除源桶对象:
- 步骤1:在源桶开启CRR,配置目标桶为复制目标,确保覆盖所有新创建的对象。
- 步骤2:在源桶添加生命周期规则,设置「对象创建后1天删除」(给复制留足时间)。
注意:该方案是异步复制+延迟删除,无法做到实时移动,若复制失败可能导致源桶对象误删,仅适合对实时性要求低的场景。
内容的提问来源于stack exchange,提问作者ChinnaR
相关产品推荐
相关产品推荐

