🐷

Terraformで複数のEC2を立てる(count,indexを使用)

2023/06/02に公開

TerraformでEC2を複数台立てるのですが、今回は1つのresourceブロック内で簡潔に記載することを目標に試してみました。

環境

Terraform v1.4.6

コード

コードはこちらです。

resource "aws_instance" "test-instance" {
  count                       = 3
  ami                         = "ami-0d979355d03fa2522"
  associate_public_ip_address = true
  instance_type               = "t3.small"
  iam_instance_profile        = aws_iam_instance_profile.test-instance-profile.name
  vpc_security_group_ids      = [aws_security_group.test-sg-1.id]
  subnet_id                   = aws_subnet.test-pub-subnet1a.id
  root_block_device {
    volume_size = 20
    volume_type = "gp3"
  }

  tags = {
    Name = "test-instance-${count.index}"
  }
}

結果

Nameタグが異なる3つのEC2を作ることが出来ます。
便利ですね。

ポイント

count

指定した値分、terraformはそのリソースを作成します。
上のコードだと3になっているため、3つのEC2が作成されます。

https://developer.hashicorp.com/terraform/language/meta-arguments/count

count.index

リソースのインデックスをこいつで取得可能です。
countで作成されたリソースはこれでインクリメントされるため、タグなどを連番にするのに便利です。
作成されたEC2はこのように表示されました、[]内の値をNameタグに使用しているというわけです。

aws_instance.test-instance[0]
aws_instance.test-instance[1]
aws_instance.test-instance[2]

output

前述の通り、resourceとインデックスを指定することで取得可能です。
こちらは1代目のインスタンスのパブリックIPですね。

output "public_ip1" {
  value = aws_instance.test-instance[0].public_ip
}
Outputs:

public_ip1 = "xxx.xxx.xxx.xxx"

また、この様にすることでまとめて出力させることも出来ます。

output "public_ips" {
  value = aws_instance.test-instance[*].public_ip
}
Outputs:

public_ips = [
  "xxx.xxx.xxx.xxx",
  "yyy.yyy.yyy.yyy",
  "zzz.zzz.zzz.zzz",
]

https://developer.hashicorp.com/terraform/language/expressions/splat

参考

https://dev.classmethod.jp/articles/tips-for-creating-multiple-aws_instance-resources/
https://zenn.dev/shonansurvivors/articles/5424c50f5fd13d

Discussion