使用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
相关产品推荐
相关产品推荐

