启用AWS S3 WORM后Terraform导入S3模块报Bucket已存在故障
问题描述
在为某一AWS S3存储桶启用WORM配置后,Terraform无法再向该存储桶部署任何变更,始终提示存储桶已存在。
背景信息
- Terraform远程状态存储在独立S3桶中,本次故障不涉及状态存储桶
- 所有S3存储桶资源均通过官方模块
terraform-aws-modules/s3-bucket/aws管理
操作与报错记录
最初执行的存储桶导入命令如下:
terraform -chdir=infrastructure/wazuh_app/resources import -config=../resources -var-file=../config/stage/terraform.tfvars "module.wazuh_app.module.wazuh_log_archive.module.bucket.aws_s3_bucket.this[0]" [BUCKET NAME]
执行后返回报错:
error creating S3 Bucket ([BUCKET NAME]): BucketAlreadyOwnedByYou: Your previous request to create the named bucket succeeded and you already own it.
后续尝试将对应资源从Terraform状态文件中移除后重新导入,移除资源的命令为:
terraform -chdir=infrastructure/wazuh_app/resources state rm module.wazuh_app.module.wazuh_log_archive.module.bucket.aws_s3_bucket.this[0]
操作完成后再次执行terraform apply,仍然返回相同的存储桶创建失败报错。
相关配置代码
wazuh_log_archive层级配置:
module "bucket" { source = "terraform-aws-modules/s3-bucket/aws" version = "3.3.0" bucket = "${var.name_prefix}-${var.log_bucket_name}" acl = "private" force_destroy = true versioning = { enabled = true } server_side_encryption_configuration = { rule = { bucket_key_enabled = true apply_server_side_encryption_by_default = { kms_master_key_id = module.kms_wazuh_archive_key.key_arn sse_algorithm = "aws:kms" } } } lifecycle_rule = [ { id = "[ID]" enabled = true expiration = { days = var.s3_retention_period } } ] } resource "aws_s3_bucket_object_lock_configuration" "worm_configuration" { bucket = module.bucket.s3_bucket_id rule { default_retention { mode = "GOVERNANCE" days = var.worm_retention } } token = var.token_required ? data.aws_ssm_parameter.worm_token.value : null } data "aws_ssm_parameter" "worm_token" { name = "/${var.name_prefix}-${var.log_bucket_name}/worm-token" }
父模块资源调用链路配置:
module "wazuh_log_archive" { source = "[wazuh_log_archive SOURCE]" log_bucket_name = var.log_bucket_name name_prefix = var.name_prefix namespace = var.namespace retention_period = var.retention_period s3_retention_period = var.s3_retention_period worm_retention = var.worm_retention token_required = var.token_required depends_on = [ module.wazuh_shared_resources ] }
module "wazuh_app" { source = "[wazuh_app SOURCE]" worm_retention = var.worm_retention token_required = var.token_required }
已通过terraform apply输出、terraform state list查询多次校验,确认导入的目标存储桶地址、状态中移除的资源地址完全匹配,未找到排查方向。
问题根因
核心问题来自两个配置和操作的疏漏:
- S3的对象锁(即WORM配置)是存储桶创建时就必须指定的级联属性,无法在桶创建完成后单独开启。当前使用的3.3.0版本terraform-aws-modules/s3-bucket模块,默认
object_lock_enabled参数为false,手动给已存在的存储桶开启WORM后,Terraform对比代码配置和实际桶属性,会判定桶配置不符合声明,触发重建逻辑——但桶已经存在且属于当前账号,就会抛出BucketAlreadyOwnedByYou错误。 - 之前的导入操作只导入了
aws_s3_bucket这一个核心资源,自行编写的独立资源aws_s3_bucket_object_lock_configuration.worm_configuration、以及模块自动生成的版本控制、加密、生命周期规则等关联资源都没有导入到状态中,Terraform会判定这些资源不存在,按逻辑需要先创建这些资源,而创建对象锁配置的前置要求是桶本身开启对象锁属性,反过来又触发桶重建的逻辑,形成死循环。
解决步骤
- 在
module "bucket"配置块中新增object_lock_enabled = true参数,和实际桶的配置对齐。 - 把所有和该存储桶相关的未导入资源全部导入到Terraform状态中,重点是单独定义的对象锁配置资源,导入命令参考:
terraform -chdir=infrastructure/wazuh_app/resources import -config=../resources -var-file=../config/stage/terraform.tfvars "module.wazuh_app.module.wazuh_log_archive.aws_s3_bucket_object_lock_configuration.worm_configuration" [BUCKET NAME]
如果执行plan时还提示其他S3关联资源(比如版本控制配置、服务端加密配置、生命周期规则)不存在,按报错给出的资源地址逐一导入即可。
- 所有资源导入完成后执行
terraform plan,确认输出中无存储桶重建的提示,所有变更均为就地修改或无变更,再执行apply即可完成修复。
注意:
force_destroy = true参数对开启WORM的存储桶无效,GOVERNANCE模式的WORM需要对应权限才能修改,COMPLIANCE模式的WORM开启后无法删除存储桶,不要尝试删桶重建。
内容的提问来源于stack exchange,提问作者Daniel Perez
相关产品推荐
相关产品推荐

