AWSでVPC内にサブネットを作成してみよう
作成する構成
最終的に下記の構成を作成していきます。#最終的なTerraformのリソースで最終的なTerraformのリソースを載せてあります。
コンソールの言語設定
もし、コンソールの言語設定が英語になっている場合は、以下のように日本語に変更しておくと良いです。他の設定は「すべてのユーザー設定を表示」から変更できます。
VPC
まずは、以下のような東京リージョン上に 10.0.0.0/16 のVPCを作成していきます。
VPCを作成
10.0.0.0/16
でVPCを作成します。
- 名前を example-vpc
- IPv4 CIDR を 10.0.0.0/16
terraformで作成する場合のサンプルコード
resource "aws_vpc" "example" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "example-vpc"
}
}
作成したVPCの確認
vpc > お使いのVPC から確認できます。
リソースマップを見るとルートテーブルが1つ作成されています。Terraformで意識してなくても、AWSが勝手に作成しているので一応知っていると良いです。
実際に作成されたのは、こんな感じの構成図です。東京リージョンの中にVPCとメインルートテーブルが作成されています。
サブネット
次はサブネットを作っていきましょう。アベイラビリティゾーンは ap-northeast-1a と ap-northeast-1c の2つを使っていきます。
サブネットの作成
4つのサブネットを作っていきます。
作成したサブネットの確認
VPC > サブネットから作成したサブネットを確認できます。
VPC > お使いのVPC からリソースマップを確認します。
勝手にデフォルトのルートテーブルに作成したサブネットが紐づいていることがわかります。
インターネットゲートウェイ
サブネットを作成しましたが、サブネットからインターネットに出るにはインターネットゲートウェイが必要です。インターネットゲートウェイを作成していきましょう。
インターネットゲートウェイの作成
インターネットゲートウェイを作成します。
作成したインターネットゲートウェイを見ると状態がデタッチであることが分かります。
また、VPCのリソースマップを見ると、まだインターネットゲートウェイが表示されていません。ここに表示させるには、インターネットゲートウェイをVPCにアタッチ必要があります。
インターネットゲートウェイをVPCにアタッチ
インターネットゲートウェイをVPCにアタッチするには、インターネットゲートウェイを選択し、アクション > VPCにアタッチからできます。
アタッチしたいVPCを選択して、VPCをアタッチします。
作成したインターネットゲートウェイの確認
作成したインターネットゲートウェイを見てみると 状態が Attached になっていればOKです。
VPCのリソースマップのほうも見てみましょう。ネットワーク接続の部分に example-igw が無事表示されています。
インターネットゲートウェイを作成してVPCにアタッチをしましたが、このままではサブネットからインターネットにでることはできません。ルートテーブルでインターネットとサブネットを紐づける必要があります。次は、ルートテーブルを作成していきましょう。
ルートテーブル
ルートテーブルを作成し、サブネットとインターネットゲートウェイを紐づけていきます。
ルートテーブルの作成
パブリック用とプライベート用の2つのルートテーブルを作成します。
ルートテーブルとサブネットの関連付け
VPCのリソースマップを見ると、すべてのサブネットがメインルートテーブルに関連付けられています。
サブネットがメインルートテーブルに関連付けられているのは 、明示的にサブネットの関連付けをしていない場合、メインのルートテーブルに関連付けがされるからです。
次は、明示的ににサブネットとルートテーブルの関連付けをしていきましょう。 サブネットの関連付けは 「アクション >
サブネットの関連付けを編集」 からできます。
関連付けしたいパブリックサブネットを選択し、「関連付けを保存」をクリックします。同様にプライベートサブネットも関連付けさせます。
ルートテーブルの詳細を確認してみると、「明示的なサブネットの関連付け」でパブリックサブネットが関連付けられていることが分かります。
リソースマップを見ると、ルートテーブルとサブネットが関連付いていることが分かります。ただ、パブリックサブネットがインターネットゲートウェイと関連付けられていないため、インターネットにでることができません。プライベートサブネットはこれでOKです。次は、パブリックルートテーブルをインターネットゲートウェイと関連付けさせましょう。
ルートテーブルとインターネットゲートウェイの関連付け
パブリックルートテーブルがインターネットに出れるようにするために、インターネットゲートウェイと関連付けさせていきます。関連付けをするためには、
ルートテーブルを選択し 「アクション > ルートを編集」からできます。
0.0.0.0/0 にすることでパブリックサブネット内のすべてのリソースがすべての宛先へアクセスできるようになります。
このインターネットゲートウェイとの関連付けの設定をしているかどうかが、パブリックサブネットとプライベートサブネットの違いになります。
作成したルートテーブルの確認
VPCのリソースマップを見ると、パブリックサブネットはルートテーブルによって、インターネットゲートウェイに関連付けられています。プライベートサブネットは作成したプライベートサブネット用のルートテーブルに関連付けられています。
これにて、基本的なパブリックサブネットとプライベートサブネットの作成は終了です。
まとめ
今回は、パブリックサブネットとプライベートサブネットを作成していきました。思ったよりやることが多いなと思ったのではないでしょうか?私は初めてやったときは思いました🥺
次のステップとしては、以下のようなことが考えられます。
- NATゲートウェイを作成して、プライベートサブネットからインターネットに出れるようにする
- サブネット内に適当なEC2リソースを作成して、インターネットに出れるか確認する
- EC2を作成して、System Managerを使ってSSH接続せずにEC2にアクセスする
- ECSを作成して、ECSのタスクを起動する
最終的なTerraformのリソース
terraform {
required_version = "~> 1.10"
required_providers {
aws = {
source = "hashicorp/aws"
version = "5.78.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "my-example-vpc"
}
}
resource "aws_subnet" "public_a" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-1a"
tags = {
Name = "Public Subnet A"
}
}
resource "aws_subnet" "public_c" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.2.0/24"
availability_zone = "ap-northeast-1c"
tags = {
Name = "Public Subnet C"
}
}
# サブネットの作成
resource "aws_subnet" "private_a" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.11.0/24"
availability_zone = "ap-northeast-1a"
tags = {
Name = "Private Subnet A"
}
}
resource "aws_subnet" "private_c" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.12.0/24"
availability_zone = "ap-northeast-1c"
tags = {
Name = "Private Subnet C"
}
}
# インターネットゲートウェイの作成
resource "aws_internet_gateway" "main" {
vpc_id = aws_vpc.main.id
tags = {
Name = "example-igw"
}
}
# ルートテーブルの作成
resource "aws_route_table" "public" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.main.id
}
tags = {
Name = "public-rtb"
}
}
resource "aws_route_table" "private" {
vpc_id = aws_vpc.main.id
route = []
tags = {
Name = "private-rtb"
}
}
# ルートテーブルの関連付け
resource "aws_route_table_association" "public_a" {
subnet_id = aws_subnet.public_a.id
route_table_id = aws_route_table.public.id
}
resource "aws_route_table_association" "private_a" {
subnet_id = aws_subnet.private_a.id
route_table_id = aws_route_table.private.id
}
resource "aws_route_table_association" "public_c" {
subnet_id = aws_subnet.public_c.id
route_table_id = aws_route_table.public.id
}
resource "aws_route_table_association" "private_c" {
subnet_id = aws_subnet.private_c.id
route_table_id = aws_route_table.private.id
}
Discussion