📌 既存アーキテクチャの状態
初期構成は以下の通り。
- Docker Image → ECR に保存
- ECS(Multi-AZ)でデプロイ
- ALB 使用(HTTP のみ)
- GitHub Actions による CI/CD
- DB は Neon(PostgreSQL)
- Cloudflare 使用(WAF / Rate Limiting)
- HTTPS は Cloudflare の Flexible SSL のみで対応
構成イメージ:
問題はここ。
👉 HTTPS は Cloudflare までで、それ以降はすべて HTTP(非暗号化)
つまり「見た目だけ HTTPS」状態だった。
❗ 問題点
- Cloudflare → ALB 間が平文 HTTP
- End-to-End HTTPS ではない
- セキュリティ的に不十分
- 認証・Cookie・セキュリティポリシーに影響の可能性あり
🎯 目標
Cloudflare → ALB 間も HTTPS 化すること
最終構成:
🧱 実施ステップ
1. ACM 証明書の発行
AWS Certificate Manager で:
- Public certificate を選択
- ドメイン入力
- api.example.com
- 検証方法:DNS
2. Cloudflare DNS に CNAME を追加
ACM が提供する検証用 CNAME を登録
- Type: CNAME
- Name: _xxxxx
- Target: _xxxxx.acm-validations.aws
⚠️ 重要:
- Proxy status: DNS only(グレー雲)
理由:
- ACM は実際の DNS レコードを確認する必要がある
- Proxied 状態だと Cloudflare が応答を加工 → 検証失敗
3. ACM のステータス確認
- Status: Issued
この状態になって初めて ALB で使用可能
4. (最大の落とし穴)リージョン問題
ACM 証明書は:
👉 ALB と同じリージョンでなければ使えない
例:
- ALB: ap-northeast-2
- ACM: us-east-1 → ❌ 表示されない
👉 対策:同じリージョンで再発行
5. ALB に HTTPS リスナー追加
- Protocol: HTTPS
- Port: 443
- Certificate: ACM 証明書選択
- Target Group: 既存の ECS
オプション:
- Client certificate(mTLS):未使用
6. ALB のセキュリティグループ設定
Inbound:
- HTTPS(443)許可
- Source: 0.0.0.0/0(テスト用)
7. HTTP → HTTPS リダイレクト
ALB 側で:
- HTTP(80) → HTTPS(443)へリダイレクト
8. Cloudflare の SSL モード変更
- Flexible ❌
- Full ❌
- Full(Strict) ✅
🔍 最終構成
⚠️ よくあるハマりポイント
-
ACM 証明書が表示されない
- 原因:リージョン不一致
-
証明書が Pending のまま
- 原因:Cloudflare の CNAME が Proxied
-
HTTPS リスナーの警告(Reachability)
- 原因:ALB のセキュリティグループで 443 未開放
-
セキュリティグループとターゲットグループの混同
- Security Group = ファイアウォール
- Target Group = トラフィックの転送先
🔐 DNS 設定まとめ
| レコード | 設定 |
|---|---|
| ACM 検証用 CNAME | DNS only |
| サービス用ドメイン | Proxied |
📦 結果
- Cloudflare → ALB 間も HTTPS 化完了
- End-to-End に近い構成を実現
- 既存の ECS / CI/CD はそのまま維持
- セキュリティレベル向上
🧠 結論
HTTPS 対応の核心は:
- ACM 証明書
- ALB の 443 設定
- Cloudflare の Full(Strict)
そして詰まりやすいポイントは:
- リージョン
- DNS 設定
- セキュリティグループ
この3つさえ正しく押さえれば、全体の流れは意外とシンプル。