Terraformのメタ引数(Count,for each)を使ってAzureリソースをデプロイ

Azure,Terraform

 Terraform メタ引数のcountやfor eachを使うと1つのblockで複数のリソースを作成する事が出来ます。
 今回はcountとfor eachを使って複数のAzureリソースグループを纏めて作成してみました。

 Terraform関連の記事はこちらに記載しております。

Terraformの記事一覧

スポンサーリンク

Terraform メタ引数とは

 Terraformのメタ引数を使うと複数リソース作成、リソース作成方法の指定やマルチプロバイダーの設定など柔軟なリソース作成設定をする事が出来ます。

Terraform メタ引数一覧

 Terraformのメタ引数には利用用途に合わせて様々な種類があります。

項目 概要

count

resource block内でカウントを指定する事が出来ます。
カウントで指定した数分のリソースを作成出来ます。

provider

プロバイダー構成するメタ引数になります。
複数のプロバイダーを指定する事が出来ます。
lifecycle リソース変更に関する指定が出来ます。
リソース削除前に新規リソース作成するや、削除を許可しない等の設定が出来ます。オプションにはcreate_before_destroy、prevent_destroy、ignore_changesがあります。 
for_each resource block内でリソースのリストを指定する事が出来ます。同じ設定だけど名前だけ違うような場合等に使用すると、リストに記載した名前でリソースを作成する事が出来ます。
depends_on リソースの依存関係を指定する事が出来ます。
関連しなリソース(Terraformが認識できない)の作成順を指定する場合等に利用されます。

Terraform メタ引数の中で複数リソース作成に関するのはcountとfor each

 同一blockで複数リソース作成する為に必要なメタ引数はcountとfor eachの2つです。
 countは1-10のようにナンバリングしたようなリソースを作成するような場合に利用されます。
 for eachはリスト化した文字列などでリソースを作成するような場合に利用されます。

※countは予期せぬリソース削除される事があり注意が必要です。

Terraform countとfor eachを使ってAzureリソースグループをデプロイ

countを使ったテンプレートファイル

 countを使った一番の簡単な例として3つリソースグループをcount-rg-X(カウント)で作成してみました。
 1つのresource blockでcount-rg-[0-2]と言う名前のリソースグループを米国東部2に作成します。

countを使ってリソースグループをデプロイ

設定は2つです。resource block内に記載します。

  • resource block(azurerm_resource_group)内でcountで作成するリソースの数を指定する。
  • resource block(azurerm_resource_group)内で名前に${count.index}でcount数を付与する。

とても簡単に設定が出来ます。

terraform {

 required_version = “>= 1.0.0"
 required_providers {
  azurerm = {
   source = “hashicorp/azurerm"
   version = “>= 2.0"
}}}

provider “azurerm" {
 features {}
}

resource “azurerm_resource_group" “count-rg" {
  count = 3

  name = “count-rg-${count.index}"

  location = “East US2"
}

countを使って作成されたリソースグループを確認

 terraform apply実行後に作成されたリソースグループを確認します。

リソースグループの確認

terraform apply(Plan)を実行するとリソースの作成計画が表示されます。

計画を見るとPlan: 3 to addとなっており、3つのリソースを作成される事が確認出来ます。

リソースグループ名がcount-rg-0から2となっている事が確認出来ます。

# azurerm_resource_group.count-rg[0] will be created

+ resource “azurerm_resource_group" “count-rg" {
+ id = (known after apply)
+ location = “eastus2"
+ name = “count-rg-0"
}

# azurerm_resource_group.count-rg[1] will be created
+ resource “azurerm_resource_group" “count-rg" {
+ id = (known after apply)
+ location = “eastus2"
+ name = “count-rg-1"
}

# azurerm_resource_group.count-rg[2] will be created
+ resource “azurerm_resource_group" “count-rg" {
+ id = (known after apply)
+ location = “eastus2"
+ name = “count-rg-2"
}

Plan: 3 to add, 0 to change, 0 to destroy. 

Azure Portalでもリソースグループを確認してみます。count-rg-0から2が作成されている事が分かります。

for eachを使ったテンプレートファイル

 for eachを使った簡単な例として1つresource block内でeach-rg-Xと言う名前のリソースグループを3つ作成してみます。

    • 作成リソース
      • each-rg-dc1(米国東部2)
      • each-rg-dc2(東日本)
      • each-rg-dc3(西日本)
for eachを使ってリソースグループをデプロイ

設定は3つです。resource block内に記載します。

  • for_each = {・・・}でリストを作成
  • nameでeach.key(dcX)を指定
  • locationでeach.valueを指定

for_each = {Key = “value"}で構成されます。each.keyがdc1の時、each.valueはeastus2になります。

terraform {
 required_version = “>= 1.0.0"
 required_providers {
  azurerm = {
   source = “hashicorp/azurerm"
   version = “>= 2.0"
  }
 }
}

provider “azurerm" {
 features {}
}
resource “azurerm_resource_group" “each-rg-01" {
  for_each = {
    dc1 = “eastus2"
    dc2 = “japaneast"
    dc3 = “japanwest"
  }
  name = “each-rg-${each.key}"
  location = each.value
}

for eachを使って作成されたリソースグループを確認

 terraform apply実行後に作成されたリソースグループを確認します。

リソースグループを確認

terraform apply(Plan)を実行するとリソースの作成計画が表示されます。

計画を見るとPlan: 3 to addとなっており、3つのリソースを作成される事が確認出来ます。

リソースグループ名がeach-rg-dcXとなっている事が確認出来ます。locationもそれぞれの値が設定されている事が分かります。

# azurerm_resource_group.each-rg-01[“dc1"] will be created
+ resource “azurerm_resource_group" “each-rg-01" {
+ id = (known after apply)
+ location = “eastus2"
+ name = “each-rg-dc1"
}

# azurerm_resource_group.each-rg-01[“dc2"] will be created
+ resource “azurerm_resource_group" “each-rg-01" {
+ id = (known after apply)
+ location = “japaneast"
+ name = “each-rg-dc2"
}

# azurerm_resource_group.each-rg-01[“dc3"] will be created
+ resource “azurerm_resource_group" “each-rg-01" {
+ id = (known after apply)
+ location = “japanwest"
+ name = “each-rg-dc3"
}

Plan: 3 to add, 0 to change, 0 to destroy. 

Azure Portalでもリソースグループを確認してみます。each-rg-dc1から3が作成されている事が分かります。locationもそれぞれの場所に作成されています。

for eachでtosetを使ってみる

 toset関数を使ってfor eachに設定値を渡すことも可能です。
 toset関数の詳細はTeraform公式サイトを参照ください。

for eachのを使ってリソースグループをデプロイ

resource block内でtoset関数を記載しています。

  • for_each = toset([“eastus2", “japaneast", “japanwest"])として設定値を作成
  • nameでeach.keyを指定
  • locationでeach.keyを指定

 

terraform {
 required_version = “>= 1.0.0"
 required_providers {
  azurerm = {
   source = “hashicorp/azurerm"
   version = “>= 2.0"
  }
 }
}

provider “azurerm" {
 features {}
}
resource “azurerm_resource_group" “each-rg-01" {
  for_each = toset([“eastus2", “japaneast", “japanwest"])
  name = “each-rg-${each.key}"
  location = each.key
}

terraform apply(Plan)を実行すると、3つのリソースグループが作成されます。

リソースグループ名がeach-rg-[toset関数で指定した設定値]となっている事が確認出来ます。locationもそれぞれの値が設定されている事が分かります。

# azurerm_resource_group.each-rg-01[“eastus2"] will be created
+ resource “azurerm_resource_group" “each-rg-01" {
+ id = (known after apply)
+ location = “eastus2"
+ name = “each-rg-eastus2"
}

# azurerm_resource_group.each-rg-01[“japaneast"] will be created
+ resource “azurerm_resource_group" “each-rg-01" {
+ id = (known after apply)
+ location = “japaneast"
+ name = “each-rg-japaneast"
}

# azurerm_resource_group.each-rg-01[“japanwest"] will be created
+ resource “azurerm_resource_group" “each-rg-01" {
+ id = (known after apply)
+ location = “japanwest"
+ name = “each-rg-japanwest"
}

Plan: 3 to add, 0 to change, 0 to destroy.

最後に

 countやfor eachを使うと複数のリソースをとても簡単に作成できる事が分かりました。
 Terraform メタ引数にはcountやfor eachのほかにも色々ありますのでこちらも試してみたいと思います。

 Terraform関連の記事はこちらに記載しております。

Terraformの記事一覧

スポンサーリンク