1. 初めに
本学習では以下の黒川さんのロードマップを参考に、AWS上で構成を構築してみました。
ALB、Auto Scaling Group、RDS、WAFなど、これまであまり触ったことのなかったサービスを利用しているため、勉強になると思い、この構成を選びました。
2. 構成図
構成図ではNATゲートウェイはありませんが、私は作成して進みます。
3. 全体設計
VPC
seenew-vpc : 10.0.0.0/16
Subnet
Public-1a-web : 10.0.0.0/24
Public-1a-alb : 10.0.1.0/24
Public-1c-alb : 10.0.2.0/24
Private-1a-api : 10.0.10.0/24
Private-1c-api : 10.0.11.0/24
Private-1a-db : 10.0.20.0/24
Private-1c-db : 10.0.21.0/24
Security Group
ALB用SG
Inbound : 80番ポート 0.0.0.0/0
Outbound : すべて 0.0.0.0/0
Web用SG
Inbound : 80番ポート 0.0.0.0/0
Outbound : すべて 0.0.0.0/0
API用SG
Inbound : 80番ポート ALB用SG
Outbound : すべて 0.0.0.0/0
DB用SG
Inbound : 3306番ポート API用SG
Outbound : すべて 0.0.0.0/0
Internet Gateway
seenew-igw
NAT Gateway
seenew-nat
配置先 : Public-1a-alb
Elastic IP : seenew-eip-nat
Route Table
Public用RT
0.0.0.0/0 → Internet Gateway
Private API用RT
0.0.0.0/0 → NAT Gateway
Private DB用RT
localのみ
4. ネットワーク作成
下記の順でネットワークを作成します。
- VPC作成
- Subnet作成
- IGW作成
- EIP取得
- NATGW作成
- Route Table作成
- Security Group作成
1. VPC作成
VPC → お使いのVPC → VPCを作成
作成するリソース : VPCのみ
名前 : seenew-vpc
IPv4 CIDR : 10.0.0.0/16
2. Subnet作成
VPC → サブネット → サブネットを作成
###### Public-1a-web VPC : seenew-vpc サブネット名 : seenew-public-1a-web AZ : ap-northeast-1a IPv4 サブネット CIDRブロック : 10.0.0.0/24
Public-1a-alb
VPC : seenew-vpc
サブネット名 : seenew-public-1a-alb
AZ : ap-northeast-1a
IPv4 サブネット CIDRブロック : 10.0.1.0/24
Public-1c-alb
VPC : seenew-vpc
サブネット名 : seenew-public-1c-alb
AZ : ap-northeast-1c
IPv4 サブネット CIDRブロック : 10.0.2.0/24
Private-1a-api
VPC : seenew-vpc
サブネット名 : seenew-private-1a-api
AZ : ap-northeast-1a
IPv4 サブネット CIDRブロック : 10.0.10.0/24
Private-1c-api
VPC : seenew-vpc
サブネット名 : seenew-private-1c-api
AZ : ap-northeast-1c
IPv4 サブネット CIDRブロック : 10.0.11.0/24
Private-1a-db
VPC : seenew-vpc
サブネット名 : seenew-private-1a-db
AZ : ap-northeast-1a
IPv4 サブネット CIDRブロック : 10.0.20.0/24
Private-1c-db
VPC : seenew-vpc
サブネット名 : seenew-private-1c-db
AZ : ap-northeast-1c
IPv4 サブネット CIDRブロック : 10.0.21.0/24
3. IGW作成
VPC → インターネットゲートウェイ → インターネットゲートウェイの作成
名前 : seenew-igw
作成後、IGW詳細 → アクション → VPCにアタッチ
VPC : seenew-vpc
4. EIP取得
VPC → Elastic IP → Elastic IP アドレスを割り振る
Tags : [Name] : [seenew-eip-nat]
5. NATゲートウェイ作成
VPC → NATゲートウェイ → NATゲートウェイを作成
名前 : seenew-nat
アベイラビリティーモード : ゾーナル
サブネット : seenew-public-1a-alb
接続タイプ : パブリック
Elastic IP 割り当て ID : seenew-eip-nat
6. Route Table作成
VPC → ルートテーブル → ルートテーブルを作成
Public Route Table
名前 : seenew-public-rt
VPC : seenew-vpc
作成後、ルート編集 → ルートを追加
送信先 : 0.0.0.0/0
ターゲット : seenew-igw
ルート追加後、アクション → サブネット関連付けを編集
seenew-public-1a-web、seenew-public-1a-alb、seenew-public-1c-albをチェックし、関連付けを保存
Private Route Table(API)
名前 : seenew-private-api-rt
VPC : seenew-vpc
作成後、ルート編集 → ルートを追加
送信先 : 0.0.0.0/0
ターゲット : seenew-nat
ルート追加後、アクション → サブネット関連付けを編集
seenew-private-1a-api、seenew-private-1c-apiをチェックし、関連付けを保存
Private Route Table(DB)
名前 : seenew-private-db-rt
VPC : seenew-vpc
作成後、アクション → サブネット関連付けを編集
seenew-private-1a-db、seenew-private-1c-dbをチェックし、関連付けを保存
→ Localのみ通信可能
7. Security Group
VPC(EC2) → セキュリティグループ → セキュリティグループを作成
ALB用SG
セキュリティグループ名 : seenew-sg-alb
説明 : Security Group for ALB
VPC : seenew-vpc
Inbound Rule : カスタムTCP 80 / ソース : Anywhere-IPv4
Outbound Rule : すべてのトラフィック / ソース : Anywhere-IPv4
Web用SG
セキュリティグループ名 : seenew-sg-web
説明 : Security Group for Web Server
VPC : seenew-vpc
Inbound Rule : カスタムTCP 80 / ソース : Anywhere-IPv4
Outbound Rule : すべてのトラフィック / ソース : Anywhere-IPv4
API用SG
セキュリティグループ名 : seenew-sg-api
説明 : Security Group for EC2
VPC : seenew-vpc
Inbound Rule : カスタムTCP 80 / ソース : seenew-sg-alb
Outbound Rule : すべてのトラフィック / ソース : Anywhere-IPv4
DB用SG
セキュリティグループ名 : seenew-sg-db
説明 : Security Group for EC2
VPC : seenew-vpc
Inbound Rule : MySQL/Aurora 3306 / ソース : seenew-sg-api
Outbound Rule : すべてのトラフィック / ソース : Anywhere-IPv4
5. IAM
SSMで接続するためのロールを作成します。
IAM → ロール → ロールを作成
- 信頼されたエンティティタイプ : AWSのサービス
- ユースケース : EC2
- 許可ポリシー : AmazonSSMManagedInstanceCore
- ロール名 : seenew-role-ec2-ssm
6. ALB作成
ターゲットグループ
EC2 → ターゲットグループ → ターゲットグループの作成
- ターゲット種類 : インスタンス
- ターゲットグループ名 : seenew-tg-api
- プロトコル・ポート : HTTP, 80
- VPC : seenew-vpc
- プロトコルバージョン : HTTP1
- ヘルスチェックプロトコル : HTTP
- ヘルスチェックパス : /health
- ターゲット : X
ALB
EC2 → ロードバランサー → ロードバランサーの作成
- 種類 : Application Load Balancer
- ロードバランサー名 : seenew-alb
- スキーム : インターネット向け
- VPC : seenew-vpc
- アベイラビリティーゾーンとサブネット : seenew-public-1a-alb, seenew-public-1c-alb
- セキュリティグループ : seenew-sg-alb
- リスナー : HTTP(80) → ターゲットグループへ転送 / seenew-tg-api
7. Auto Scaling Group作成
起動テンプレート
EC2 → 起動テンプレート → 起動テンプレートを作成
- 起動テンプレート名 : seenew-api-template
- Template for API Server
- OSイメージ : Amazon Linux 2023
- インスタンスタイプ : t3.micro
- キーペア名 : 起動テンプレートの設定に含めない
- サブネット : 起動テンプレートの設定に含めない
- アベイラビリティーゾーン : 起動テンプレートの設定に含めない
- セキュリティグループ : seenew-sg-api
- IAMインスタンスプロフィール : seenew-role-ec2-ssm
- user data :
#!/bin/bash
dnf update -y
dnf install -y python3
mkdir -p /home/ec2-user/app
cat << 'APP' > /home/ec2-user/app/app.py
from http.server import BaseHTTPRequestHandler, HTTPServer
import json
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == "/health":
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
self.wfile.write(b"OK")
else:
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
response_data = {
"status": "success",
"message": "Hello from API Server (Auto Scaled!)",
"infrastructure_check": {
"vpc": "seenew-vpc (10.0.0.0/16)",
"api_tier": "Private Subnet Active",
"database_target": "seenew-rds.database.amazonaws.com:3306 (Connected)",
"waf_protection": "Enabled via seenew-waf"
}
}
self.wfile.write(json.dumps(response_data).encode('utf-8'))
server = HTTPServer(("0.0.0.0", 80), Handler)
server.serve_forever()
APP
nohup python3 /home/ec2-user/app/app.py > /var/log/api.log 2>&1 &
Auto Scaling Group
EC2 → Auto Scaling グループ → Auto Scaling グループを作成する
- Auto Scaling グループ名 : seenew-auto-api
- 起動テンプレート : seenew-api-template
- VPC : seenew-vpc
- アベイラビリティーゾーンとサブネット:
seenew-pri-1a-api、seenew-pri-1c-api - ロードバランシング : 既存のロードバランサーにアタッチする
- 既存のロードバランサーターゲットグループ : seenew-tg-api
- ヘルスチェック → Elastic Load Balancingのヘルスチェックをオンにする
- 希望するキャパシティ : 2
- 最小の希望する容量 : 2 / 最大の希望する容量 : 4
8. RDS作成
DBサブネットグループ作成
Aurora and RDS → サブネットグループ → DBサブネットグループを作成
- 名前 : seenew-subnet-group
- 説明 : Subnet Group for DB
- VPC : seenew-vpc
- アベイラビリティーゾーン : ap-northeast-1a, ap-northeast-1c
- サブネット : seenew-pri-1a-db, seenew-pri-1c-db
データベース作成
Aurora and RDS → データベース → データベースの作成 → フル作成
- エンジンのタイプ : MySQL
- データベース作成方法を選択 : フル設定
- DBインスタンスサイズ : 開発/テスト
- DBインスタンス識別子 : seenew-rds
- 可用性と耐久性 : シングルAZ
- マスターユーザー名 : admin
- マスターパスワード : 任意のパスワード
- DBインスタンスタイプ : db.t3.micro
9. WAF作成
WAFとShield → 保護パック(ウェブACL) → 保護パック(ウェブACL)を作成
- アプリカテゴリ : コンテンツ及び公開システム
- アプリケーションフォーカス : APIとウェブの両方
- 保護するリソース : seenew-alb
- 初期の保護を選択 : お客様のために推奨されるルール
- 名前 : seenew-waf
10. 動作確認
Auto Scaling Groupにてインスタンスが起動されています。
ALB DNS名/healthに接続します。
11. 終わりに
今回の構築では、ALBやAuto Scaling Group、RDS、WAFなどを使った構成を作成してみました。
構成図を見た時は簡単そうに見えましたが、実際に作成してみると、RDSやAuto Scaling Groupには設定項目が多く、思ったより難しいと感じました。
しかし、何度も削除と再作成を繰り返すうちに、構築する順番にも少し慣れてきたと思います。
まだ理解が足りない部分もありますが、今後はTerraformでも同じ構成を作成してみたいと思います。






