Closed6
terraformで外部ファイルを読み込む
きっかけ
IAMポリシーを作る際に、tfファイル内に記載すると見通しが悪いので、外部ファイルに移したい
事前調査
file
、templatefile
を使うと外だしできそう。
templatefile
は動的参照も可能とのこと、試してみる
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ファイルを読み込み、出力できた
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
こちらも問題なし。動的参照する場合はこちら
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にクローズされました