参考 : https://developer.hashicorp.com/terraform/language/meta-arguments/count
terraformのcountの使い方
Countは、Terraform言語で定義された構文です。使用できますモジュールとすべてのリソースタイプを使用します。 countは整数を生み出し、多くの同一のインスタンスリソースを作成します。
以下のコードは、Terraformを使用してAWS EC2インスタンスを作成するためのものです。以下は各部分の説明です。
resource "aws_instance" "server" { count = 4 # create four similar EC2 instances ami = "ami-a1b2c3d4" instance_type = "t2.micro" tags = { Name = "Server ${count.index}" } }
count = 4
:count
は、Terraformに同じリソースを複数作成するように指示します。- この場合、4つの同じEC2インスタンスが作成されます。
ami = "ami-a1b2c3d4"
:instance_type = "t2.micro"
:tags
ブロック:
このコードを実行すると、以下の設定を持つ4つのEC2インスタンスが作成されます:
- AMI ID:
ami-a1b2c3d4
- インスタンスタイプ:
t2.micro
- タグ名:
Server 0
,Server 1
,Server 2
,Server 3
The count
Object
カウントが設定されているブロックでは、追加のカウントオブジェクトは${count.index}
式で参照できるため、各インスタンスの構成を変更できます。
このオブジェクトには1つの属性が所属しています
- count.index - 個別のインデックス番号(0で始まる)に対応する
count
で作成されたオブジェクトを外部から参照する
個別のインスタンスの参照のためには<TYPE>.<NAME>[<INDEX>]
または module.<NAME>[<INDEX>]
が活用できます (例えば, aws_instance.server[0]
, aws_instance.server[1]
で参照できます)
count
ではなくfor_each
を使うべきとき
作成されるインスタンスがほぼ同一である場合、count
が適切です。
逆に、各リソースで細かい設定が必要な時にはfor_each
を使う必要があります。
しかし基本的には、for_each
を利用する前に、count
とcount.index
を使用して可能な限りシンプルに保つことをお勧めします。
variable "subnet_ids" { type = list(string) } resource "aws_instance" "server" { # Create one instance for each subnet count = length(var.subnet_ids) ami = "ami-a1b2c3d4" instance_type = "t2.micro" subnet_id = var.subnet_ids[count.index] tags = { Name = "Server ${count.index}" } }
このコードは、特定の条件下では壊れやすくなります。以下の理由が考えられます。
問題点
count.index
の使用:count.index
を使用してsubnet_id
を設定していますが、これはリストのインデックスを直接参照しています。subnet_ids
のリストが変更された場合、たとえばサブネットが追加または削除された場合、期待されるインデックスと実際のインデックスがずれる可能性があります。これにより、誤ったサブネットIDが割り当てられるリスクがあります。
count
の動的な変更:インデックス範囲外エラー:
subnet_ids
が空のリストまたは不足している場合、count.index
にアクセスすると範囲外のインデックスエラーが発生する可能性があります。これにより、Terraform計画の実行時にエラーが発生します。
改善案
for_each
の使用:for_each
を使用すると、リストのインデックスに依存せずに安全にリソースを作成できます。リストのバリデーション: リストが空でないことを確認するバリデーションを追加します。
このように、for_each
を使用することで、リストのインデックスに依存せずに安全にリソースを作成でき、リストの変更によるエラーを防ぐことができます。
https://developer.hashicorp.com/terraform/language/meta-arguments/count
page:https://minegishirei.hatenablog.com/entry/2024/06/10/202719