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)
# 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 可用于将角色从数据输出中分离出来。
归档时间: |
|
查看次数: |
4669 次 |
最近记录: |