## 12. インフラ・実行環境

確認：2026年9月

### 12-1. どこで動かすか

| 条件 | 既定 | 代替と乗り換え条件 |
|---|---|---|
| AWSを使う | **ECS on Fargate＋ALB＋RDS** | Lambda：リクエストがまばらでコールドスタートを許容できるとき。ECS Express Mode：構成を最小にしたい小規模案件。App Runnerは新規受付を終了したため選ばない |
| GCPを使う | **Cloud Run＋Cloud SQL** | — |
| 自由に選べる・Webアプリ | **Render** | Fly.io：リージョンの指定やマシン単位の細かい制御が必要なとき。Railway：個人・検証用途 |
| 静的サイト | **Cloudflare Pages** | GitHub Pages：公開リポジトリの個人サイトで、使うサービスを増やしたくないとき |
| Next.js | **Vercel** | AWS（OpenNextでLambda/CloudFrontへ）：AWSに集約したいとき |
| エッジ・軽量API | **Cloudflare Workers** | — |
| VPS・オンプレVM | **Kamal**（Dockerコンテナをゼロダウンタイムでデプロイ） | Docker Compose＋手動：単一サーバーで更新頻度が低いとき |
| Kubernetes | **原則として使わない** | EKS／GKE：多数のサービスを運用する専任チームがいるとき |

### 12-2. コンテナ

| 役割 | 既定 | 代替と乗り換え条件 |
|---|---|---|
| イメージ作成 | **Dockerfile（マルチステージビルド）** | — |
| ベースイメージ | Go：**distroless**／ その他：**公式slim系イメージ** | Chainguard Images：脆弱性ゼロを求められるとき |
| レジストリ | **ECR**（AWS）／ **GHCR**（それ以外） | — |
| Dockerfile Lint | **hadolint** | — |
| イメージ脆弱性スキャン | **Trivy** | — |

### 12-3. IaC

| 役割 | 既定 | 代替と乗り換え条件 |
|---|---|---|
| IaC本体 | **Terraform**（ライセンスを気にするなら **OpenTofu**。記法は互換） | AWS CDK：AWS専用でTypeScriptで書きたいとき。Pulumi：複数クラウドを汎用言語で書きたいとき |
| stateの保存 | **S3バックエンド（ネイティブロック）** | HCP Terraform：チームでのplan/applyのレビュー運用が必要なとき |
| Lint | **TFLint** | — |
| セキュリティ検査 | **Trivy（設定ファイルのスキャン）** | Checkov：Trivyにないポリシーで検査したいとき |
| フォーマット | **terraform fmt** | — |
| ドキュメント生成 | **terraform-docs** | — |
| CIでのplan/apply | **GitHub Actionsでplan結果をPRにコメント** | Atlantis：PRコメント駆動の運用をしたいとき |

### 12-4. ネットワーク・エッジ

| 役割 | 既定 | 代替と乗り換え条件 |
|---|---|---|
| DNS | **Cloudflare DNS** | Route 53：AWSで完結させたいとき |
| CDN | **Cloudflare** | CloudFront：AWS内で完結、S3オリジン中心のとき |
| WAF | **Cloudflare WAF** | AWS WAF：ALB/CloudFrontに直接付けたいとき |
| アクセス集中対策 | **Cloudflare Waiting Room** | — |
| 管理画面・社内ツールの保護 | **Cloudflare Access（ゼロトラスト）** | Tailscale：サーバーへの管理アクセス全般 |
| 証明書 | **Cloudflare／ACM（自動更新）** | Let's Encrypt（Kamalは自動対応） |
| サーバーへのSSH | **Tailscale** または **AWS Systems Manager Session Manager** | — |

### 12-5. シークレット管理

| 役割 | 既定 | 代替と乗り換え条件 |
|---|---|---|
| AWS上のアプリ | **AWS Secrets Manager**（頻繁に変わらない設定値はSSM Parameter Store） | — |
| チーム共有・ローカル開発 | **1Password（1Password CLIで注入）** | Doppler：複数環境・複数サービスを一元管理したいとき |
| リポジトリ内で暗号化して管理 | **SOPS＋age** | — |
| Kamal | **.kamal/secrets から1Password等を参照** | — |
