簡體   English   中英

如何從 ARN 中獲取 AWS 角色的友好名稱?

[英]How to get an AWS role's friendly name from its ARN?

我正在嘗試將策略附加到 Terraform 中的 IAM 角色。我只知道角色的 ARN 編號,不知道它的“友好名稱”。 但政策附件 function 要求我使用友好名稱,而不是 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
}

謝謝!

“友好名稱”只是 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
}

或者,也許更好,像這樣:

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
}

這適用於這種情況,但您可能還需要考慮其中也有路徑前綴的角色。 然后,這將為您提供一個看起來更像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
}
# 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
}

上面的示例 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/")
}

data.aws_arn_ecs_role.resource 將解析為: role/app/task/ecs_task_role 現在 trimprefix 可用於從數據 output 中拆分角色

還可以使用諸如trimprefix 之類的函數 在這種情況下有助於從 arn 獲取負載均衡器名稱。

load_balancer_arn = "arn:aws:elasticloadbalancing:us-east-1:xxxxx:loadbalancer/app/awseb-AWSEB-xxxx/xxxxxx"

locals {
  arn_split          = split("/", var.load_balancer_arn)
  load_balancer_name = trimprefix(trimprefix(var.load_balancer_arn, local.arn_split[0]), "/")
}

returns "app/awseb-AWSEB-xxxx/xxxxxx"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM