🐣

mapとfor_eachで複数オブジェクトを作成する - Terraformのきほんと応用

2022/06/26に公開

ていねいを心掛けたTerraform記事です。スクリーンショット満載でやった気になれます。
Terraformといえばクラウドリソースの作成ですが、この記事ではローカルPC上のリソース作成で済むように工夫しています。
Terraform関連の他の記事は「Terraformのきほんと応用」からどうぞ。

概要

terraformを使用していると、だいたい同じだけど少しだけ設定が違うオブジェクトを複数作りたい場合が出てきます。例えば、サブネット(ciderが異なる)、ユーザー(IDが異なる)などです。
このような場合にはfor_eachを使用します。また、差分となる設定はmap形式で定義するとソースが読みやすく保守性が高くなります。
この記事では、map形式の設定とfor_eachを使ってローカルに複数のファイルを作成します。

ゴール

mapとfor_eachを使って複数のファイルを作成します。

必要なもの

  • 作業時間:15分
  • Terraformを実行できる環境

map型で設定値を定義する

map型は「項目名=値」の形式で定義します。わかりやすい項目名をつけることで理解しやすくなります。 コードを書いている瞬間は些細な事と感じるかもしれませんが、これは保守性に絶大な影響を与えます。
たとえば、設定ファイルに以下の用なブロックが定義されていた場合、この値がどのように使われていてるか推測しやすいのではないでしょうか。

example_setting.tf
subnets = {
  "app" = { az = "1a", cidr = "10.1.0.0/24", public = true }
  "db"  = { az = "1c", cidr = "10.2.0.0/24", public = false }
}
users = {
  "admin" = { name = "admin", role = "admin" }
  "foo"   = { name = "foo",   role = "user" }
  "bar"   = { name = "bar",   role = "user" }
}   

for_eachで複数オブジェクトの作成する

terraformで作成するすべてのリソースはfor_eachを指定することができます。
for_eachにはmap型の値を指定することができます。(Set型も指定できますが、この記事の対象外)
for_eachを指定したリソースでは以下の特別な変数を使用することができます。名前の通り項目名と値を表します。

  • each.key
  • each.value
network.tf
// サブネットの定義(仮想です)
resource "subnet" "subnets" {
  for_each = local.subnets
  name     = each.key
  az       = eavch.value.az
  cidr     = eavch.value.cidr
  public   = eavch.value.public
}

本家のfor_each解説はこちら。(英語)

mapとfor_eachによる複数ファイル作成の例

  1. map型でファイルの情報を定義する
    ファイル名と内容が異なるファイルを複数作成するための定義を作成します。

    locals {
      files = {
        "hello" = {
          name    = "hello.txt"
          content = "hello wolrd."
        }
        "foobar" = {
          name    = "foobar.txt"
          content = "foo bar."
        }
      }
    }
    
  2. ファイル作成リソースにfor_eachを定義する
    ファイルを作成するリソース定義をfor_eachで複数作成します。

    resource "local_file" "local_sample" {
      for_each = local.files
      filename = each.value.name
      content  = each.value.content
    }
    
  3. 初期化処理を実行する
    「init」コマンドで初期化します。

    terraform init
    

    exec init

  4. 実行結果を事前確認する
    「plan」コマンドで実行結果を事前確認します。

    terraform plan
    

    ファイル foobar.txt と hello.txt が作成されそうです。
    exec plan

  5. 実行してファイルを作成する
    「apply」コマンドでファイルを作成します。

    terraform apply
    

    exec plan
    以下の通り2つのファイルが作成されました。
    exec plan
    ファイルの内容もパラメーターで指定した通りです。
    exec plan
    exec plan

サンプルコード

この記事で作成したコードはgithub上に公開しています。

次はこれをやろう

Terraform関連の他の記事は「Terraformのきほんと応用」からどうぞ。

GitHubで編集を提案

Discussion