使用CLI及Terraform销毁时无法删除版本化AWS S3桶
解决AWS版本化S3桶无法删除的问题
问题描述
执行删除版本化S3桶的命令时触发报错:
aws s3 rb s3://rapport1-0-ap1-dev-01 --force
报错信息:
remove_bucket failed: s3://rapport1-0-ap1-dev-01 An error occurred (BucketNotEmpty) when calling the DeleteBucket operation: The bucket you tried to delete is not empty. You must delete all versions in the bucket
已尝试以下操作但未解决问题:
- 执行
aws s3 rm s3://rapport1-0-ap1-dev-01 --recursive清空桶 - 执行
aws s3api put-bucket-versioning --bucket rapport1-0-ap1-dev-01 --versioning-configuration Status=Suspended暂停版本控制 - 再次执行删除桶命令仍报相同错误,仅在控制台手动删除所有版本化对象后才能成功删桶
解决方案
版本化桶内除了当前版本对象,还存在历史版本对象和删除标记(Delete Marker),普通的aws s3 rm --recursive只能删除当前版本,无法处理这些隐藏内容,必须彻底清理所有版本后才能删除桶。
推荐用以下命令批量清理:
- 删除所有对象的历史版本:
aws s3api delete-objects --bucket rapport1-0-ap1-dev-01 --delete "$(aws s3api list-object-versions --bucket rapport1-0-ap1-dev-01 --query '{Objects: Versions[].{Key: Key, VersionId: VersionId}}')"
- 删除所有删除标记:
aws s3api delete-objects --bucket rapport1-0-ap1-dev-01 --delete "$(aws s3api list-object-versions --bucket rapport1-0-ap1-dev-01 --query '{Objects: DeleteMarkers[].{Key: Key, VersionId: VersionId}}')"
- 清理完成后,再次执行删除桶命令:
aws s3 rb s3://rapport1-0-ap1-dev-01 --force
或者用更简洁的命令一次性清理所有版本:
aws s3 rm s3://rapport1-0-ap1-dev-01 --recursive --include "*" --version-id all
注意:暂停版本控制只是停止创建新的对象版本,已存在的历史版本和删除标记不会自动消失,必须手动清理。
内容的提问来源于stack exchange,提问作者Manosundar M
相关产品推荐
相关产品推荐

