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

Terraform动态块中Condition仅获取单个值问题求助

解决Terraform中CloudFront ID列表无法全部加入IAM策略Condition的问题

问题场景

本地变量定义了CloudFront ID列表:

locals {
  cf_ids = [
    "E1DZ7XXXXX",
    "E2M7SXXXXX",
    "E1VABXXXXX"
  ]
}

尝试通过aws_iam_policy_document生成IAM策略时,使用dynamic "condition"遍历ID列表,但最终输出的Condition仅包含最后一个CloudFront ID:

原策略代码

data "aws_iam_policy_document" "cf_policy_for_s3" {
  statement {
    sid     = "CloudFrontPermissions"
    effect  = "Allow"
    actions = ["s3:GetObject"]
    resources = [
      "arn:aws:s3:::xxxxxxxxxx/*"
    ]

    dynamic "condition" {
      for_each = local.cf_ids
      content {
        test     = "StringEquals"
        variable = "AWS:SourceArn"
        values = ["arn:aws:cloudfront::123456789:distribution/${condition.value}"]
      }
    }

    principals {
      type        = "Service"
      identifiers = ["cloudfront.amazonaws.com"]
    }
  }
}

实际输出

+ Condition = {
    + StringEquals = {
        + "AWS:SourceArn" = [
            "arn:aws:cloudfront::123456789:distribution/E2M7SXXXXX"
          ]
      }
  }

期望输出

+ Condition = {
    + StringEquals = {
        + "AWS:SourceArn" = [
            "arn:aws:cloudfront::123456789:distribution/E1DZ7XXXXX",
            "arn:aws:cloudfront::123456789:distribution/E2M7SXXXXX",
            "arn:aws:cloudfront::123456789:distribution/E1VABXXXXX"
          ]
      }
  }

解决方案

问题根源是dynamic "condition"会为每个CloudFront ID生成独立的Condition块,而IAM策略中同名的Condition会被覆盖,最终仅保留最后一个。正确做法是在单个Condition块中,通过Terraform的for表达式生成包含所有CloudFront ARN的values数组:

data "aws_iam_policy_document" "cf_policy_for_s3" {
  statement {
    sid     = "CloudFrontPermissions"
    effect  = "Allow"
    actions = ["s3:GetObject"]
    resources = [
      "arn:aws:s3:::xxxxxxxxxx/*"
    ]

    condition {
      test     = "StringEquals"
      variable = "AWS:SourceArn"
      # 使用for表达式遍历cf_ids生成完整ARN列表
      values = [for id in local.cf_ids : "arn:aws:cloudfront::123456789:distribution/${id}"]
    }

    principals {
      type        = "Service"
      identifiers = ["cloudfront.amazonaws.com"]
    }
  }
}

这样生成的策略会将所有CloudFront ID对应的ARN加入到AWS:SourceArn的values列表中,符合期望输出。

内容的提问来源于stack exchange,提问作者Alok Nath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:25:27