Terraform:将AWS托管策略附加到角色的正确方法?

时间:2017-07-10 00:24:58

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

我想将一个预先存在的AWS托管角色附加到策略中,这是我当前的代码:

resource "aws_iam_role_policy_attachment" "sto-readonly-role-policy-attach" {
  role       = "${aws_iam_role.sto-test-role.name}"
  policy_arn = "arn:aws:iam::aws:policy/ReadOnlyAccess"
}

是否有更好的方法来建模托管策略然后引用它而不是硬编码ARN?看起来每当我对ARN /路径或其他类似的东西进行硬编码时,我通常会发现以后有更好的方法。

Terraform中是否存在对托管策略进行建模的内容?或者是难以将ARN硬编码为“正确”的方式吗?

2 个答案:

答案 0 :(得分:51)

IAM Policy data source对此非常有用。数据资源用于描述Terraform未主动管理但由Terraform引用的数据或资源。

对于您的示例,您将为托管策略创建数据资源,如下所示:

data "aws_iam_policy" "ReadOnlyAccess" {
  arn = "arn:aws:iam::aws:policy/ReadOnlyAccess"
}

在这种情况下,数据源的名称ReadOnlyAccess完全取决于您。对于托管策略,为了保持一致性,我使用与策略名称相同的名称,但如果适合您,您可以轻松地将其命名为readonly

然后,您将IAM策略附加到您的角色,如下所示:

resource "aws_iam_role_policy_attachment" "sto-readonly-role-policy-attach" {
  role       = "${aws_iam_role.sto-test-role.name}"
  policy_arn = "${data.aws_iam_policy.ReadOnlyAccess.arn}"
}

答案 1 :(得分:11)

当使用Terraform本身不直接管理的值时,您有几个选项。

第一个,最简单的选择就是像在这里一样硬编码值。如果您希望该值永远不会改变,这是一个简单的答案。鉴于这些“预制策略”已记录在案,内置的AWS功能可能符合此标准。

第二个选项是创建一个Terraform模块并将值硬编码到 中,然后从其他几个模块中引用该模块。这允许您集中管理值并多次使用它。仅包含输出的模块是此类事物的常见模式,但您也可以选择创建一个包含aws_iam_role_policy_attachment资源的模块,其中角色设置自变量。

第三个选项是将值放在Terraform可以从中检索值的某个位置,例如Consul,然后使用数据源从那里检索它。只使用Terraform,这最终大致相当于第二个选项,但这意味着Terraform会在每次刷新时重新读取它,而不是仅在使用terraform init -upgrade更新模块时才读取它,因此这可能是对于经常变化的价值的更好选择。

第四个选项是使用可以直接从真实来源读取值的专用数据源。 Terraform目前没有数据源来获取有关AWS托管策略的信息,因此这不是您当前情况的选项,但可用于获取其他AWS定义的数据,例如AWS IP地址范围,服务ARN等

哪一种适合特定情况将取决于价值变化的频率,管理变更的人员以及专用Terraform数据源的可用性。