【问题标题】:Terraform use output variable as an input in another resourceTerraform 使用输出变量作为另一个资源中的输入
【发布时间】:2021-12-28 00:00:48
【问题描述】:

我在 output.tf 文件中定义了一个输出变量,如下所示:

output "cluster_arn" {
  description = "MSK Cluster ARN"
  value       = aws_msk_cluster.msk.arn
}
data "terraform_remote_state" "msk_vpc" {
  backend = "s3"
  count = var.use_msk_peering ? 1 : 0

  config = {
    bucket = "${var.env}-tf-state"
    key    = "${var.msk_peer_name}/${var.msk_peer_region}/msk/terraform.tfstate"
    region = "us-west-2"
  }
}

我需要将此输出用作 aws_iam_role_policy 资源中的输入,因为我需要限制特定集群的评估。我该怎么办?我在下面尝试了这样,但 Terraform 在下面返回了一个错误。似乎 Terraform 无法按我预期的方式解析输出变量。
MalformedPolicyDocument:资源 data.terraform_remote_state.msk_vpc[0].outputs.cluster_arn 必须采用 ARN 格式或“*”。

resource "aws_iam_role_policy" "msk_access" {
  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

}

【问题讨论】:

    标签: terraform amazon-iam


    【解决方案1】:
    "Resource": "data.terraform_remote_state.msk_vpc[0].outputs.cluster_arn"
    

    这一行不引用变量本身,它只是根据引号内的内容创建一个字符串。

    您要做的就是删除引号:

    "Resource": data.terraform_remote_state.msk_vpc[0].outputs.cluster_arn
    

    或使用字符串插值:

    "Resource": "${data.terraform_remote_state.msk_vpc[0].outputs.cluster_arn}"
    

    【讨论】:

      【解决方案2】:

      您可以使用 Terraform 的 templatefile() 函数对 JSON 文件进行一些变量插值。比如:

      data "terraform_remote_state" "msk_vpc" {
        backend = "s3"
        count   = var.use_msk_peering ? 1 : 0
      
        config = {
          bucket = "${var.env}-tf-state"
          key    = "${var.msk_peer_name}/${var.msk_peer_region}/msk/terraform.tfstate"
          region = "us-west-2"
        }
      }
      
      resource "aws_iam_role_policy" "msk_access" {
        name = "${element(split("-", var.product), 0)}-${var.env}-${var.region}-msk-access"
        role = module.instance_role.instance_role
        policy = templatefile("${path.module}/policy.json", {
          cluster_arn = data.terraform_remote_state.msk_vpc[0].outputs.cluster_arn
        })
      }
      

      伴随着 policy.json 存在于您的模块根目录中:

      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Action": [
              "kafka:Describe*",
              "kafka:List*",
              "kafka:Get*"
            ],
            "Effect": "Allow",
            "Resource": "${cluster_arn}"
          }
        ]
      }
      

      【讨论】:

        猜你喜欢
        • 2017-05-26
        • 2020-12-08
        • 2021-01-11
        • 2019-11-19
        • 2020-07-10
        • 2022-06-22
        • 1970-01-01
        • 2021-11-11
        • 1970-01-01
        相关资源
        最近更新 更多