AWSの開発環境構築手順：VPCとセキュリティグループ編

# VPCとは？

ChatGPTに質問しました。

> Q:AWSのVPCに関して、5行程度で教えてください。

> A:
AWSのVPC（Virtual Private Cloud）は、ユーザー専用の仮想ネットワークをAWS上に構築できるサービスです。
VPC内でサブネット、ルートテーブル、インターネットゲートウェイ、NATゲートウェイなどを設定し、リソースの接続やセキュリティを管理します。
パブリックとプライベートのサブネットを分けることで、外部アクセスの制御が可能です。
また、セキュリティグループやネットワークACLで細かいアクセス制御も行えます。

仮想ネットワークについて、この記事に分かりやすく書いてありました。
[仮想ネットワークとは？仮想ネットワーク構築についてわかりやすく解説](https://www.rworks.jp/system/system-column/sys-entry/22121/)

> ネットワークを仮想化することで、LAN ケーブルやスイッチ、ルータ、ファイアウォール、ロードバランサ―などの物理的なネットワークを、ハードウェアに紐づかないネットワークリソースとしてプール化し、柔軟に利用できるようになります。

仮想化されていないネットワークは物理的な機器を使用して構築されるので、構築したいと思った日にすぐ出来上がるものではありません。
仮想化技術によって、柔軟かつ迅速にネットワークを構築することができます。

VPCは、VPC作成者専用の閉じられたネットワークなので、何もしなければ外からのアクセスが一切できませんし、中からもどこへもアクセスできません。
それでは困ってしまうので、ゲートウェイで出入り口を用意したり、公開しても良い領域・非公開の領域を分ける為にサブネットを作成したりするわけです。

# セキュリティグループとは？

> Q:セキュリティグループに関しても教えてください。

> A:
AWSのセキュリティグループは、VPC内のインスタンスなどのリソースに対するネットワークトラフィックを制御する仮想ファイアウォールです。
インバウンド（受信）とアウトバウンド（送信）ルールを設定して、特定のIPアドレスやポートへのアクセスを許可または拒否できます。
セキュリティグループはステートフルで、インバウンドで許可された通信はアウトバウンドでも自動的に許可されます。
各リソースに複数のセキュリティグループを割り当てられるため、柔軟なセキュリティ設定が可能です。

要は[ファイアウォール](https://www.hitachi-solutions.co.jp/juniperproducts/recommend/check/firewall.html)です。
上記に出てくる「インスタンス」は、サーバーと言い換えると理解しやすいかもしれません。

# 作業内容

## リージョンを選択

コンソールの右上にあるプルダウンから東京(ap-northeast-1)リージョンを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836454/55c23070-823e-14bf-09fe-39e1ecfe9985.png)

## VPC構築

1. [VPCを作成]ボタンから、VPCを作成する画面を開く
1. 「VPCなど」を選択
1. 「自動生成」にチェックが入っていることを確認して、プロジェクト名を記載
　※本記事では **「project-dev」** と呼称する
1. 「アベイラビリティーゾーン(AZ)」は2を選択
　※RDSのサブネットグループなど、AZが2つ必要な機能が存在する為
1. あとはそのままの設定で[VPCを作成]を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836454/b9585cb7-a802-35ff-5664-1a1b99d6f9e4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836454/98e068fe-697d-85a6-f905-94830c4499cd.png)
<br>

作業しながらプレビューが表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836454/176c2801-52a2-9bcb-40e6-ef51d62d882e.png)

## セキュリティグループを作成

EC2>ネットワーク＆セキュリティ>セキュリティグループと進み、[セキュリティグループを作成]ボタンから、セキュリティグループを作成する画面を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836454/c5e9a3fb-81fd-ec76-404c-1934ecd91200.png)
<br>

下記3つのセキュリティグループを作成する
- project-dev-alb-sg ※ELB（ALB）用
- project-dev-ec2-sg ※EC2用
- project-dev-rds-sg ※RDS用

![構成図_sg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836454/9ecddba2-48d8-04bd-5092-a8ed57ab156b.png)
<br>

またそれぞれ共通して「基本的な詳細」に下記を入力する
- セキュリティグループ名：前述のグループ名
- 説明：任意の説明
- VPC：先に作成したVPC（project-dev-vpc）を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836454/76d61689-6356-2dd0-f227-f85f3e520f78.png)

### インバウンドルールを追加

#### project-dev-alb-sg

下記を入力して、[セキュリティグループを作成]を押す
- タイプ：HTTPS
- ソース：マイIP
※WifiのIPアドレスを使用して、開発者以外のアクセスを防ぐ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836454/6ac163a6-d69c-97f1-1c89-2ace5c553fa3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836454/a504160e-9567-46c5-e090-8445f23fbdfc.png)

#### project-dev-ec2-sg

下記を入力して、[セキュリティグループを作成]を押す

①ALBからの受け入れ
- タイプ：HTTP
- ソース：カスタム
　※project-dev-alb-sgを選択

②SSH接続してターミナルで作業するため
- タイプ：SSH
- ソース：マイIP

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836454/d599c161-a481-ed7f-39e3-844d14304117.png)

#### project-dev-rds-sg

下記を入力して、[セキュリティグループを作成]を押す

①EC2からの受け入れ
- タイプ：HTTP
- ソース：カスタム
　※project-dev-ec2-sgを選択

②EC2からpsqlコマンドで作業するため
- タイプ：PostgreSQL
- ソース：カスタム
　※project-dev-ec2-sgを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836454/a1b974ab-94ec-689b-a98a-e1a6d61a9125.png)

### アウトバウンドルールを追加

作成したセキュリティグループのチェックボックスを入力すると、画面下に詳細情報が表示される。
「アウトバウンドルール」タブを選択して、[アウトバウンドのルールを編集]ボタンを押して編集する。

#### project-dev-alb-sg

下記追加して[ルールを保存]する

- タイプ：HTTP
- 送信先：project-dev-ec2-sg

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836454/255ae3d8-4478-b7ae-614f-d66f848fc19b.png)

#### project-dev-ec2-sg

下記追加して[ルールを保存]する

①RDSへの接続
- タイプ：HTTP
- 送信先：project-dev-rds-sg

②EC2からpsqlコマンドで作業する為
- タイプ：PostgreSQL
- 送信先：project-dev-rds-sg

 ③EC2から外部へのHTTPS通信を解放 ※ライブラリのインストールを可能にする為
 - タイプ：HTTPS
 - 送信先：0.0.0.0/0

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836454/fded4ba2-28fa-82d0-1a3e-8c3f4ea8e905.png)

# 参考記事

- [仮想ネットワークとは？仮想ネットワーク構築についてわかりやすく解説](https://www.rworks.jp/system/system-column/sys-entry/22121/)
- [ファイアウォールとは？](https://www.hitachi-solutions.co.jp/juniperproducts/recommend/check/firewall.html)
- [AWSのセキュリティグループ、ネットワークACLのステートレスとステートフルを噛み砕いて具体的に行ってみる](https://www.seeds-std.co.jp/blog/creators/2022-02-02-194955/)
- [【AWS】セキュリティグループのアウトバウンドの「0.0.0.0/0」](https://qiita.com/Shota567/items/c7c40991795236a696b6)