![](/img/trans.png)
[英]AWS CDK : how to get 'Arn' of an already created role or policy by their names
[英]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.