Terraform遍历对象列表生成IAM策略报错:each.value无法在此上下文使用
解决Terraform构建IAM策略文档的
each.value报错问题 错误原因
- 资源ARN拼接语法错误:原代码中
resources字段使用了错误的插值格式${var.local_bucket_name}/each.value.allowed_prefix,未正确引用each.value变量,也不符合S3资源ARN的标准格式。 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
相关产品推荐
相关产品推荐

