如何通过AWS IAM角色的ARN获取其友好名称以完成Terraform策略绑定
解决方案
你遇到的报错确实是因为aws_iam_role_policy_attachment资源的role参数仅支持传入IAM角色的友好名称(或带路径的角色名称),不支持直接传入ARN。
方法1:手动从ARN提取角色名
AWS IAM角色ARN的标准格式为:arn:aws:iam::<账号ID>:role/<角色名>[可选路径],你只需要截取role/之后的全部内容即可作为role参数的有效值。如果角色带自定义路径,需要保留完整的路径前缀。
以你提供的ARN为例,arn:aws:iam::my_user_account_id:role/my_role_name中role/后的my_role_name就是角色友好名称,直接替换即可:
resource "aws_iam_role_policy_attachment" "my-policy-attachment" { role = "my_role_name" policy_arn = aws_iam_policy.my_policy.arn }
方法2:用Terraform内置函数自动提取(适用于ARN为动态变量的场景)
如果ARN是通过变量、其他资源输出等动态获取的,可以用正则表达式函数直接提取role/后的内容,无需手动拆分:
variable "target_role_arn" { type = string default = "arn:aws:iam::my_user_account_id:role/my_role_name" } resource "aws_iam_role_policy_attachment" "my-policy-attachment" { role = regex("role/(.*)", var.target_role_arn)[0] policy_arn = aws_iam_policy.my_policy.arn }
方法3:通过数据源查询角色信息(最稳妥的方案)
如果需要避免手动拆分的误差,建议调用AWS IAM数据源直接通过ARN查询角色的全量属性,直接取官方返回的角色名即可:
# 通过ARN查询已有IAM角色的信息 data "aws_iam_role" "target_role" { arn = "arn:aws:iam::my_user_account_id:role/my_role_name" } resource "aws_iam_role_policy_attachment" "my-policy-attachment" { role = data.aws_iam_role.target_role.name # 如果角色带自定义路径,可改用 data.aws_iam_role.target_role.name_with_path policy_arn = aws_iam_policy.my_policy.arn }
如果该IAM角色是你当前Terraform代码中定义的资源,直接引用资源的name属性即可,不需要硬编码ARN:
resource "aws_iam_role" "my_role" { name = "my_role_name" # 其他角色配置... } resource "aws_iam_role_policy_attachment" "my-policy-attachment" { role = aws_iam_role.my_role.name policy_arn = aws_iam_policy.my_policy.arn }
内容的提问来源于stack exchange,提问作者Jessica
相关产品推荐
相关产品推荐

