Closed6

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

not75743not75743

きっかけ

IAMポリシーを作る際に、tfファイル内に記載すると見通しが悪いので、外部ファイルに移したい

not75743not75743

fileを試す(準備)

main.tf
locals {
  file_content = file("${path.module}/test.json")
}

output "example_output" {
  value = local.file_content
}
test.json
{
  "str": "test",
  "num": 3
}

実行

terraform apply
... 略 ...
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

example_output = <<EOT
{
  "str": "test",
  "num": 3
}

EOT

問題なくjsonファイルを読み込み、出力できた

not75743not75743

templatefileを試す(準備)

ドキュメントはここ
https://developer.hashicorp.com/terraform/language/functions/templatefile

tftplを拡張子にしてますね。
データフォーマットをわかりやすくするためにそのまま.jsonで試します。

main.tf
locals {
  file_content = templatefile("${path.module}/test.json",
    {
      str = "test",
      num = 3
    }
  )
}

output "example_output" {
  value = local.file_content
}
test.json
{
  "str": "${str}",
  "num": ${num}
}

実行

terraform apply
... 略 ...
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

example_output = <<EOT
{
  "str": "test",
  "num": 3
}

EOT

こちらも問題なし。動的参照する場合はこちら

not75743not75743

IAMポリシーで試す(準備)

本来の目的であるIAMポリシーで試してみます。

main.tf
locals {
  policy_template = templatefile("${path.module}/policy.json", 
    {
      bucket_name    = "test-bucket-20230515"
    }
  )
}

resource "aws_iam_policy" "example_policy" {
  name   = "example-policy"
  policy = local.policy_template
}

resource "aws_iam_role" "example_role" {
  name               = "example-role"
  assume_role_policy = jsonencode({
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": "ec2.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }
    ]
  })
}

resource "aws_iam_role_policy_attachment" "example_attachment" {
  role       = aws_iam_role.example_role.name
  policy_arn = aws_iam_policy.example_policy.arn
}
policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::${bucket_name}/*"
    }
  ]
}

s3バケット名を動的に指定するだけです

実行

$ terraform apply --auto-approve
... 略 ...
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

問題なし

このスクラップは2023/05/15にクローズされました