如何防止S3存储桶独有文件在AWS S3 sync后被覆盖或删除?
解决方案
一、修改S3 Sync命令实现需求
AWS S3 sync命令默认会删除目标端(S3存储桶)中源端(本地)不存在的文件,同时会覆盖目标端已存在的同名文件。要满足你的需求,只需添加两个参数:
- 使用
--no-delete:阻止删除S3中本地没有的文件,保留桶内原有内容 - 使用
--no-clobber:阻止覆盖S3中已存在的同名文件,只上传本地新增或修改且S3中无对应文件的内容
最终命令示例:
aws s3 sync ./your-local-folder s3://your-target-bucket/ --no-delete --no-clobber
该命令会达成以下效果:
- 本地新增的文件(如示例中的
foo)会同步到S3 - S3中原有的文件(如示例中的
bar)会被保留,不会被删除 - 若本地修改了某个文件,但S3中已有同名文件,不会覆盖S3里的版本
二、配置S3存储桶实现仅写入+防覆盖
除了通过命令控制,还可以通过桶配置从权限层面限制文件操作,彻底防止覆盖和删除:
1. 启用版本控制
在S3控制台找到目标桶,进入「属性」标签页,开启「版本控制」功能。启用后:
- 即使上传同名文件,也不会覆盖原有文件,而是生成一个新的版本,旧版本仍可查看和恢复
- 删除操作只会添加删除标记,不会真正删除文件(除非手动删除版本)
2. 设置桶策略限制操作权限
创建桶策略,仅允许用户执行文件上传(PutObject)操作,拒绝删除、修改权限等操作。示例策略如下(替换占位符为你的实际信息):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "arn:aws:iam::123456789012:user/your-iam-user", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::your-bucket/*" }, { "Effect": "Deny", "Principal": "arn:aws:iam::123456789012:user/your-iam-user", "Action": [ "s3:DeleteObject", "s3:DeleteObjectVersion", "s3:PutObjectAcl", "s3:PutBucketAcl" ], "Resource": [ "arn:aws:s3:::your-bucket", "arn:aws:s3:::your-bucket/*" ] } ] }
3. 可选:启用对象锁(Object Lock)
如果需要更严格的防篡改规则(比如合规要求),可以在启用版本控制后开启对象锁:
- 合规模式:在指定保留期内,任何人(包括桶所有者)都不能删除或覆盖对象
- 治理模式:限制普通用户修改,但桶所有者可以绕过限制
内容的提问来源于stack exchange,提问作者Jengels
相关产品推荐
相关产品推荐

