terraformでインターネットゲートウェイ, ルートテーブルを作る


前回までのあらすじ

terraformでVPC, サブネットを作成する
https://qiita.com/sasshi_i/items/f4f65e18923d856be256

環境

  • macOS Mojave 10.14.5
  • MacBook Pro, 13-inch, Early 2015
  • terraform v0.12.0
  • direnv 2.20.1

目標成果物(本記事ではインターネットゲートウェイとルートテーブルを作成)

github格納先

成果物のコードは下記githubのリポジトリに格納していきます。
https://github.com/sasshi-i/terraform_ec2_rds

# ディレクトリ構成

├─ envs
│    ├─ prod
│    │   ├─ backend.tf
│    │   ├─ main.tf
│    │   └─ variables.tf
│    │
│    └─ staging
│        ├─ backend.tf
│        ├─ main.tf
│        └─ variables.tf
├─ modules
│    ├─ provider
│    │   └─ main.tf
│    └─ vpc
│        └─ main.tf
├─ .envrc
├─ .gigtgnore
└─READNE.md

今回追記したプログラム

/modules/vpc/main.tf
resource "aws_internet_gateway" "qiita_igw" {
  vpc_id = aws_vpc.qiita_vpc.id
  tags = {
    Name = "igw-${var.stage}"
  }
}

resource "aws_route_table" "qiita_rtb_public" {
  vpc_id = aws_vpc.qiita_vpc.id
  tags = {
    Name = "rtb-${var.stage}-public"
  }
}

resource "aws_route_table_association" "qiita_rtb_assoc_pblic" {
  count          = 2
  route_table_id = aws_route_table.qiita_rtb_public.id
  subnet_id      = element([aws_subnet.qiita_subnet_1a[0].id, aws_subnet.qiita_subnet_1b[0].id], count.index)
}

resource "aws_route" "qiita_route_igw" {
  route_table_id         = aws_route_table.qiita_rtb_public.id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.qiita_igw.id
  depends_on             = [aws_route_table.qiita_rtb_public]
}

resource "aws_route_table" "qiita_rtb_private" {
  vpc_id = aws_vpc.qiita_vpc.id
  tags = {
    Name = "rtb-${var.stage}-private"
  }
}

resource "aws_route_table_association" "qiita_rtb_assoc_private" {
  count          = 2
  route_table_id = aws_route_table.qiita_rtb_private.id
  subnet_id      = element([aws_subnet.qiita_subnet_1a[1].id, aws_subnet.qiita_subnet_1b[1].id], count.index)
}

プログラムの解説

インターネットゲートウェイ(IGW)

AWS上のリソースをインターネットに繋げるためにはインターネットゲートウェイが必要です。
vpc_idを指定するだけで作成できます。

ルートテーブル

ルートテーブルを作成する際は下記の作成が必要になります。

  • ルートテーブル->aws_route_table
  • ルートテーブルとサブネットの関連付け->aws_route_table_association
  • IGWへのルーティング(サブネットをインターネットに繋ぎたい場合)->aws_route

aws_route_tableの解説

vpc_idを指定するだけです。名前をつけたければtagsNameを指定します。

aws_route_table_associationの解説

route_table_idsubnet_idを指定してルートテーブルとサブネットを関連付けます。
自分が記載したプログラムではcountを指定してループで作成しています。
elementterraformが用意している関数で文法は下記の通りです。

element(list, index)

listからindex番目の要素を取得します。

aws_routeの解説

destination_cidr_blockで送信先を指定します。今回は全てのIPアドレス範囲をインターネットに繋げるために0.0.0.0/0を指定しています。
またdepends_onで依存を作成することができます。aws_route_tableが存在しない場合はaws_routeは存在し得ないので、aws_routeを指定しています。

以上!terraform applyすればAWS上にリソースが作成されます。

結果

無事ルートテーブルが作成されました。

qiita_rtb_public

qiita_rtb_private

関連記事

terraformでVPC, サブネットを作成する
https://qiita.com/sasshi_i/items/f4f65e18923d856be256

tfenvを用いたterraformのインストール方法
https://qiita.com/sasshi_i/items/b5117d51fed800fa6b09