You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform跨模块引用资源的正确方法:解决S3模块引用KMS模块ARN时重复创建资源的问题

Terraform跨模块引用资源的正确方法:解决S3模块引用KMS模块ARN时重复创建资源的问题

嗨,我来帮你解决这个Terraform跨模块引用的问题!你现在遇到的重复创建KMS资源的问题,根源在于你同时在两个地方实例化了KMS模块:一个是在根模块的main.tf里,另一个是在S3模块内部又引用了一次KMS模块。Terraform里每个module块都会创建一个独立的模块实例,所以这就导致了两个KMS密钥被创建出来。

下面是正确的解决方案,核心思路是只在根模块中实例化一次KMS模块,通过输入变量将KMS的ARN传递给S3模块,而不是让S3模块自己再实例化KMS模块:

步骤1:给S3模块添加接收KMS ARN的输入变量

首先在./s3/目录下创建variables.tf(如果没有的话),定义一个变量来接收外部传入的KMS密钥ARN:

variable "aws_kms_key_arn" {
  description = "ARN of the KMS key used for S3 bucket encryption"
  type        = string
}

步骤2:修改S3模块的代码,移除重复的KMS模块引用并使用传入的ARN

更新./s3/main.tf,删掉内部引用的KMS模块,同时在加密配置中使用传入的变量:

# 删掉这部分重复引用的KMS模块代码,避免重复创建资源
# module "aws_kms_module" {
#   source = "../kms"
#   aws_kms_tags = var.aws_s3_bucket_tags
# }

resource "aws_s3_bucket" "tf_s3_bucket" {
  bucket = var.aws_s3_bucket_name
  tags   = var.aws_s3_bucket_tags
}

resource "aws_s3_bucket_server_side_encryption_configuration" "tf_s3_bucket_encryption" {
  bucket = aws_s3_bucket.tf_s3_bucket.id

  rule {
    apply_server_side_encryption_by_default {
      kms_master_key_id = var.aws_kms_key_arn  # 使用外部传入的KMS ARN
      sse_algorithm     = "aws:kms"
    }
  }
}

步骤3:确保KMS模块输出ARN供外部引用

在./kms/目录下创建outputs.tf,输出KMS密钥的ARN,这样根模块才能拿到这个值传递给S3模块:

output "arn" {
  description = "ARN of the KMS encryption key"
  value       = aws_kms_key.tf_kms_key.arn
}

步骤4:更新根模块,将KMS的ARN传递给S3模块

修改根目录的./main.tf,在S3模块的引用中添加aws_kms_key_arn参数,值为根模块中KMS实例的ARN:

module "aws_kms_resource_module"{
  source = "./modules/kms"
  aws_kms_tags = {
    Account_Id = local.account_id
    Region     = local.region_name
  }
}

module "aws_s3_resource_module" {
  # 这里的depends_on可以省略,Terraform会自动通过变量引用推断依赖关系
  # depends_on = [module.aws_kms_resource_module]
  source             = "./modules/s3"
  aws_s3_bucket_name = "${var.s3_bucket_name}-${local.account_id}"
  aws_s3_bucket_tags = {
    Account_Id = local.account_id
    Region     = local.region_name
  }
  aws_kms_key_arn    = module.aws_kms_resource_module.arn  # 传递KMS ARN到S3模块
}

验证效果

现在运行terraform plan,你会发现只会创建一个KMS密钥,同时S3桶的加密配置会正确引用这个密钥的ARN,完美解决了重复创建资源的问题!

备注:内容来源于stack exchange,提问作者user21691259

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 15:02:58