自由気ままに書いちゃおう

好きなことをつらつらと・・・

【Terraform】(初心者向け)jsonencode関数について

今回は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`で定義)に対して許可します。

 

 

以上です。