Blogaomu

WEBアプリケーション開発とその周辺のメモをゆるふわに書いていきます。

Terraform独習メモ1日目、2日目

最近、AWSの環境構築に当たって大量の手作業が辛くなってきたのである程度ツールに任せたいなと思い始め、Terraformを触ってみることにしました。0.11.1 を手元にインストールしてます。

2017-01-06

  • 想定する環境を決める
    • ざっとこんな感じで。Webアプリケーションを動かす環境のイメージ。
- VPC
  - この中にサブネットをいくつか用意する
  - パブリックアクセス可能なものとプライベートなものを用意する
- DynamoDB
- EC2インスタンス
  - アプリケーションサーバー * 2
- ALB
  - インターネット - ALb - EC2インスタンス群(App)
  - 443ポートにエンドポイントを作成
  - Appサーバーは8080番ポートにマッピング
- セキュリティーグループ
  - ALB用
  - Appサーバー用
    - ALBのみインバウンドを許可
- IAMロール
  - Appサーバーにひもづけるロール
    - DynamoDBへのread/writeアクセス
provider "aws" {
  region  = "us-west-2"
  # default プロファイルを使用する
  profile = "default"
}

resource "aws_vpc" "main" {
  # 192.168.0.0/20 になる
  cidr_block = "${cidrsubnet("192.168.0.0/16", 4, 0)}"
}

resource "aws_internet_gateway" "main" {
  vpc_id = "${aws_vpc.main.id}"
}

2017-01-11

  • 今日はサブネットを作ろうと思う
    • public * 2 (AZ-A, AZ-B)
    • private * 2 (AZ-A, AZ-B)
  • その前にルートテーブルにゲートウェイをひもづける
  • サブネット
  • cidrsubnet(aws_vpc.main.cidr_block, 4, 0) を使って3番目の引数を0, 1, 2,... にしていくと
    • 192.168.0.0/24, 192.168.1.0/24,... とCIDRが設定されていい感じ(これまでは頭の中or書き出してIPアドレス範囲を計算していた)
    • 当初はこの関数を使う利点がよく分からなかったが、ここでメリットが出てきた
  • とりあえず1ファイルにまとめているが、見にくくなったらファイル分割しようと思う
  • ルートテーブルとpublicサブネットを作成した
resource "aws_route_table" "r" {
  vpc_id = "${aws_vpc.main.id}"

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = "${aws_internet_gateway.main.id}"
  }

  tags {
    Name = "main"
  }
}

resource "aws_subnet" "public-a" {
  vpc_id            = "${aws_vpc.main.id}"
  cidr_block        = "${cidrsubnet(aws_vpc.main.cidr_block, 4, 0)}"
  # 本当はリージョンも変数化したい
  availability_zone = "us-west-2a"

  tags {
    Name = "public-a"
  }
}

resource "aws_subnet" "public-b" {
  vpc_id            = "${aws_vpc.main.id}"
  cidr_block        = "${cidrsubnet(aws_vpc.main.cidr_block, 4, 1)}"
  availability_zone = "us-west-2b"

  tags {
    Name = "public-b"
  }
}

まだまだ作りたいリソースはたくさん残っていますが、(いまのところ)簡潔に書けてパッと実行できるのはいいですね。