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について
- for_eachについて
Terraformのコード
以下にECRを作成するために必要なコードを記載します。
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 }