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

使用for_each创建资源后,提取Terraform ARN至IAM政策遇阻求助

问题解决:Terraform中通过for_each创建的Firehose资源ARN传入IAM政策报错

问题根源

你遇到的错误是因为在字符串模板中直接插入了Terraform列表类型的值,而Terraform要求字符串插值只能使用字符串类型。虽然values(aws_kinesis_firehose_delivery_stream.open-search)[*].arn输出的是列表格式,但直接放到JSON模板里会导致类型不匹配,同时生成的内容也不符合JSON语法规范。

解决方案1:使用jsonencode()转换列表为合法JSON字符串

修改政策模板,用jsonencode()函数把ARN列表转换成符合JSON语法的数组字符串,这样插值后就能正确生成合法的JSON政策:

policy = <<POLICY
{
    "Version": "2012-10-17",
    "Statement": [
        {
          "Effect": "Allow",
          "Action": [
              "firehose:PutRecordBatch"
          ],
          "Resource": ${jsonencode(values(aws_kinesis_firehose_delivery_stream.open-search)[*].arn)}
        }
    ]
}
POLICY

jsonencode()会自动将Terraform列表转换为带引号、符合JSON格式的数组字符串,完美适配IAM政策的Resource字段要求。

解决方案2:使用aws_iam_policy_document数据源(推荐)

更安全的方式是用Terraform内置的IAM政策文档数据源来构建政策,完全避免手动拼接JSON的错误:

data "aws_iam_policy_document" "firehose_put_permissions" {
  statement {
    effect   = "Allow"
    actions  = ["firehose:PutRecordBatch"]
    resources = values(aws_kinesis_firehose_delivery_stream.open-search)[*].arn
  }
}

# 直接引用生成的合法JSON政策
policy = data.aws_iam_policy_document.firehose_put_permissions.json

这种方式下,Terraform会自动处理所有JSON格式细节,包括资源列表的转换,彻底规避类型不匹配的问题,同时政策的可读性和可维护性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:26:10