##概要
TerraformでAWSの仮想ネットワーク構築手順をまとめました。
Terraformのインストールから簡単なEC2インスタンス構築までは下記の記事でまとめています。
こちら: Terraformを使ってEC2インスタンス構築
##目次
- VPCを作成
- パブリックサブネットを作成
- サブネットを作成
- インターネットゲートウェイを作成
- ルートテーブルを作成
- サブネットへの関連付け
- プライベートサブネットを作成
- サブネットを作成
- Elastic IPの割り当て / NATゲートウェイを作成
- ルートテーブルを作成
- サブネットへの関連付け
##1. VPCを作成
main.tfを作成し、VPCの情報を書いていく。
provider "aws" {
region = "ap-northeast-1"
}
# VPC作成
resource "aws_vpc" "vpc" {
cidr_block = "10.0.0.0/16" #CIDRブロックの指定
tags = {
Name : "my-vpc-001"
}
}
今回は簡単にCIDRブロックのみを指定。applyコマンドを実行。
このVPC内にリソースを追加していく。
##2. パブリックサブネットを作成
###サブネットを作成
VPCをさらに分割し、インターネットへアクセス可能なサブネットを作成する。
上記のVPCの記述に続けて下記を追記。
#サブネットを作成
resource "aws_subnet" "public" {
vpc_id = aws_vpc.vpc.id
cidr_block = "10.0.0.0/24"
map_public_ip_on_launch = true
availability_zone = "ap-northeast-1a"
tags = {
Name : "my-public-subnet-001"
}
}
-
vpc_id = aws_vpc.vpc.id
ここではVPCのidをresource "aws_vpc" "vpc" {
記述箇所から参照している。
Terraformでは、「リソース(aws_xxx).名前.属性」の形式で書くことで他リソースの情報を参照できる。 -
map_public_ip_on_launch = true
trueに設定することで、サブネット内で起動したインスタンスにパブリックIPアドレスを自動的に割り当てる。
applyコマンドを実行した結果がこちら。
サブネットがVPC内に作成された。
###インターネットゲートウェイを作成
続いて作成したサブネットから、インターネットへアクセスできる様にインターネットゲートウェイを作成。
サブネットの記述に続いて下記を追記。
#インターネットゲートウェイを作成
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.vpc.id
tags = {
Name : "my-igw-001"
}
}
###ルートテーブルを作成
これではまだインターネットを通信できないので、ルーティング情報を管理するルートテーブルを作成する。
下記の3点のリソースを記述していく。
- ルートテーブルの作成
aws_route_table
- インターネットゲートウェイへのルートを設定
aws_route
- ルートテーブルとサブネットの関連付け
aws_route_table_association
インターネットゲートウェイの記述に続いて下記を追記。
#パブリックルートテーブルの作成
resource "aws_route_table" "public" {
vpc_id = aws_vpc.vpc.id
tags = {
Name : "my-public-rtb-001"
}
}
# インターネットゲートウェイへのルートを設定
resource "aws_route" "public" {
route_table_id = aws_route_table.public.id
gateway_id = aws_internet_gateway.igw.id
destination_cidr_block = "0.0.0.0/0"
}
# ルートテーブルとサブネットの関連付け
resource "aws_route_table_association" "public" {
subnet_id = aws_subnet.public.id
route_table_id = aws_route_table.public.id
}
-
aws_route_table_association
関連付けをしていない場合、デフォルトルートテーブルが自動的に使われる。
デフォルトはアンチパターンなので関連付けを忘れない様にしよう。
ここまででapplyコマンドを実行。
インターネットゲートウェイ
ルートテーブル & サブネットとの関連付け
ルートの設定
全て問題なく作成されたことを確認。
ここまででパブリックサブネットは完了!
##3. プライベートサブネットを作成
インターネットからアクセスできないネットワークを構築する。
その一方で、プライベートサブネットからはインターネットへアクセスできる様、NATゲートウェイを設置する。
###サブネットを作成
# サブネットを作成
resource "aws_subnet" "private" {
vpc_id = aws_vpc.vpc.id
cidr_block = "10.0.1.0/24"
map_public_ip_on_launch = false
availability_zone = "ap-northeast-1a"
tags = {
Name : "my-private-subnet-001"
}
}
基本パブリックサブネットと同じ。
パブリックIPアドレスは不要なのでmap_public_ip_on_launch
はfalseに設定している。
###Elastic IPの割り当て / NATゲートウェイを作成
NATゲートウェイにはElastic IPの割り当てが必要なため、両リソースについて記述する。
# EIP
resource "aws_eip" "nat_gateway" {
vpc = true
depends_on = [
aws_internet_gateway.igw
]
tags = {
Name : "my-eip-001"
}
}
# NATゲートウェイ
resource "aws_nat_gateway" "nat_gateway" {
allocation_id = aws_eip.nat_gateway.id # Elastic IPアドレスの関連付け
subnet_id = aws_subnet.public.id # NATゲートウェイの設置位置はパブリックサブネット
depends_on = [
aws_internet_gateway.igw
]
tags = {
Name : "my-nat-gate-way-001"
}
}
- NATゲートウェイの設置位置について
パブリックサブネットに設置する。プライベートサブネットからパブリックサブネット内のNATゲートウェイへルーティングすることにより、インターネットへのアクセスを可能にする。 -
depends_on
について
depends_on
では、リソースの依存関係を明示的に定義している。
ここではインターネットゲートウェイを指定することによって、
「__先に__インターネットゲートウェイを作成し、インターネットゲートウェイ__作成後__にEIPやNATゲートウェイを構築する」
という流れを確立している。
続いて、パブリックサブネット同様、ルートテーブルの設定を追記していく。
# プライベートルートテーブルの作成
resource "aws_route_table" "private" {
vpc_id = aws_vpc.vpc.id
tags = {
Name : "my-private-rtb-001"
}
}
# NATゲートウェイへのルートを設定
resource "aws_route" "private" {
route_table_id = aws_route_table.private.id
nat_gateway_id = aws_nat_gateway.nat_gateway.id #gateway_idじゃないよ!
destination_cidr_block = "0.0.0.0/0"
}
# ルートテーブルとサブネットの関連付け
resource "aws_route_table_association" "private" {
subnet_id = aws_subnet.private.id
route_table_id = aws_route_table.private.id
}
ルート設定にて、
パブリックサブネットではgateway_id
だった箇所が、プライベートサブネットではnat_gateway_id
になるので注意。
applyコマンドを実行。
Elastic IP
NATゲートウェイ
ルートテーブル
ルートの設定
全て問題なく作成されたことを確認。
ここまででプライベートサブネットも完了!
##終わりに
今回はVPC、サブネット、ルートテーブル、各種ゲートウェイの構築をまとめました。
のちに、今回の構成のサブネットにEC2インスタンスを構築する手順、マルチAZ構成などをまとめようと思います。