Azureリソース作成しながらTerraformのメタ引数(Count,for each)を試してみた

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

 Terraform初心者が色々やってみた内容を公開しています。過去の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リソースグループをデプロイ

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

 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"
}

Terraform Applyを実行してリソースグループを確認してみる

 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が作成されている事が分かります。

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

 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
}

Terraform Applyを実行してリソースグループを確認してみる

 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の記事一覧