如何从 AWS 角色的 ARN 获取其友好名称?

Jes*_*ica 7 amazon-web-services terraform

我正在尝试将策略附加到 Terraform 中的 IAM 角色。我只知道角色的 ARN 号,而不知道它的“友好名称”。但策略附件功能要求我使用友好名称,而不是 ARN 编号。

如果我已有 ARN 编号,如何获取 IAM 角色的友好名称?

这是我到目前为止所得到的 - 它给了我“ValidationError:roleName 的指定值无效。它必须仅包含字母数字字符和/或以下内容:+=,.@_-”。我相信这是因为我使用角色名称的 ARN 编号而不是友好的角色名称。

resource "aws_iam_role_policy_attachment" "my-policy-attachment" {
  role       = "arn:aws:iam::my_user_account_id:role/my_role_name"
  policy_arn = aws_iam_policy.my_policy.arn
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

yda*_*coR 12

“友好名称”只是 ARN 的最后一部分。

因此,arn:aws:iam::my_user_account_id:role/my_role_name友好的名称将是my_role_name。您可以使用 Terraform 通过split如下方式天真地实现这一点:

resource "aws_iam_role_policy_attachment" "my-policy-attachment" {
  role       = split("/", "arn:aws:iam::my_user_account_id:role/my_role_name")[1]
  policy_arn = aws_iam_policy.my_policy.arn
}
Run Code Online (Sandbox Code Playgroud)

或者,也许更好,像这样:

variable "role_arn" {}

locals {
  role_friendly_name = split("/", var.role_arn)[1]
}

resource "aws_iam_role_policy_attachment" "my-policy-attachment" {
  role       = local.role_friendly_name
  policy_arn = aws_iam_policy.my_policy.arn
}
Run Code Online (Sandbox Code Playgroud)

这适用于这种情况,但您可能还需要考虑其中也有路径前缀的角色。然后,这将为您提供一个看起来更像的 ARN arn:aws:iam::123456789012:role/service-role/AWSBackupDefaultServiceRole,因此上面的内容将返回service-role

在某些语言中,您可以使用负索引来访问列表末尾的内容,但 Terraform/HCL2 目前不允许这样做(请参阅此功能请求)。因此我们也需要使用该length函数

variable "role_arn" {}

locals {
  role_split = split("/", var.role_arn)[1]
  role_friendly_name = local.role_split[length(local.role_split) - 1]
}

resource "aws_iam_role_policy_attachment" "my-policy-attachment" {
  role       = local.role_friendly_name
  policy_arn = aws_iam_policy.my_policy.arn
}
Run Code Online (Sandbox Code Playgroud)


Pik*_*oon 5

# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/arn#resource

data "aws_arn" "ecs_role" {
  arn = aws_iam_role.ecs_task_role.arn
}
Run Code Online (Sandbox Code Playgroud)

上面的示例 arn 为 = arn:aws:iam:abc:role/app/task/ecs_task_role

# https://www.terraform.io/language/functions/trimprefix

locals {
  ecs_task_role_name = trimprefix(data.aws_arn.ecs_role.resource, "role/")
}
Run Code Online (Sandbox Code Playgroud)

data.aws_arn_ecs_role.resource 将解析为:role/app/task/ecs_task_role。现在,trimprefix 可用于将角色从数据输出中分离出来。