My Note

自己理解のためのブログ

Terraform学習メモ1 ( mapとfor_eachでECRを作成 )

Terraformが0.12系がリリースされてから使える関数が増えてきているのでTerraformをまた勉強しはじめました。 そのときの "学習メモ" として書いていきます。(あくまで学習メモということで書いていきますので、間違い等あるかもなのでご了承ください🙏) 今回はmapとfor_eachを使って awsのECRを作成しました。

  • 環境
    • Terraform v0.12.20
    • tfenv 1.0.2
    • terraform-cloud

mapとfor_eachについて

  • mapについて

learn.hashicorp.com

  • for_eachについて

www.hashicorp.com

Terraformのコード

以下にECRを作成するために必要なコードを記載します。

www.terraform.io

ecrをterraformで作成するために今回は以下のパラメータを利用しました。

  • name
  • image_tag_mutability
  • scan_on_push

ECRでレポジトリを複数作成する場合には、レポジトリ毎に3つのパラメータを渡す必要があります。 variablesにそれぞれ変数を定義したり、 module の宣言もレポジトリ毎に作成するのは手間ですよね.. for_eachを利用する以外には、listとcount/index を使って作成することもできますが、version0.12.6からmapとfor_eachを組み合わせて使えるようになったので、 mapとfor_eachを使って効率良く作成することにします。

■ module側(呼び出し)

repositories という多次元連想配列のようにmapを宣言します。

module "ecr" {
  source = "../../modules/ecr"

  repositories = {
    api1-v1 = {
      name                 = "api-v1"
      image_tag_mutability = "MUTABLE"
      scan_on_push         = true
    },
    api-v2 = {
      name                 = "api-v2"
      image_tag_mutability = "IMMUTABLE"
      scan_on_push         = false
    },
  }
}

■ modulesの定義側(main.tf)

variable "repositories" {
  type = map
}


resource "aws_ecr_repository" "main" {
  for_each = var.repositories

  name                 = each.value.name
  image_tag_mutability = each.value.image_tag_mutability
  image_scanning_configuration {
    scan_on_push = each.value.scan_on_push
  }
}

for_each = var.repositories でmapをfor_eachで読み込み、each.value.key名 で指定したkey名のvalueを取得します。 こう定義することで、mapで宣言した値を api-v1, api-v2の単位で変数を渡してecrにレポジトリを作成しました。

MapをイメージするためにGoで定義した場合

↑のmapで変数を渡してレポジトリを作成するイメージを自分で理解するために、Goで多次元連想配列にしてみました。

repositories := make(map[string]map[string]interface{})

package main

import "fmt"

func main() {
    repositories := make(map[string]map[string]interface{})
    repositories["api-v1"] = make(map[string]interface{})
    repositories["api-v2"] = make(map[string]interface{})

    // api-v1 = {}
    repositories["api-v1"]["name"] = "api-v1"
    repositories["api-v1"]["image_tag_mutability"] = "MUTABLE"
    repositories["api-v1"]["scan_on_push"] = true

    // api-v2 = {}
    repositories["api-v2"]["name"] = "api-v2"
    repositories["api-v2"]["image_tag_mutability"] = "IMMUTABLE"
    repositories["api-v2"]["scan_on_push"] = false

    // output
    fmt.Println(repositories["api-v1"]["name"]) // api-v1
    fmt.Println(repositories["api-v1"]["image_tag_mutability"]) // MUTABLE
    fmt.Println(repositories["api-v1"]["scan_on_push"]) // true
    fmt.Println()
    fmt.Println(repositories["api-v2"]["name"]) // api-v2
    fmt.Println(repositories["api-v2"]["image_tag_mutability"]) // IMMUTABLE
    fmt.Println(repositories["api-v2"]["scan_on_push"]) // false
}