概要
Azure をメインとしたインフラ環境を構築するにあたり、以下のサービスを Terraform / Bicep で管理することを検討しています。
この Issue では、導入予定のサービス一覧、Terraform での管理戦略、考慮すべき点 を整理し、構成案を議論します。
1. 使用検討中の Azure サービス
(1) コンテンツ配信 & API ルーティング
| サービス名 |
目的 |
備考 |
| Azure CDN |
静的ソースのキャッシュ |
高速配信用 |
| Azure Front Door |
API のルーティング & 負荷分散 |
グローバルなトラフィック管理 |
(2) 認証・ユーザー管理
| サービス名 |
目的 |
備考 |
| Azure AD B2C |
ユーザー認証 |
外部 ID 連携対応 |
(3) API & サーバーレス
| サービス名 |
目的 |
備考 |
| Azure Functions |
サーバーレス API |
スケーラブルな処理 |
| Azure API Management |
API ゲートウェイ & Rate Limiting |
セキュリティ制御 |
(4) 軽量 API & コスト削減
| サービス名 |
目的 |
備考 |
| Cloudflare Workers |
軽量 API |
コスト削減のため一部処理をこちらに |
(5) イベント駆動
| サービス名 |
目的 |
備考 |
| Azure Event Grid |
イベント処理 |
トリガー駆動の自動処理 |
(6) データ管理
| サービス名 |
目的 |
備考 |
| Azure Database for PostgreSQL |
位置情報 & ユーザーデータ管理 |
フルマネージド DB |
| Azure Cosmos DB |
セッション管理 |
NoSQL ベース |
| Azure Blob Storage |
画像・ログデータ保存 |
S3 互換のストレージ |
| Azure Cache for Redis |
データキャッシュ |
高速データ取得 |
(7) 位置情報・マップ
| サービス名 |
目的 |
備考 |
| Azure Maps |
位置情報 & Geo-fencing |
後々のセキュリティ考慮で利用を検討 |
(8) 通知
| サービス名 |
目的 |
備考 |
| Azure Notification Hubs |
プッシュ通知 |
多デバイス対応 |
2. CI/CD・監視・インフラ管理
| サービス名 |
目的 |
| Azure DevOps |
CI/CD パイプライン管理 |
| Azure Monitor & Application Insights |
API のパフォーマンス監視 |
| Terraform / Bicep |
インフラ管理 |
3. Web 版の展開
| サービス名 |
目的 |
| Azure Static Web Apps |
Flutter Web のホスティング |
4. Terraform によるインフラ管理
(1) 主要な Terraform モジュール
Terraform でインフラを管理する際、以下のモジュールを作成・利用予定。
network.tf → VNET, サブネット, NSG
storage.tf → Blob Storage, Redis
database.tf → PostgreSQL, Cosmos DB
cdn.tf → Azure CDN 設定
frontend.tf → Static Web Apps
backend.tf → Azure Functions, API Management
eventing.tf → Event Grid
security.tf → Azure AD B2C, Firewall 設定
管理単位:
| リソース |
Terraform State |
| ネットワーク |
terraform/network/ |
| データベース |
terraform/database/ |
| API / サーバーレス |
terraform/api/ |
| 認証 & セキュリティ |
terraform/security/ |
ステート管理方法
- Terraform State は Azure Blob Storage に保存
- Terraform Cloud or Remote Backend を利用
- 環境ごと (dev, staging, prod) に State を分離
terraform {
backend "azurerm" {
resource_group_name = "terraform-state-rg"
storage_account_name = "tfstateprod"
container_name = "tfstate"
key = "terraform.tfstate"
}
}