Terraformのメタ引数(countとfor_each)を使って複数のリソースをまとめて作成

Azure,Others,Terraform

Terraformのメタ引数であるcountやfor_eachを使うと、1つのブロックで複数のリソースを作成することができます。
今回は、countとfor_eachを利用して、複数のAzureリソースを作成する手順を確認します。

スポンサーリンク

Terraformのメタ引数とは

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

Terraformのメタ引数一覧

Terraformのメタ引数には、利用用途に応じてさまざまな種類があります。

項目 概要

count

resource block内でcountを指定することができます。
countで指定した数だけリソースを作成できます。

provider

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

複数のリソース作成に関するメタ引数はcountとfor_each

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

※countは、予期せぬリソース削除が発生することがあるため注意が必要です。

Terraformのcountとfor_eachを使って複数リソースをまとめて作成する方法

countを使った複数リソース作成方法

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

countを使ったリソースグループ作成方法

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からcount-rg-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. 

for_eachを使った複数リソース作成方法

for_eachを使った例として、1つのresource block内でeach-rg-X(Xは名前の一部)という名前のリソースグループを3つ作成します。

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

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. 

for_eachとtoset関数を合せて使う

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

for eachとtoset関数を組み合わせて使う

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

スポンサーリンク