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

Terraform v1.0合并列表与资源输出作for_each参数报错能否用单资源块解决

解决方案

可以仅使用单个资源块完成配置,核心是改造for_each的输入,让其在Plan阶段就能确定元素数量与键值。

你遇到的报错是因为Terraform要求for_each的集合长度、所有键必须在规划阶段可确定,你之前的写法中aws_iam_policy.custom-policy.arn要等资源创建后才会生成,Terraform无法预判拼接后的集合总长度、是否存在重复元素,因此抛出错误。

你可以构造一个键固定的Map作为for_each的输入,Map的键在规划阶段完全确定,仅Map的值(策略ARN)允许包含 apply 阶段才会生成的属性,这是Terraform允许的场景,参考配置如下:

locals {
  default_iam_policies = [
    "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy",
    "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore",
    "arn:aws:iam::aws:policy/AWSDeviceFarmFullAccess"   
  ]

  # 构造键固定的策略Map,总长度在规划阶段即可确定
  all_iam_policies = merge(
    # 提取AWS托管策略的名称作为键
    { for policy_arn in local.default_iam_policies : split("/", policy_arn)[1] => policy_arn },
    # 自定义策略使用固定字符串作为键
    { "custom_policy" = aws_iam_policy.custom-policy.arn }
  )
}

resource "aws_iam_role_policy_attachment" "default-policy-attachment" {
  for_each = local.all_iam_policies

  role       = aws_iam_role.this.name
  policy_arn = each.value
}

注意事项

  • 需保证构造的Map所有键唯一,避免出现键冲突
  • 后续新增策略时,只要给新策略分配唯一的键,不需要拆分资源块即可直接扩展

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:39:02