はじめに
Terraformで複数リソースを生成する方法として、count
とfor_each
があるので使い方を簡単にまとめます。
countの使い方
countを使うと、指定した回数、リソースを生成することができます。
試しにIAMユーザーを2個作成します。
# ---------------------------------------------
# Terraform configuration
# ---------------------------------------------
terraform {
required_version = ">=0.13"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
}
provider "aws" {
profile = "terraform" # ご自身のaws profile
region = "ap-northeast-1"
}
# ---------------------------------------------
# IAM User
# ---------------------------------------------
resource "aws_iam_user" "user" {
count = 2
name = "testuser-${count.index}"
}
実行します。
$ terraform apply
AWSコンソールを確認すると、countで指定した2個のIAMユーザーが作成されていることがわかります。
${count.index}
は0から始まっていることがわかります。
for_eachの使い方
for_eachを使うと、指定されたmapを展開しながら、複数リソースを生成することができます。
試しにサブネットを3個作成します。
for_eachは、キーバリュー形式で値を指定します。
for_each = {
"192.168.1.0/24" = "ap-northeast-1a"
"192.168.2.0/24" = "ap-northeast-1c"
"192.168.3.0/24" = "ap-northeast-1d"
}
each.keyとeach.valueで値を取得することができます。
cidr_block = each.key
availability_zone = each.value
実際のコードは、下記になります。
terraform {
required_version = ">=1.3"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
}
provider "aws" {
profile = "terraform"
region = "ap-northeast-1"
}
# ---------------------------------------------
# Network
# ---------------------------------------------
resource "aws_vpc" "vpc" {
cidr_block = "192.168.0.0/20"
}
resource "aws_subnet" "subnet" {
# キーバリュー形式で値を指定
for_each = {
"192.168.1.0/24" = "ap-northeast-1a"
"192.168.2.0/24" = "ap-northeast-1c"
"192.168.3.0/24" = "ap-northeast-1d"
}
# each.keyとeach.valueで値を取得
vpc_id = aws_vpc.vpc.id
cidr_block = each.key
availability_zone = each.value
}
実行します。
$ terraform apply
特に問題がなければ、AWSコンソールを確認すると、for_eachを使って作成されたサブネットが3つ生成されていることがわかります。
以上です。Terraformのcountとfor_eachを使って、複数リソースを生成してみました。