Sekibanを使ってC#でOrleansアプリケーションを手軽に開発、デプロイ - Azure Container Appsへのデプロイ
Sekibanアプリを本格運用に向けてAzure Container Appsにデプロイする
Sekibanを使って開発されたイベントソーシング+アクターモデルのアプリケーションを、実際にAzureにデプロイして本格運用する方法について解説します。
参考記事:Sekibanを使ってC#でイベントソーシングとアクターモデルによるアプリケーションを手軽に開発、デプロイする(2)アプリをAzure AppServiceにデプロイする
デプロイ方法の概要
Sekibanのプロジェクトテンプレートで作成したアプリケーションには、Azure Container Appsへのデプロイに必要なBicepテンプレートとデプロイスクリプトが自動的に含まれています。
デプロイ環境の準備
Windows環境での開発ツール準備
Azure Container Appsへのデプロイには、以下のツールが必要です。特にWindowsユーザーは事前に環境を整える必要があります。
必要なツール一覧
- Azure CLI: Azureリソースの管理
- Bash環境: デプロイスクリプトの実行
- jq: JSONデータの処理
- docker: デプロイパッケージのbuild、作成
Windows環境でのインストール方法
1. WSL2(Windows Subsystem for Linux)の利用(推奨)
最も簡単で確実な方法は、WSL2を使用することです。
# WSL2のインストール
wsl --install
# Ubuntuの起動後、必要なツールをインストール
sudo apt update
sudo apt install -y curl jq zip unzip
# Azure CLIのインストール
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
2. Git Bashの利用
Git for Windowsに含まれるGit Bashを使用する方法もあります。
# Chocolateyをインストール済みの場合
choco install azure-cli jq zip
macOS環境の場合
# Homebrewを使用してjqをインストール
brew install jq
# Azure CLIをインストール
brew install azure-cli
Dockerのインストール
下記記事を参考にDocker DesktopまたはDocker Engineをインストールできます。
Install Docker Desktop on Windows
Install Docker Engine on Ubuntu
.NET 9 SDKの確認
デプロイするアプリケーションをビルドするため、.NET 9 SDKが必要です。
# バージョン確認
dotnet --version
# .NET 9がインストールされていない場合
# https://dotnet.microsoft.com/download からダウンロード
Azure環境の準備
1. Azureにログイン
まず、対象のAzureテナントにログインします。
# テナントIDを指定してログイン
az login --tenant <tenant-id>
# 組織ドメイン名を使用してログイン
az login --tenant contoso.onmicrosoft.com
# デバイスコードを使用したログイン(複数アカウントがある場合)
az login --tenant <tenant-id> --use-device-code
2. デプロイ設定ファイルの作成
プロジェクトの infrastructure/azure_container_apps/ フォルダ内で、デプロイ設定ファイルを作成します。
{
"resourceGroupName": "myweatherapp-prod-001",
"location": "japaneast",
"backendRelativePath": "../../MyWeatherApp.ApiService",
"frontendRelativePath": "../../MyWeatherApp.Web",
"logincommand": "az login --tenant yourorg.onmicrosoft.com --use-device-code"
}
ファイル名は mydeploy.local.json として保存し、以降のコマンドではmydeploy部分を参照名として使用します。
重要な注意点:
-
resourceGroupNameは小文字、ハイフン、数字のみ使用可能 -
locationはAzureリージョン名を指定(japaneast、eastus等) - パスは相対パスで指定
デプロイの実行
1. リソースグループの作成
# 実行権限を付与
chmod +x ./create_resource_group.sh
# リソースグループ作成
./create_resource_group.sh mydeploy
2. Key Vaultの削除状態確認(必要に応じて)
以前に同名のKey Vaultを削除した場合、論理削除状態になっている可能性があります。
# Key Vaultのパージ(必要な場合のみ)
chmod +x ./purge_keyvault.sh
./purge_keyvault.sh mydeploy
3. Log Analytics Workspaceの作成
chmod +x ./create_log-analytics.sh
./create_log-analytics.sh mydeploy
4. Azure Container Registryの作成
コンテナのイメージをデプロイするためのContainer Registryを作成します。
chmod +x ./create_container_registry.sh
./create_container_registry.sh mydeploy
5. コンテナのビルドとACRへのイメージのデプロイ
バックエンド、フロントエンドそれぞれのコンテナをビルドし、イメージをACRへデプロイします。
# バックエンドイメージのデプロイ
chmod +x ./code_deploy_backend.sh
./code_deploy_backend.sh mydeploy
# フロントエンドイメージのデプロイ
chmod +x ./code_deploy_frontend.sh
./code_deploy_frontend.sh mydeploy
6. インフラストラクチャのデプロイ
一括デプロイ
# 実行権限を付与
chmod +x ./runbicep.sh
./runbicep.sh mydeploy aca_main.bicep
段階的デプロイ(トラブルシューティング時)
何らかの理由で一括デプロイが失敗した場合、段階的にデプロイできます。
# Key Vaultのデプロイ
./runbicep.sh mydeploy 1.keyvault/create.bicep
# ストレージアカウントのデプロイ
./runbicep.sh mydeploy 2.storages/1.create.bicep
# その他のリソースも同様に
7. Key Vaultへのアクセス権限設定
# 自分自身にKey Vaultへのアクセス権限を付与
chmod +x ./user_access_keyvault.sh
./user_access_keyvault.sh mydeploy
デプロイされるAzureリソース
デプロイが完了すると、以下のAzureリソースが作成されます。
共通リソース
- Resource Group: すべてのリソースを含むコンテナ
- Key Vault: アプリケーション設定とシークレットの管理
- Storage Account: Orleans用のテーブルストレージとBlob
- Cosmos DB: イベントストアとOrleansクラスター管理
- Virtual Network: セキュアなネットワーク環境
- Application Insights: アプリケーション監視とログ
- Event Hub: Orleans用のメッセージング(オプション)
Container Apps関連
- Managed Environments: Backend, Frontend共通(プラン: Consumption)
- App Service(Backend): .NET APIアプリケーション
- App Service(Frontend): Blazor WebAssemblyアプリケーション
運用とモニタリング
Application Insightsでの監視
デプロイされたアプリケーションは、自動的にApplication Insightsと連携されます。
- パフォーマンス監視: レスポンス時間、スループットの監視
- エラー追跡: 例外やエラーの詳細ログ
- 分散トレース: Orleans Grainをまたいだリクエストの追跡
- カスタムメトリクス: ビジネスメトリクスの計測
スケーリング設定
Azure Container Appsは必要に応じてスケールアップ・スケールアウトが可能です。
スケールアップ/スケールダウン(コンテナのサイズ変更)
自動調整は行われないため、調整を行いたい場合は、ACAの resources の値を変更した後に、再度コンテナをデプロイし直すことで適用されます。
設定方法:
resource containerApp 'Microsoft.App/containerApps@2023-05-01' = {
name: containerAppName
...
properties: {
...
template: {
containers: [
{
name: 'backend'
image: containerImage
env: envModule.outputs.envVars
// Default value: 0.5/1Gi
// resources: {
// cpu: 1
// memory: '2Gi'
// }
}
]
}
スケールアウト/スケールイン(レプリカ数変更)
設定値に応じて、自動でレプリカの数がContainer Appsによって調整されます。
Scaleオプションとして下記の値をbicepで設定しています。
- レプリカの最小値と最大値
- minReplicas
- maxReplicas
- スケールアウトの条件(アクセス数、CPUの使用率)
- http
- custom(type: 'cpu')
設定方法:
resource containerApp 'Microsoft.App/containerApps@2023-05-01' = {
...
properties: {
...
template: {
...
scale: {
minReplicas: 1
maxReplicas: 5
rules: [
{
name: 'http-scaling'
http: {
metadata: {
concurrentRequests: '50'
}
}
}
{
name: 'cpu-scaler'
custom: {
type: 'cpu'
metadata: {
type: 'Utilization'
value: '70'
}
}
}
]
}
}
}
}
セキュリティ設定
- Key Vault: すべての機密情報(接続文字列、APIキー等)を安全に管理
- Managed Identity: アプリケーションがKey Vaultにアクセスする際の認証
- Virtual Network: Container Apps間の通信をプライベートネットワーク内に制限
- HTTPS強制: すべての通信をHTTPS化
-
バックエンドへの通信制限:
同じManagedEnvironmentを利用しているため、必要に応じてBackend側コンテナのネットワーク設定ingress: Externalをfalseにすることで、バックエンドの通信を内部コンテナからのみに制限可能
トラブルシューティング
よくある問題と解決方法
1. Key Vault作成エラー
# 論理削除されたKey Vaultのパージ
./purge_keyvault.sh mydeploy
2. App Serviceデプロイエラー
# ログの確認
az containerapp logs show \
--name <app-name> \
--resource-group <rg-name> \
--follow
3. Orleans接続エラー
- Cosmos DBとStorage Accountの接続文字列をKey Vaultで確認
- Virtual Network設定による接続制限の確認
4. Windows環境でのスクリプト実行エラー
- WSL2またはGit Bashの使用を推奨
- 権限エラーの場合は
chmod +xでスクリプトに実行権限を付与
まとめ
Sekibanを使って開発したアプリケーションは、含まれているBicepテンプレートとデプロイスクリプトを使用することで、簡単にAzure Container Appsにデプロイできます。
主なメリット:
- Infrastructure as Code: Bicepによる再現可能なデプロイ
- セキュアな設定: Key VaultとManaged Identityによる安全な運用
- スケーラブル: Orleans+Container Appsによる高いスケーラビリティ
- 監視可能: Application Insightsによる詳細な監視
Sekibanを使った現代的なイベントソーシングアプリケーションの開発・運用に、ぜひチャレンジしてみてください!
Discussion