📁

Terraformで外部ファイルを読み込む🪐

2023/05/15に公開

前置き

Terraformでfiletemplatefileを使うと、外部ファイルを読み込むことができます。
https://developer.hashicorp.com/terraform/language/functions/file
https://developer.hashicorp.com/terraform/language/functions/templatefile

今回は特定のs3バケットのみアクセスを許可するIAMポリシーを例にしたいと思います。

policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::test-s3-bucket/*"
    }
  ]
}

外部ファイルを読み込まない(tfファイルにそのまま記載)

ヒアドキュメント内に直接ポリシーをかけます。

main.tf
resource "aws_iam_policy" "sample_policy" {
  name        = "sample-policy"
  description = "Sample IAM policy"
  policy      = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::test-s3-bucket/*"
    }
  ]
}
EOF
}

fileを使用する

policy.jsonをfileで参照します。

policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::test-s3-bucket/*"
    }
  ]
}
main.tf
resource "aws_iam_policy" "sample_policy" {
  name        = "sample-policy"
  description = "Sample IAM policy"
  policy      = file("${path.module}/policy.json")
}

templatefileを使用する(動的参照)

templatefileでは変数を与えることで、外部ファイル内でその内容が使用出来るようになります。
以下ではpolicy.jsonにバケット名(bucket_name)を与えています。

policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::${bucket_name}/*"
    }
  ]
}
main.tf
resource "aws_iam_policy" "sample_policy" {
  name        = "sample-policy"
  description = "Sample IAM policy"
  policy      = templatefile("${path.module}/policy.json",
    {
      bucket_name = "test-s3-bucket" 
    }
  )
}

参考

https://cloud.google.com/docs/terraform/best-practices-for-terraform?hl=ja#static-files
https://dev.classmethod.jp/articles/writing-iam-policy-with-terraform/

Discussion