如何将Terraform output变量作为其他资源的输入参数使用
问题原因
报错的核心原因是<<EOF包裹的JSON字符串中,你直接把Terraform的资源引用路径作为字面量写入了,Terraform不会自动解析普通字符串内的资源引用,所以IAM策略的Resource字段实际收到的是"data.terraform_remote_state.msk_vpc[0].outputs.cluster_arn"这个纯文本,而非对应的MSK集群ARN值,自然不符合ARN格式校验要求。
正确实现方案
方案1:使用插值语法注入变量(快速修复)
在HEREDOC字符串中用${}包裹资源引用,让Terraform渲染JSON时自动替换为实际ARN值,同时要和terraform_remote_state的count逻辑对齐,避免var.use_msk_peering为false时引用不存在的资源报错:
resource "aws_iam_role_policy" "msk_access" { count = var.use_msk_peering ? 1 : 0 # 和remote_state的count保持一致 name = "${element(split("-", var.product), 0)}-${var.env}-${var.region}-msk-access" role = module.instance_role.instance_role policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Action": [ "kafka:Describe*", "kafka:List*", "kafka:Get*" ], "Effect": "Allow", "Resource": "${data.terraform_remote_state.msk_vpc[0].outputs.cluster_arn}" } ] } EOF }
方案2:使用aws_iam_policy_document数据源生成策略(更稳定)
优先推荐该方案,可避免手动拼接JSON容易出现的语法错误,Terraform会自动完成格式校验:
data "aws_iam_policy_document" "msk_access" { count = var.use_msk_peering ? 1 : 0 statement { actions = [ "kafka:Describe*", "kafka:List*", "kafka:Get*" ] effect = "Allow" resources = [data.terraform_remote_state.msk_vpc[0].outputs.cluster_arn] } } resource "aws_iam_role_policy" "msk_access" { count = var.use_msk_peering ? 1 : 0 name = "${element(split("-", var.product), 0)}-${var.env}-${var.region}-msk-access" role = module.instance_role.instance_role policy = data.aws_iam_policy_document.msk_access[0].json }
内容的提问来源于stack exchange,提问作者Zhang
相关产品推荐
相关产品推荐

