使用force_delete=true创建的AWS S3 Bucket通过Terraform删除时遇Access Denied失败
解决Terraform销毁存储VPC Flow Logs的S3 Bucket时出现AccessDenied的问题
问题原因
VPC Flow Logs由AWS服务账户投递到S3桶,这些日志对象的所有者可能并非桶的所有者,且你已提前删除了相关权限策略,导致Terraform执行destroy时没有足够权限删除对象。即使桶ACL设置了所有者和日志投递组的完全访问,也可能因对象级所有权限制或权限缺失导致删除失败。
解决步骤
添加临时桶策略获取删除权限
给目标S3桶添加以下临时策略,替换占位符为你的实际信息:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的账号ID:user/你的用户名" }, "Action": [ "s3:DeleteObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::你的桶名/*", "arn:aws:s3:::你的桶名" ] } ] }确保对象所有权归桶所有者
如果日志对象是由AWS服务账户创建的,可能存在对象所有者与桶所有者不一致的情况,开启桶所有权强制控制:aws s3api put-bucket-ownership-controls --bucket 你的桶名 --ownership-controls Rules=[{ObjectOwnership=BucketOwnerEnforced}]手动清空桶内对象
使用AWS CLI递归删除AWSLogs路径下的所有日志文件:aws s3 rm s3://你的桶名/AWSLogs/ --recursive也可以直接在AWS控制台手动删除桶内所有对象。
执行Terraform销毁
完成上述操作后,重新运行:terraform destroy
注意事项
- 不要提前删除桶的权限策略,应先确保有足够权限清空桶内对象,再进行销毁操作。
force_destroy=true仅能让Terraform尝试删除对象,但前提是执行Terraform的用户拥有对应的删除权限。
内容的提问来源于stack exchange,提问作者AG6HQ
相关产品推荐
相关产品推荐

