如何实现AWS S3两存储桶间同名文件旧版本自动迁移功能?
AWS S3双桶旧版本自动迁移实现流程
前置准备
- 提前创建两个S3存储桶,记为源桶(仅保留最新版本文件)和归档桶(存储历史旧版本文件),两个桶必须开启版本控制,这是获取历史版本对象的核心前提
- 提前创建Lambda服务的专属IAM角色,权限至少包含:源桶的
s3:GetObject、s3:ListBucketVersions、s3:DeleteObjectVersion,归档桶的s3:PutObject,以及Lambda基础运行权限
核心实现步骤
1. 配置源桶事件通知
- 进入源桶的「属性」页面,找到「事件通知」模块,点击「创建事件通知」
- 事件类型勾选所有对象创建事件(即
s3:ObjectCreated:*),如果需要过滤特定前缀/后缀的文件可以自行配置,否则留空即可 - 通知目标选择「Lambda函数」,可以直接选择已创建的Lambda函数,也可以先创建占位后续再关联
2. 编写Lambda处理逻辑
运行环境推荐选择Python 3.x,核心逻辑示例代码如下:
import boto3 s3 = boto3.client('s3') # 替换为你自己的归档桶名称 ARCHIVE_BUCKET = 'your-archive-bucket-name' def lambda_handler(event, context): # 解析触发事件的对象信息 record = event['Records'][0] source_bucket = record['s3']['bucket']['name'] object_key = record['s3']['object']['key'] # 拉取当前对象的所有版本,默认按上传时间倒序排列 versions = s3.list_object_versions(Bucket=source_bucket, Prefix=object_key)['Versions'] # 只有1个版本说明是首次上传,没有旧版本需要迁移 if len(versions) <= 1: return # 遍历除最新版本外的所有历史版本 for old_version in versions[1:]: version_id = old_version['VersionId'] # 将旧版本复制到归档桶 s3.copy_object( Bucket=ARCHIVE_BUCKET, Key=object_key, CopySource={ 'Bucket': source_bucket, 'Key': object_key, 'VersionId': version_id } # 如需归档到冷存储可新增参数:StorageClass='GLACIER' # 如需给旧版本打标签可新增参数:Tagging='source=old_version_archive' ) # 复制成功后删除源桶内的旧版本 s3.delete_object( Bucket=source_bucket, Key=object_key, VersionId=version_id )
- 给Lambda绑定提前准备好的IAM角色,根据你存储的最大文件大小调整Lambda的超时时间和内存配置,避免大文件迁移过程中超时中断
3. 存量数据处理(可选)
如果源桶上线该流程前已有历史旧版本,可以使用S3批量操作功能一次性完成存量旧版本的迁移,不用等待后续触发事件处理
测试验证
- 往源桶上传一个测试文件,再上传同名的新版本文件
- 检查源桶的版本列表,确认仅保留最新版本;再检查归档桶,确认已存入旧版本文件即可
注意事项
- 千万不要关闭两个桶的版本控制,否则历史版本对象会丢失,迁移逻辑也无法正常运行
- 生产环境建议添加Lambda错误告警,一旦出现迁移失败可以及时收到通知处理
- 超过5GB的大文件建议使用S3分段复制能力,避免单请求超时
内容的提问来源于stack exchange,提问作者harshith
相关产品推荐
相关产品推荐

