Terraform for循环引用变量批量生成AWS ARN报错排查
问题根因
你遇到的报错和逻辑错误来自两点:
aws_arn数据源的设计用途是解析单个已存在的完整ARN,拆分出账号ID、区域、服务名等拆分属性,本身不支持批量传入账号列表生成ARN,你给account、arn参数传列表类型值本身就不符合该数据源的参数要求。- 引用资源时直接传入整个资源对象(
data.aws_arn.SrcArn),没有指定具体要取的属性,Terraform无法识别你要引用资源的哪个字段。
正确实现方案
你不需要依赖aws_arn数据源生成ARN列表,直接用本地值拼接是最简单高效的方案:
variable "acct" { type = list(string) default = ["111111111111", "22222222222"] } locals { # 批量拼接所有账号对应的日志服务ARN source_arns = [for acc in var.acct : "arn:aws:logs:us-east-1:${acc}:*"] }
如果你后续需要解析ARN的拆分属性,必须配合count参数批量生成aws_arn数据源实例,不能直接给单个数据源传列表:
data "aws_arn" "src_arn" { count = length(var.acct) arn = "arn:aws:logs:us-east-1:${var.acct[count.index]}:*" } # 该方式生成的ARN列表可通过 data.aws_arn.src_arn[*].arn 获取
condition块引用方法
IAM策略条件的ArnLike校验本身支持传入字符串列表做匹配,只要给values传入字符串类型的ARN列表即可,不能直接传入整个资源对象:
- 用本地值生成列表的引用方式:
condition { test = "ArnLike" values = local.source_arns variable = "aws:SourceArn" }
- 用count批量生成数据源的引用方式:
condition { test = "ArnLike" values = data.aws_arn.src_arn[*].arn variable = "aws:SourceArn" }
内容的提问来源于stack exchange,提问作者Devang Sanghani
相关产品推荐
相关产品推荐

