`for_each` と `count` によるループ
`count` と `for_each` を使ってリソースやモジュールの複数インスタンスをプロビジョニングし、コレクションやマップを効率的に扱う方法を学びます。
「`for_each` と `count` によるループ」はCoddyKit上の無料Terraform Infrastructure as Codeレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTerraform Infrastructure as Code学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Terraform Infrastructure as Codeコースには全4レッスンが含まれています。
ループの概要
Terraformでインフラを管理していると、似たようなリソースを複数作成する必要がよくあります。Webサーバーを10台、データベースインスタンスを5台作成する場合を考えてみてください。同じコードブロックを何度も書くのは、手間がかかるうえにミスの原因になります。
このレッスンでは、Terraformの強力な2つの機能、countとfor_eachを紹介します。これらを使うと、設定をすっきりと保ちながら、複数のリソースを効率よくプロビジョニングできます。
`count`と`for_each`を使う理由
countやfor_eachのようなループを使うと、次のような大きなメリットがあります。
- 重複の削減:インフラのコードを一度書くだけで、繰り返し利用できます。
- 可読性の向上:設定がよりすっきりし、理解しやすくなります。
- スケーラビリティ:1つの値やコレクションを変更するだけで、リソース数を簡単に調整できます。
- 一貫性:同じ種類のリソースを同じ設定で構成できます。
単純な繰り返しに使う`count`
countメタ引数は、リソースやモジュールのほぼ同一のインスタンスを複数作成するときに適しています。整数値を指定すると、Terraformがその数だけインスタンスを作成します。
countで作成された各インスタンスには、0から count - 1 までのインデックスが割り当てられます。このインデックスにはcount.indexでアクセスできます。
例:`count`を使った複数のEC2インスタンス
同一のAWS EC2インスタンスを3台プロビジョニングします。count.indexを使って、各サーバーに一意の名前を付けている点に注目してください。
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "web_server" {
count = 3
ami = "ami-053b0dcd10dcf2f56" # Ubuntu Server 20.04 LTS
instance_type = "t2.micro"
tags = {
Name = "WebServer-${count.index}"
}
}`count.index`の仕組み
前の例では、各インスタンスに対して ${count.index} が自動的に 0、1、2 として評価されました。これにより、一意の識別子を作成したり、インスタンスごとにプロパティを調整したりできます。
count.indexを使わなければ、3台のサーバーすべてにまったく同じ「Name」タグが付くため、AWSで混乱や問題が生じる可能性があります。
`for_each`の概要
countは単純な繰り返しに適していますが、for_eachはより柔軟です。文字列のセットまたは文字列のマップを反復処理し、要素ごとに1つのインスタンスを作成します。
for_eachは、異なる設定のリソースを管理する場合や、リソース数が数値ではないコレクション(環境名のリストやユーザー設定のマップなど)によって決まる場合に適しています。
例:セットに対する`for_each`
ここでは、for_eachのセット内の各要素を名前にしたS3バケットを3つ作成します。反復処理中の現在の項目にはeach.valueでアクセスします。
provider "aws" {
region = "us-east-1"
}
resource "aws_s3_bucket" "app_buckets" {
for_each = toset(["prod-app-data", "dev-app-logs", "test-app-assets"])
bucket = each.value
acl = "private"
tags = {
Environment = split("-", each.value)[0]
}
}例:マップに対する`for_each`
マップを使うと、リソースごとに、より複雑で一意な設定を定義できます。ここでは、環境キーに基づいて異なるバージョニング設定を持つS3バケットを作成します。
キーにはeach.key、値にはeach.valueでアクセスできます。
provider "aws" {
region = "us-east-1"
}
resource "aws_s3_bucket" "configured_bucket" {
for_each = {
production = { name = "prod-data-bucket", versioning = true }
development = { name = "dev-logs-bucket", versioning = false }
}
bucket = each.value.name
acl = "private"
versioning {
enabled = each.value.versioning
}
tags = {
Environment = each.key
}
}`count`と`for_each`:適切な選択
どちらをいつ使えばよいのでしょうか。
countを使う:単純な数値による反復や、個数が主な関心事となる同一リソースの作成に使用します。識別のためにインデックスだけが必要な場合に適しています。for_eachを使う:複雑なコレクション(セットやマップ)を反復処理するときや、コレクションの要素から一意の識別子やプロパティを設定するときに使用します。各インスタンスに明確で一意の論理識別子がある場合は、通常こちらが適しています。
クイックチェック:ループ
組織内の各チーム用にS3バケットを1つずつ作成し、各バケットにそのチーム固有の保持ポリシーを設定する必要がある場合を考えてみてください。
まとめ:効率的なリソース作成
よくできました。countとfor_eachを活用して、Terraformの設定をより動的かつ効率的にする方法を学びました。
countは、同一リソースを数値で単純に繰り返し作成するために使い、count.indexで各リソースを区別します。for_eachは、セットやマップを反復処理し、each.keyとeach.valueを使って一意のプロパティを持つ異なるリソースを作成するために使います。
これらの構造は、スケーラブルで保守しやすいInfrastructure as Codeを管理するうえで基本となる機能です。
よくある質問
「`for_each` と `count` によるループ」レッスンは無料ですか?
はい。「`for_each` と `count` によるループ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Terraform Infrastructure as Codeコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Terraform Infrastructure as Codeコースには全4レッスンが含まれています。
「`for_each` と `count` によるループ」で何を学びますか?
`count` と `for_each` を使ってリソースやモジュールの複数インスタンスをプロビジョニングし、コレクションやマップを効率的に扱う方法を学びます。 ブラウザで直接実行するハンズオンコードでTerraform Infrastructure as Codeを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Terraform Infrastructure as Codeを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTerraform Infrastructure as Codeは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「`for_each` と `count` によるループ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTerraform Infrastructure as Codeレッスンでコードを書いて実行できますか?
はい。すべてのTerraform Infrastructure as Codeレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- `for_each` と `count` によるループ
- Terraform 組み込み関数
- 条件式と Splat 式
- ネストした設定のためのDynamic Block