個人的備忘録：AWS VPCにおけるサブネットとセキュリティグループの構成を体系的に整理してみた

## はじめに
AWS 上でアプリケーションを運用する際、**適切なサブネット構成とセキュリティグループの設計** は不可欠です。  
本記事では、以下のポイントを整理します。  

- **パブリックサブネットとプライベートサブネットの役割**  
- **ECS、ALB、RDS の適切な配置**  
- **セキュリティグループによるアクセス制御**  

## 書こうと思ったきっかけ
受講している **IT スクールのハッカソン** で、インフラ担当として AWS の構成を設計することになったため、**理解を深める目的** で投稿しました。

**実際に作成しているAWS構成**

![Screenshot 2025-02-21 at 7.29.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/14c68cef-7863-4742-97de-dc012a8dfd49.png)

## 1. サブネット構成
本構成では、ALB（ロードバランサー）用のパブリックサブネットと、ECS・RDS 用のプライベートサブネットを分け、適切な通信制御を行っています。

### 1.1 サブネット一覧
| サブネット名  | CIDR ブロック | AZ | ルートテーブル | NATゲートウェイ | 用途 |
|--------------|--------------|----------------|--------------|--------------|----------------|
| public1      | 10.0.0.0/20  | ap-northeast-1a | public       | なし          | ALB 用 |
| public2      | 10.0.16.0/20 | ap-northeast-1c | public       | なし          | ALB 用 |
| private1     | 10.0.128.0/20 | ap-northeast-1a | private1     | public1 にある NAT GW | ECS, アプリ用 |
| private2     | 10.0.144.0/20 | ap-northeast-1c | private2     | public1 にある NAT GW | ECS, アプリ用 |
| private3     | 10.0.160.0/20 | ap-northeast-1a | private3     | なし（NAT未設定） | RDS |
| private4     | 10.0.176.0/20 | ap-northeast-1c | private4     | なし（NAT未設定） | RDS |

### 1.2 パブリックサブネットの役割
パブリックサブネット（public1, public2）は、インターネットと直接通信できるサブネットです。

- ALB（Application Load Balancer）を配置し、外部からのリクエストを受け付ける
- ECS（アプリケーション）は ALB 経由でアクセスされるため、ECS 自体はプライベートサブネットに配置

#### Terraform 設定例
```hcl
resource "aws_subnet" "public1" {
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.0.0/20"
  availability_zone = "ap-northeast-1a"
  tags = { Name = "Terraform-subnet-public1-ap-northeast-1a" }
}

resource "aws_subnet" "public2" {
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.16.0/20"
  availability_zone = "ap-northeast-1c"
  tags = { Name = "Terraform-subnet-public2-ap-northeast-1c" }
}
```

### 1.3 プライベートサブネットの役割
プライベートサブネット（private1, private2, private3, private4）は、外部から直接アクセスできないサブネットです。

- **private1, private2（ECS 用）**
  - インターネットアクセスが必要なため、NAT ゲートウェイ経由で外部通信を許可
  - ECS のタスクは NAT を介してインターネットにアクセス可能（例: 外部 API 呼び出しやパッケージ更新）

- **private3, private4（RDS 用）**
  - NAT ゲートウェイなしでインターネットとの通信を遮断
  - ECS からのみアクセス可能な状態を維持し、データベースのセキュリティを確保

## 2. セキュリティグループ構成
適切なセキュリティグループ（SG）を設定し、不要な通信を制限します。

| セキュリティグループ名 | 対象リソース | インバウンドルール | アウトバウンドルール | 備考 |
|----------------|------------|----------------|----------------|------|
| ecs_sg | ECS (アプリケーション用) | ALB から TCP/1323 アクセスを許可 | すべてのトラフィックを許可 (0.0.0.0/0) | ECS タスク用の通信制御 |
| public_sg | ALB (パブリック) | 全インターネットから TCP/443 (HTTPS) を許可 | すべてのトラフィックを許可 (0.0.0.0/0) | ALB の受信トラフィック用 |
| rds_sg | RDS (MySQL) | ECS のセキュリティグループ (ecs_sg) から TCP/3306 を許可 | すべてのトラフィックを許可 (0.0.0.0/0) | RDS へのアクセス制御 |

### ポイント
- **ecs_sg（ECS のセキュリティグループ）**
  - ALB（public_sg）からのアクセスのみ許可し、外部からの直接アクセスを制限

- **public_sg（ALB のセキュリティグループ）**
  - インターネットから HTTPS（TCP/443）のみ許可し、ALB がリクエストを受け取れるよう設定

- **rds_sg（RDS のセキュリティグループ）**
  - ECS（ecs_sg）からの MySQL 接続（TCP/3306）のみ許可し、外部からの直接接続は制限

## まとめ
| リソース | 配置サブネット | ポイント |
|---------|--------------|---------|
| ALB | public1, public2 | インターネットからの HTTPS 通信を受け付ける |
| ECS (アプリケーション) | private1, private2 | ALB 経由でアクセス、NAT 経由でインターネット通信可 |
| RDS (データベース) | private3, private4 | ECS からのみアクセスを許可、外部からの通信不可 |

この構成により、セキュリティを確保しつつ、アプリケーションとデータベースを適切に分離したネットワーク環境を構築できます。

***ECS 上でのアプリケーション運用をより安全かつ効率的に行いましょう！***