如何使用Terraform将多个IAM策略附加到IAM角色?

Pra*_*rma 10 amazon-web-services amazon-iam terraform

我想将多个IAM策略ARN附加到单个IAM角色.

一种方法是创建具有所有策略(多个策略)特权的新策略.

但在AWS,我们有一些预定义的IAM策略,例如AmazonEC2FullAccess,AmazomS3FullAccess等我想用它们的组合为我的角色.

我在Terraform文档中找不到这样做的方法.

根据文档,我们可以使用aws_iam_role_policy_attachment将策略附加到角色,但不能将多个策略附加到角色,因为这可以通过AWS控制台获得.

如果有方法可以做同样的事情,或者它仍然是要添加的功能,请告诉我.

我使用的Terraform版本是 v0.9.5

Fal*_*zky 25

对于 Terraform 版本 >= 0.12,添加多个策略的最简洁方法可能是这样的:

resource "aws_iam_role_policy_attachment" "role-policy-attachment" {
  for_each = toset([
    "arn:aws:iam::aws:policy/AmazonEC2FullAccess", 
    "arn:aws:iam::aws:policy/AmazonS3FullAccess"
  ])

  role       = var.iam_role_name
  policy_arn = each.value
}
Run Code Online (Sandbox Code Playgroud)

如 Pranshu Verma 的回答所述,策略列表也可以放入变量中。

使用for_eachforcount的优点是,列表中的插入被 terraform 正确识别,因此它实际上只会添加一个策略,而 count 插入后的所有策略都将被更改(此博客文章对此进行了详细描述)

  • 完整的错误消息供参考:`“for_each”值取决于资源属性,这些属性在应用之前无法确定,因此 Terraform 无法预测将创建多少个实例。要解决此问题,请使用 -target 参数首先仅应用 for_each 所依赖的资源。 (3认同)
  • 事实上,如果集合中有引用,“for_each”就不起作用。例如 `for_each = toset(["arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy", aws_iam_policy.handy_ecs_tasks_execution_role_iam_policy.arn])`。然而,“count”在这种情况下工作得很好。 (3认同)

Pra*_*rma 17

谢谢Krishna Kumar R的提示.

我从你的回答中得到了更好的回答.

# Define policy ARNs as list
variable "iam_policy_arn" {
  description = "IAM Policy to be attached to role"
  type = "list"
}

# Then parse through the list using count
resource "aws_iam_role_policy_attachment" "role-policy-attachment" {
  role       = "${var.iam_role_name}"
  count      = "${length(var.iam_policy_arn)}"
  policy_arn = "${var.iam_policy_arn[count.index]}"
}
Run Code Online (Sandbox Code Playgroud)


kri*_*004 7

你尝试过这样的事情:

resource "aws_iam_role" "iam_role_name" {
  name = "iam_role_name"
}

resource "aws_iam_role_policy_attachment" "mgd_pol_1" {
  name       = "mgd_pol_attach_name"
  role       = "${aws_iam_role.iam_role_name.name}"
  policy_arn = "${aws_iam_policy.mgd_pol_1.arn}"
}

resource "aws_iam_role_policy_attachment" "mgd_pol_2" {
  name       = "mgd_pol_attach_name"
  role       = "${aws_iam_role.iam_role_name.name}"
  policy_arn = "${aws_iam_policy.mgd_pol_2.arn}"
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这解决了我的目的,但是是否可以有一种更简洁的方法来将 ARN 作为列表传递。实际上,我以类似的方式创建了一个模块来创建附加多个策略的角色,但执行两次会覆盖以前的附件。 (2认同)
  • Should_role_policy 是“aws_iam_role”中的必填字段 (2认同)