TerraformでMultiAZで複数台構成なインスタンスを構築する
About
AutoScalingしないような環境下でインスタンス構築する際のTipsです。
こちらの記事を見て試しました。
EC2インスタンスを異なるAZに配置したい
という内容がありますが、書いてある方法だとsubnetsのidをvariables.tfで指定する必要があります。既に存在していればいいのですが、新しく環境を作る際にはそもそもサブネットが存在しないのでidを書くことはできません。なので、他の方法でうまくできないか試しました!すっきり。
- variables.tf
variable "subnets" { default = { "0" = "10.0.16.0/24" "1" = "10.0.17.0/24" } } variable "availability_zones" { default = { "0" = "ap-northeast-1a" "1" = "ap-northeast-1c" }
variables.tfではAZの指定とCIDRの指定を変数として定義します。
- vpc.tf
resource "aws_subnet" "private" { vpc_id = "${aws_vpc.main.id}" count = "${var.az_count}" cidr_block = "${lookup(var.private_subnets, count.index)}" availability_zone = "${lookup(var.availability_zones, count.index)}" map_public_ip_on_launch = false tags { Name = "${var.stage}" Project = "${var.project_name}" Created = "terraform" } }
vpc.tfではlookupを使ってcountに応じた値をvariablesから取得して設定します。
- instance.tf
# web resource "aws_instance" "web" { count = 2 ami = "${var.web_ami}" instance_type = "t2.micro" iam_instance_profile = "test" key_name = "${var.key_name}" vpc_security_group_ids = ["${aws_security_group.private_instances.id}"] subnet_id = "${element(aws_subnet.private.*.id, count.index%2)}" root_block_device { delete_on_termination = "true" } tags { Name = "${var.stage}-web${format("%02d", count.index + 1)}" Project = "${var.project_name}" Stage = "${var.stage}" Role = "web" Group = "common" Created = "terraform" } }
subnet_idの部分ではelementを使って、aws_subnet.privateリソースをのリストからcount.indexの数に応じたリソースを指定できます。
まとめ
もっと良い書き方会ったら教えて下さい!