前回までのあらすじ
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
今回追記したプログラム
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
を指定するだけです。名前をつけたければtags
でName
を指定します。
aws_route_table_associationの解説
route_table_id
とsubnet_id
を指定してルートテーブルとサブネットを関連付けます。
自分が記載したプログラムではcount
を指定してループで作成しています。
element
はterraform
が用意している関数で文法は下記の通りです。
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上にリソースが作成されます。
結果
無事ルートテーブルが作成されました。
関連記事
terraformでVPC, サブネットを作成する
https://qiita.com/sasshi_i/items/f4f65e18923d856be256
tfenvを用いたterraformのインストール方法
https://qiita.com/sasshi_i/items/b5117d51fed800fa6b09