🐷
Terraformで複数のEC2を立てる(count,indexを使用)
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が作成されます。
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",
]
参考
Discussion