📝
Azure on CDKTFと1ヶ月以上に渡る格闘をした話
Azure on CDKTFにEntraID認証とVnet構築を組み合わせたContainerApps環境をビルドして動作確認するまでに1ヶ月以上の時間を要している原因を分析し、根本的な対策を検討してみた話
🔍 時間がかかる根本原因の分析
1. 技術選択の問題
CDKTF (Cloud Development Kit for Terraform) の複雑性
- 多層の抽象化: TypeScript → CDKTF → Terraform → Azure API
- デバッグの困難さ: エラーが発生した際、どの層で問題が起きているか特定が困難
- ドキュメントの不足: CDKTFのベストプラクティスや具体例が少ない
Azure Container Apps + VNet統合の複雑性
- 新しいサービス: Container Appsは比較的新しく、VNet統合のパターンが確立されていない
- 委譲の問題: サブネット委譲の管理が複雑で、エラーメッセージが不明瞭
2. 開発プロセスの問題
フィードバックループの遅さ
コード修正 → GitHub Actions実行 → Azure API呼び出し → 結果確認
↑_______________________________________________|
(5-10分のサイクル × 数十回 = 数時間)
段階的な検証不足
- ローカルでの事前検証が困難
- 一度に多くの要素を変更して原因特定が困難
🎯 即効性のある対策
1. 技術選択の見直し
オプション A: Pure Terraform への移行 ⭐️ 推奨
# main.tf (シンプルで直接的)
resource "azurerm_container_app_environment" "main" {
name = "container-app-env-dev"
location = "Japan East"
resource_group_name = "rg-jpe-01"
infrastructure_subnet_id = azurerm_subnet.container_apps.id
}
resource "azurerm_container_app" "frontend" {
name = "container-app-frontend-dev"
container_app_environment_id = azurerm_container_app_environment.main.id
resource_group_name = "rg-jpe-01"
revision_mode = "Single"
template {
container {
name = "frontend"
image = "mcr.microsoft.com/azuredocs/containerapps-helloworld:latest"
cpu = 0.25
memory = "0.5Gi"
}
}
}
メリット:
- ✅ エラーメッセージが直接的
- ✅ ドキュメントが豊富
- ✅ デバッグが容易
- ✅ 実行時間が短縮
オプション B: Azure CLI + Bicep への移行
# deploy.sh (最もシンプル)
az containerapp env create \
--name "container-app-env-dev" \
--resource-group "rg-jpe-01" \
--location "Japan East" \
--infrastructure-subnet-resource-id "/subscriptions/.../subnets/..."
2. 開発プロセスの改善
高速フィードバックループの構築
# ローカル検証スクリプト
./scripts/validate-local.sh # 30秒
./scripts/plan-only.sh # 2分
./scripts/deploy-dev.sh # 5分
段階的な検証戦略
# Stage 1: ネットワーク基盤のみ (2分)
terraform apply -target=azurerm_virtual_network.main
# Stage 2: Container Apps Environment (3分)
terraform apply -target=azurerm_container_app_environment.main
# Stage 3: アプリケーション (2分)
terraform apply -target=azurerm_container_app.frontend
🚀 長期的な対策
1. インフラストラクチャ設計の標準化
CDKTFコアライブラリの活用
// 既存の実績あるパターンを使用
import { ContainerEnvironment } from '@cdktf/core';
new ContainerEnvironment(this, 'environment', {
// 実績のある設定パターン
});
2. 開発環境の改善
ローカル開発環境の構築
# 1. Azurite (ローカルAzure Storage)
npm install -g azurite
azurite --silent &
# 2. Terraform plan専用環境
export TF_VAR_environment="local"
terraform plan -out=plan.tfplan
# 3. 設定検証
./scripts/validate-config.sh
テスト駆動インフラストラクチャ
// tests/infrastructure.test.ts
describe('Container Apps Infrastructure', () => {
it('should create VNet with correct configuration', () => {
// テストケース
});
});
📊 時間短縮の効果予測
現在の状況
問題発生 → 調査 → 修正 → GitHub Actions → 結果確認
1日 2時間 30分 10分 30分
= 約3時間/サイクル × 10サイクル = 30時間
改善後の予測
問題発生 → ローカル検証 → 修正 → plan → apply
30分 2分 5分 1分 3分
= 約11分/サイクル × 3サイクル = 33分
⚡ 約90%の時間短縮が可能
🎯 即座に実行可能な解決策
今すぐできること
-
Pure Terraformへの移行 (推定: 2-3時間)
# 1. 現在のCDKTF構成をTerraformに変換 cdktf synth # 2. 生成されたTerraformファイルを手動で整理 # 3. 直接terraform apply -
CDKTFコアパターンの採用* (推定: 1-2時間)
# 実績のあるコンストラクトをコピー cp ../cdktf-core/src/constructs/container-environment.ts ./src/ -
段階的デプロイメントの実装 (推定: 30分)
# ネットワークのみ先行デプロイ terraform apply -target=module.network
推奨される最速ルート
💡 結論
根本原因: CDKTFの複雑性 + VNet統合の新規性 + 長いフィードバックループ
即効性のある解決策:
- Pure Terraformへの移行 (90%の時間短縮)
- 段階的デプロイメント (問題の局所化)
- ローカル検証環境 (高速フィードバック)
これらの対策により、残り作業時間を数時間に短縮できるはずです。
皆様ならどのアプローチを採用されますか?
最も効果的な Pure Terraform移行 がオススメ。
何故CDKTFを採用したのか?
どこかに未発見の虎の巻が隠されているに違いない
Discussion