今回はjsonencode関数についてです。
■ はじめに
jsonencode関数はTerraformのリストとマップをそれぞれJSONの配列とオブジェクトに変換します。また、Terraformの文字列はJSONの文字列に、数値はJSONの数値に、真偽値はJSONの真偽値に変換されます。
と、言葉で書くよりも実際にコードを見ながら説明したいと思います。
jsonencode - Functions - Configuration Language | Terraform | HashiCorp Developer
■ サンプルコード(簡易)
locals {
list_example = ["item1", "item2", "item3"]
map_example = {
key1 = "value1"
key2 = "value2"
key3 = "value3"
}
}
上記のlocalsにjsonencode関数を用いて下記の通りoutputすると、
output "json_list" {
value = jsonencode(local.list_example)
}
output "json_map" {
value = jsonencode(local.map_example)
}
結果は以下になります。
■ local.list_example
※ 変化はないです。
["item1", "item2", "item3"]
■ local.map_example
※ = が : になります。
{
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
■ サンプルコード(詳細)
### s3バケット名を定義
variable "bucket_names" {
description = "List of S3 bucket names to create"
type = list(string)
default = ["bucket1", "bucket2", "bucket3"]
}
### s3Actionsを定義
variable "s3_bucket_actions" {
type = list(string)
default = [
"s3:ListAllMyBuckets",
"s3:GetBucketLocation",
"s3:ListBucket",
]
}
### s3バケットを作成
resource "aws_s3_bucket" "bucket" {
count = length(var.bucket_names)
bucket = var.bucket_names[count.index]
force_destroy = true
}
resource "aws_s3_bucket_public_access_block" "bucket" {
count = length(var.bucket_names)
bucket = aws_s3_bucket.bucket[count.index].id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
### 作成したS3バケットのarnを取得し、localsに格納
# for式を用いて作成したS3バケットのARNを取得しリストに格納している。
locals {
s3_bucket_arns = [for b in aws_s3_bucket.bucket : b.arn]
}
### IAMポリシーの作成
resource "aws_iam_policy" "bucket" {
name = "bucket-policy"
description = "An example policy"
policy = <<-EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ${jsonencode(var.s3_bucket_actions)}, ★ 事前定義したvariables変数を利用
"Resource": ${jsonencode(local.s3_bucket_arns)} ★ 事前定義したlocals変数を利用
}
]
}
EOF
}
コードの説明は下記のとおりです。
1. S3バケットの作成
`bucket_names`変数に指定された名前のS3バケットを作成します。
この変数はバケット名のリストとして定義されており、デフォルトでは"bucket1", "bucket2", "bucket3"という名前のバケットを作成します。
バケットは`aws_s3_bucket`リソースを用いて作成され、`count`属性を用いて複数のバケットを作成します。
作成したバケットはパブリックアクセスがブロックされます。
これは`aws_s3_bucket_public_access_block`リソースを用いて制御され、バケットごとに設定が行われます。
2. IAMポリシーの作成
S3バケットへのアクセスを許可するIAMポリシーが作成されます。
このポリシーは、特定のアクション(`s3_bucket_actions`変数で定義)を、作成したS3バケット(`local.s3_bucket_arns`で定義)に対して許可します。
以上です。