📦

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ユーザーは事前に環境を整える必要があります。

必要なツール一覧

  1. Azure CLI: Azureリソースの管理
  2. Bash環境: デプロイスクリプトの実行
  3. jq: JSONデータの処理
  4. 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/ フォルダ内で、デプロイ設定ファイルを作成します。

mydeploy.local.json
{
    "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 の値を変更した後に、再度コンテナをデプロイし直すことで適用されます。

設定方法:

7.backend/2.container-app.bicep
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')

設定方法:

7.backend/2.container-app.bicep
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: Externalfalseにすることで、バックエンドの通信を内部コンテナからのみに制限可能

トラブルシューティング

よくある問題と解決方法

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にデプロイできます。

主なメリット:

  1. Infrastructure as Code: Bicepによる再現可能なデプロイ
  2. セキュアな設定: Key VaultとManaged Identityによる安全な運用
  3. スケーラブル: Orleans+Container Appsによる高いスケーラビリティ
  4. 監視可能: Application Insightsによる詳細な監視

Sekibanを使った現代的なイベントソーシングアプリケーションの開発・運用に、ぜひチャレンジしてみてください!

ジェイテックジャパンブログ

Discussion