読者です 読者をやめる 読者になる 読者になる

tjinjin's blog

いつかすごいエンジニアになることを目指して、日々学んだことを書いていきます。

TerraformでMultiAZで複数台構成なインスタンスを構築する

About

AutoScalingしないような環境下でインスタンス構築する際のTipsです。

こちらの記事を見て試しました。

dev.classmethod.jp

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の指定を変数として定義します。

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の数に応じたリソースを指定できます。

まとめ

もっと良い書き方会ったら教えて下さい!