Skip to content

Instantly share code, notes, and snippets.

@imksoo
Created April 5, 2017 06:46
Show Gist options
  • Save imksoo/972bbd1698ffa9a456ec2499d5ce61b8 to your computer and use it in GitHub Desktop.
Save imksoo/972bbd1698ffa9a456ec2499d5ce61b8 to your computer and use it in GitHub Desktop.
TerraformでIAM Roleを書くときはdataを活用しましょう

TerraformでIAM Roleを書くときはdataを活用しましょう

Terraformのヒアドキュメントは改行コードを含めてそのまま保持します。 ということは、特にGit for Windowsを利用している環境では改行コードがLinux/Macとは異なるために不要な差分として検知されることになります。

アンチパターン

ヒアドキュメントでJSONをそのまま書いてしまう
× TerrafromのHCLの中に、いきなりJSONが出てくるのでかっこ悪い
× 改行コードの違いがそのまま反映されてしまう

resource "aws_iam_role_policy" "role_policy_cloudwatch_logs" {
  role = "${aws_iam_role.role.id}"

  policy = <<EOF
{<CRLF>
  "Version": "2012-10-17",<CRLF>
  "Statement": [<CRLF>
    {<CRLF>
      "Action": [<CRLF>
        "logs:CreateLogGroup",<CRLF>
        "logs:CreateLogStream",<CRLF>
        "logs:PutLogEvents",<CRLF>
        "logs:DescribeLogGroups",<CRLF>
        "logs:DescribeLogStreams"<CRLF>
      ],<CRLF>
      "Effect": "Allow",<CRLF>
      "Resource": "*"<CRLF>
    }<CRLF>
  ]<CRLF>
}<CRLF>
EOF
}

ベターパターン

Terraformはdataを組み立てることが可能なので、それを用いる。
◎ 記法がHCLで統一される
◎ Terraformが機械的にJSONを組み立てるので不要な差分は排除される

data "aws_iam_policy_document" "policy_document_cloudwatch_logs" {
  statement {
    actions = [
      "logs:CreateLogGroup",
      "logs:CreateLogStream",
      "logs:PutLogEvents",
      "logs:DescribeLogGroups",
      "logs:DescribeLogStreams",
    ]

    effect    = "Allow"
    resources = ["*"]
  }
}

resource "aws_iam_role_policy" "policy_cloudwatch_logs" {
  role   = "${aws_iam_role.role.id}"
  name   = "policy_cloudwatch_logs"
  policy = "${data.aws_iam_policy_document.policy_document_cloudwatch_logs.json}"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment