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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:15:02