如何实现两个不同AWS账户下的S3桶每日自动同步
实现方案
整体采用AWS全托管服务实现,无需自行搭建服务器运行cron任务,核心逻辑为通过EventBridge定时触发Lambda函数,使用IAM-B的凭证跨账号完成S3桶数据同步,具体步骤如下:
步骤1:安全存储IAM-B的访问凭证
- 在ACCOUNT-A中使用AWS Secrets Manager存储IAM-B的
Access Key ID和Secret Access Key,密钥命名为IAM-B-S3-Creds,避免硬编码密钥到业务代码中 - 为后续使用的Lambda执行角色配置Secrets Manager只读权限,且仅开放该密钥的访问权限
步骤2:配置目标桶写入权限
在ACCOUNT-A的BUCKET-DESTINATION桶策略中添加如下权限,允许IAM-B身份写入目标桶:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::【ACCOUNT-B的12位账号ID】:user/IAM-B" }, "Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::BUCKET-DESTINATION/*", "arn:aws:s3:::BUCKET-DESTINATION" ] } ] }
注意替换占位符为ACCOUNT-B的实际账号ID
步骤3:创建同步逻辑Lambda函数
- 运行环境选择Python 3.9及以上版本,关联上一步配置好的、可读取Secrets Manager的执行角色
- 代码逻辑如下:
- 调用Secrets Manager接口读取IAM-B的访问密钥
- 使用该密钥初始化S3客户端,连接ACCOUNT-B的
BUCKET-SOURCE - 遍历源桶对象列表,通过对象最后修改时间、文件大小和目标桶已存对象做对比,过滤出需要同步的对象
- 调用
s3.copy_object接口直接跨账号复制对象,无需下载到本地再上传,单文件小于5GB场景可直接使用该接口,大于5GB的文件可补充分片复制逻辑
- 根据桶的总数据量调整Lambda的超时时间(最长可设15分钟)和内存配置,若单桶数据量过大可拆分同步任务,配合S3 Batch Operations做分片处理
步骤4:配置定时触发规则
- 进入ACCOUNT-A的EventBridge Scheduler控制台,创建新的定时任务
- 触发模式选择Cron表达式,按需配置执行时间,例如北京时间每日凌晨1点执行对应Cron表达式为
0 17 * * ? *(UTC时间比北京时间晚8小时) - 目标类型选择Lambda函数,关联上一步创建的同步函数,同时为EventBridge Scheduler配置调用Lambda的执行权限
可选优化项
- 增量同步优化:在ACCOUNT-A的DynamoDB或者S3中存储上次同步的时间戳,每次同步仅拉取该时间戳之后修改的对象,降低资源消耗
- 异常告警配置:为Lambda配置错误指标告警,同步失败时通过SNS发送通知,及时排查问题
- 大数据量适配:如果单桶数据量超过TB级别,可将同步逻辑替换为S3 Batch Operations批量复制任务,由EventBridge定时触发,成本更低、执行效率更高
内容的提问来源于stack exchange,提问作者The_Matrix
相关产品推荐
相关产品推荐

