Terraform的aws_iam_role数据源name参数是否需要包含IAM角色路径?
问题结论
- 仅通过
name = "ssr-lambda"声明aws_iam_role数据源时,如果当前AWS账号同区域下存在多个同名不同路径的IAM角色,Terraform会直接抛出「匹配到多个资源」的错误,无法自动识别目标角色。 - 不能通过将路径拼接在
name参数值中(如/path-a/ssr-lambda)的方式指定目标角色,该写法会返回「角色不存在」的错误,因为IAM角色的name属性本身不包含路径前缀。 - 你产生困惑的原因是
aws_iam_role和aws_iam_policy两个数据源的设计逻辑不同:后者原生支持path_prefix过滤参数,前者的旧版本没有提供路径相关的传入参数,仅会将path作为查询结果的返回属性。
解决方法
方法1:使用ARN精准匹配(最稳妥)
如果提前知道目标角色的ARN,直接传入arn参数即可唯一锁定资源:
data "aws_iam_role" "example" { arn = "arn:aws:iam::123456789012:role/path-a/ssr-lambda" }
方法2:搭配复数数据源aws_iam_roles过滤路径
如果不知道ARN,可以先用支持path_prefix参数的复数角色数据源筛选对应路径下的所有角色,再匹配目标名称:
# 先筛选/path-a/路径下的所有IAM角色 data "aws_iam_roles" "path_a_roles" { path_prefix = "/path-a/" } # 从筛选结果中匹配名称为ssr-lambda的角色,获取完整属性 data "aws_iam_role" "example" { name = [for role_name in data.aws_iam_roles.path_a_roles.names : role_name if role_name == "ssr-lambda"][0] }
内容的提问来源于stack exchange,提问作者Julio Corzo
相关产品推荐
相关产品推荐

