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

时间:2017-08-03 13:43:26

标签: amazon-web-services amazon-iam terraform

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

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

但在AWS中,我们有一些预定义的IAM政策,例如AmazonEC2FullAccessAmazomS3FullAccess等。我想将这些政策的组合用于我的角色。

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

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

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

我使用的Terraform版本是v0.9.5

6 个答案:

答案 0 :(得分:14)

感谢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]}"
}

答案 1 :(得分:12)

对于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
}

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

使用for_each代替count的优点是,terraform可以正确识别列表中的插入内容,因此它实际上只会添加一个策略,而在插入后计算所有策略时,进行更改(这在this blog post中有详细说明)

答案 2 :(得分: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}"
}

答案 3 :(得分:0)

我有很多角色,每个角色都有很多政策。我可以遍历角色,但是随后如何遍历嵌套的策略列表呢? aws_iam_role_policy_attachment属性角色或策略属性将仅是列表,第二个列表(策略)取决于第一个列表(角色)。

resource "aws_iam_role_policy_attachment" "mgd_pol_2" {
 count      =  local.roles
 role       = "${local.roles[count.index]}"
 policy_arn = "arn:aws:iam::${var.accountId}:policy/${local.roles[count.index].policies[???]}"
 }
 [{role_name: role1,  policies: ["AdministratorAccess"]},
  {role_name: role2,  policies: ["NetworkAdminAccess", "ReadOnlyAccess"]}]

答案 4 :(得分:0)

添加另一个选项,该选项类似于例外的答案,但代替:

backgroundColor

您可以使用element function

policy_arn = "${var.iam_policy_arn[count.index]}"

我认为在某些情况下(例如具有大量代码的项目),这可能更具可读性。

答案 5 :(得分:0)

这是我如何做到的一个例子:

resource "aws_iam_group_policy_attachment" "policy_attach_example" {
  for_each   = aws_iam_policy.example
  group      = aws_iam_group.example.name
  policy_arn = each.value["arn"]
}

因此,基本上“ aws_iam_policy.example”是我使用for_each以相同方式制定的策略列表

希望这对您有帮助,我知道我来晚了,但是我遇到了类似的问题