Terraform如何跨模块引用KMS密钥配置SQS kms_master_key_id
Terraform跨模块引用KMS密钥配置SQS加密的正确方法
Terraform默认不允许直接穿透访问其他子模块内部的资源,跨模块传值必须遵循「被引用模块输出暴露→根模块传参→引用模块变量接收」的标准流程,具体配置步骤如下:
1. 给KMS模块添加输出配置
在KMS模块目录(./modules/KMS)下新增输出声明,把需要对外暴露的KMS密钥属性输出,你可以新建outputs.tf文件存放该配置,也可以写到模块内任意.tf文件中:
# ./modules/KMS/outputs.tf output "kms_key_id" { description = "KMS主密钥ID" value = aws_kms_key.a.key_id } output "kms_key_arn" { description = "KMS主密钥ARN" value = aws_kms_key.a.arn }
2. 给SQS模块添加输入变量,替换占位赋值
首先在SQS模块目录(./modules/SQS)下定义接收KMS密钥ID的输入变量,同样可以新建variables.tf存放变量配置:
# ./modules/SQS/variables.tf variable "kms_master_key_id" { description = "用于SQS队列服务端加密的KMS主密钥标识" type = string }
然后修改SQS模块内的队列资源配置,把原来kms_master_key_id位置的占位符替换为对该变量的引用:
# ./modules/SQS/main.tf resource "aws_sqs_queue" "terraform_queue" { name = "terraform-example-queue" delay_seconds = 90 max_message_size = 2048 message_retention_seconds = 86400 kms_master_key_id = var.kms_master_key_id receive_wait_time_seconds = 10 }
3. 修改根模块调用配置,完成跨模块传值
在根模块的调用代码中,将KMS模块输出的密钥ID作为入参传递给SQS模块即可:
# 根模块main.tf module "kms" { source = "./modules/KMS" } module "sqs" { source = "./modules/SQS" kms_master_key_id = module.kms.kms_key_id }
注意事项
- 禁止直接在SQS模块中写类似
module.kms.aws_kms_key.a.key_id的穿透引用,这种写法不符合Terraform模块封装规范,会导致模块间强耦合,Terraform也会直接报引用错误。 - SQS的
kms_master_key_id参数同时支持传入KMS密钥ID和密钥ARN,两种值都可以正常生效,你也可以根据需要传module.kms.kms_key_arn。
内容的提问来源于stack exchange,提问作者Somethingwhatever
相关产品推荐
相关产品推荐

