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

Terraform遍历对象列表生成IAM策略报错:each.value无法在此上下文使用

解决Terraform构建IAM策略文档的each.value报错问题

错误原因

  1. 资源ARN拼接语法错误:原代码中resources字段使用了错误的插值格式${var.local_bucket_name}/each.value.allowed_prefix,未正确引用each.value变量,也不符合S3资源ARN的标准格式。
  2. each.value上下文识别问题:错误的字符串插值写法导致Terraform无法识别each.value的有效作用域。

修正后的代码

首先确保已正确定义输入变量:

variable "s3_access" {
  type = list(object({
    ext_principal_arn = string
    allowed_prefix    = string
    actions_to_allow  = list(string)
  }))
  description = "跨账号S3访问配置列表"
}

variable "local_bucket_name" {
  type        = string
  description = "目标S3桶名称"
}

然后修正aws_iam_policy_document数据源:

data "aws_iam_policy_document" "s3_cross_account_access_policy" {
  statement {
    # 将s3_access列表转换为以ARN为键的映射,生成独立策略语句
    for_each = { for access in var.s3_access : access.ext_principal_arn => access }

    principals {
      type        = "AWS"
      identifiers = [each.value.ext_principal_arn]
    }

    actions   = each.value.actions_to_allow
    # 正确拼接S3资源ARN,遵循标准格式arn:aws:s3:::bucket-name/path
    resources = ["arn:aws:s3:::${var.local_bucket_name}${each.value.allowed_prefix}"]
  }
}

关键说明

  • 精细化权限控制:通过for_each为每个var.s3_access条目生成独立的IAM策略语句,不同AWS账号主体对应不同的操作权限和S3前缀。
  • 资源格式正确性:S3资源ARN必须遵循arn:aws:s3:::bucket-name/path格式,避免因格式错误导致权限不生效。
  • 变量驱动配置:所有配置通过输入变量定义,无需硬编码策略文档,便于维护和扩展。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:17:22