web-dev-qa-db-ja.com

Terraform:AWS管理ポリシーをロールにアタッチする正しい方法は?

既存のAWS管理ロールの1つをポリシーに添付したいのですが、現在のコードは次のとおりです。

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をハードコーディングする「正しい」方法ですか?

37
Shorn

IAMポリシーデータソース はこれに最適です。データリソースは、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}"
}
68
jorelli

Terraform自体が直接管理しない値を使用する場合、いくつかのオプションがあります。

最初の最も簡単なオプションは、ここで行ったように値をハードコーディングすることです。値が決して変わらないことが予想される場合、これは簡単な答えです。これらの「既定のポリシー」が文書化されていることを考えると、組み込みのAWS機能はおそらくこの基準に適合しています。

2番目のオプションは、Terraformモジュールを作成し、値をthatにハードコードしてから、このモジュールを他のいくつかのモジュールから参照することです。これにより、値を一元管理し、何度も使用できます。出力のみを含むモジュールはこの種の一般的なパターンですが、変数から設定されたロールを持つaws_iam_role_policy_attachmentリソースを含むモジュールを作成することもできます。

3番目のオプションは、TerraformがConsulなどの値を取得できる場所に値を配置し、データソースを使用してそこから値を取得することです。 Terraformのみが有効な場合、これは2番目のオプションとほぼ同等になりますが、Terraformはterraform init -upgradeを使用してモジュールを更新するときだけでなく、更新のたびにそれを再読み取りすることを意味します。頻繁に変化する値のためのより良いオプション。

4番目のオプションは、真理のソースから値を直接読み取ることができる特殊なデータソースを使用することです。 Terraformは現在have AWS管理ポリシーの情報を取得するためのデータソースではないため、これは現在の状況のオプションではありませんが、AWS IPなどの他のAWS定義データを取得するために使用できますアドレス範囲、サービスARNなど。

これらのどれが特定の状況に適切であるかは、値がどのくらい頻繁に変化するか、誰がその変化を管理するか、そして特殊なTerraformデータソースの可用性に依存します。

13
Martin Atkins