Terraform创建aws_iam_role_policy报错:需字符串却传入ARN列表
解决Terraform中IAM策略Resource字段同时包含单个SSM参数ARN与ARN列表的问题
你遇到的错误是因为Terraform字符串模板无法直接解析列表类型的值,需要先把单个ARN和批量获取的ARN列表合并成一个完整的列表,再通过jsonencode函数将其转换为IAM策略所需的JSON数组格式。
具体实现步骤
- 合并ARN列表:使用
concat函数将单个SSM参数的ARN(包装成单元素列表)与aws_ssm_parameters_by_path返回的ARN列表合并,得到一个包含所有目标ARN的完整列表。 - 生成策略JSON:在
policy参数中用jsonencode直接构造整个IAM策略文档,这样Terraform会自动处理列表到JSON数组的转换,避免字符串模板的类型冲突。
完整示例代码
# 批量获取指定路径下的SSM参数ARN data "aws_ssm_parameters_by_path" "all_parameters" { path = "/your/ssm/path/" recursive = true } # 配置IAM角色策略 resource "aws_iam_role_policy" "ssm_access_policy" { name = "ssm-access-policy" role = aws_iam_role.your_role.id policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Action = ["ssm:GetParameter", "ssm:GetParameters"] # 合并单个ARN与批量获取的ARN列表 Resource = concat( ["arn:aws:ssm:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:parameter/single-specific-param"], data.aws_ssm_parameters_by_path.all_parameters.arns ) } ] }) } # 可选:获取当前区域和账号ID,避免硬编码 data "aws_region" "current" {} data "aws_caller_identity" "current" {}
关键说明
concat函数用于将多个列表合并为一个,这里把单个ARN包装成["单个ARN"]的形式,确保和另一个列表的类型匹配。jsonencode会自动将Terraform的列表类型转换为JSON数组,完美适配IAM策略中Resource字段的格式要求,彻底解决字符串模板无法解析列表的问题。
内容的提问来源于stack exchange,提问作者Enol
相关产品推荐
相关产品推荐

