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
相关产品推荐
相关产品推荐

