はじめに
AWS 上でアプリケーションを運用する際、適切なサブネット構成とセキュリティグループの設計 は不可欠です。
本記事では、以下のポイントを整理します。
- パブリックサブネットとプライベートサブネットの役割
- ECS、ALB、RDS の適切な配置
- セキュリティグループによるアクセス制御
書こうと思ったきっかけ
受講している IT スクールのハッカソン で、インフラ担当として AWS の構成を設計することになったため、理解を深める目的 で投稿しました。
実際に作成しているAWS構成
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 設定例
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 上でのアプリケーション運用をより安全かつ効率的に行いましょう!