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を使うと複数のリソースをとても簡単に作成できる事が分かりました。countやfor eachでももっと色々出来るので今後も引き続き試して行きたいと思います。
 Terraform メタ引数にはcountやfor eachのほかにも色々ありますのでこちらも試してみたいと思います。

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

Terraformの記事一覧

スポンサーリンク