🍊

AWSでVPC内にサブネットを作成してみよう

に公開

作成する構成

最終的に下記の構成を作成していきます。#最終的なTerraformのリソースで最終的なTerraformのリソースを載せてあります。

image.png

コンソールの言語設定

もし、コンソールの言語設定が英語になっている場合は、以下のように日本語に変更しておくと良いです。他の設定は「すべてのユーザー設定を表示」から変更できます。

image32.png

VPC

まずは、以下のような東京リージョン上に 10.0.0.0/16 のVPCを作成していきます。
image1.png

VPCを作成

10.0.0.0/16 でVPCを作成します。

  • 名前を example-vpc
  • IPv4 CIDR を 10.0.0.0/16

image2.png

terraformで作成する場合のサンプルコード
resource "aws_vpc" "example" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "example-vpc"
  }
}

作成したVPCの確認

vpc > お使いのVPC から確認できます。

リソースマップを見るとルートテーブルが1つ作成されています。Terraformで意識してなくても、AWSが勝手に作成しているので一応知っていると良いです。

image26.png

実際に作成されたのは、こんな感じの構成図です。東京リージョンの中にVPCとメインルートテーブルが作成されています。

image3.png

サブネット

次はサブネットを作っていきましょう。アベイラビリティゾーンは ap-northeast-1a と ap-northeast-1c の2つを使っていきます。

image4.png

サブネットの作成

4つのサブネットを作っていきます。

image5.png
image6.png
image7.png

作成したサブネットの確認

VPC > サブネットから作成したサブネットを確認できます。

image8.png

VPC > お使いのVPC からリソースマップを確認します。

勝手にデフォルトのルートテーブルに作成したサブネットが紐づいていることがわかります。

image9.png

インターネットゲートウェイ

サブネットを作成しましたが、サブネットからインターネットに出るにはインターネットゲートウェイが必要です。インターネットゲートウェイを作成していきましょう。

image10.png

インターネットゲートウェイの作成

インターネットゲートウェイを作成します。
image11.png

作成したインターネットゲートウェイを見ると状態がデタッチであることが分かります。
また、VPCのリソースマップを見ると、まだインターネットゲートウェイが表示されていません。ここに表示させるには、インターネットゲートウェイをVPCにアタッチ必要があります。

image27.png
image28.png

インターネットゲートウェイをVPCにアタッチ

インターネットゲートウェイをVPCにアタッチするには、インターネットゲートウェイを選択し、アクション > VPCにアタッチからできます。

image12.png

アタッチしたいVPCを選択して、VPCをアタッチします。

image13.png

作成したインターネットゲートウェイの確認

作成したインターネットゲートウェイを見てみると 状態が Attached になっていればOKです。

image14.png
VPCのリソースマップのほうも見てみましょう。ネットワーク接続の部分に example-igw が無事表示されています。

image15.png
インターネットゲートウェイを作成してVPCにアタッチをしましたが、このままではサブネットからインターネットにでることはできません。ルートテーブルでインターネットとサブネットを紐づける必要があります。次は、ルートテーブルを作成していきましょう。

ルートテーブル

ルートテーブルを作成し、サブネットとインターネットゲートウェイを紐づけていきます。

image16.png

ルートテーブルの作成

パブリック用とプライベート用の2つのルートテーブルを作成します。

image17.png
image18.png

ルートテーブルとサブネットの関連付け

VPCのリソースマップを見ると、すべてのサブネットがメインルートテーブルに関連付けられています。
image19.png

サブネットがメインルートテーブルに関連付けられているのは 、明示的にサブネットの関連付けをしていない場合、メインのルートテーブルに関連付けがされるからです。
image29.png

次は、明示的ににサブネットとルートテーブルの関連付けをしていきましょう。 サブネットの関連付けは 「アクション >
サブネットの関連付けを編集」 からできます。
image20.png

関連付けしたいパブリックサブネットを選択し、「関連付けを保存」をクリックします。同様にプライベートサブネットも関連付けさせます。

image21.png

ルートテーブルの詳細を確認してみると、「明示的なサブネットの関連付け」でパブリックサブネットが関連付けられていることが分かります。

image30.png

リソースマップを見ると、ルートテーブルとサブネットが関連付いていることが分かります。ただ、パブリックサブネットがインターネットゲートウェイと関連付けられていないため、インターネットにでることができません。プライベートサブネットはこれでOKです。次は、パブリックルートテーブルをインターネットゲートウェイと関連付けさせましょう。

image22.png

ルートテーブルとインターネットゲートウェイの関連付け

パブリックルートテーブルがインターネットに出れるようにするために、インターネットゲートウェイと関連付けさせていきます。関連付けをするためには、
ルートテーブルを選択し 「アクション > ルートを編集」からできます。

image23.png

0.0.0.0/0 にすることでパブリックサブネット内のすべてのリソースがすべての宛先へアクセスできるようになります。
このインターネットゲートウェイとの関連付けの設定をしているかどうかが、パブリックサブネットとプライベートサブネットの違いになります。

image24.png

作成したルートテーブルの確認

VPCのリソースマップを見ると、パブリックサブネットはルートテーブルによって、インターネットゲートウェイに関連付けられています。プライベートサブネットは作成したプライベートサブネット用のルートテーブルに関連付けられています。

image25.png

これにて、基本的なパブリックサブネットとプライベートサブネットの作成は終了です。

まとめ

今回は、パブリックサブネットとプライベートサブネットを作成していきました。思ったよりやることが多いなと思ったのではないでしょうか?私は初めてやったときは思いました🥺

次のステップとしては、以下のようなことが考えられます。

  • 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