チュートリアル: Azure Container Apps を使用してバックグラウンド処理アプリケーションをデプロイする

Azure Container Apps を使用すると、パブリック エンドポイントを公開しなくてもアプリケーションをデプロイできます。 コンテナー アプリのスケーリング ルールを使用すると、Azure Storage キューの長さに基づいてアプリケーションをスケールアウトおよびスケールインできます。 キューにメッセージがない場合、コンテナー アプリは 0 にスケールインされます。

以下の方法について説明します。

  • コンテナー アプリをデプロイするための Container Apps 環境を作成する
  • コンテナー アプリにメッセージを送信するための Azure ストレージ キューを作成する
  • バックグラウンド処理アプリケーションをコンテナー アプリとしてデプロイする
  • キューのメッセージがコンテナー アプリによって処理されることを確認する

設定

まず、Azure にサインインします。 次のコマンドを実行し、プロンプトに従って認証プロセスを完了します。

az login

次に、CLI 用の Azure Container Apps 拡張機能をインストールします。

az extension add --name containerapp --upgrade

最新の拡張機能またはモジュールがインストールされたので、Microsoft.App 名前空間を登録します。

注意

Azure Container Apps リソースは、Microsoft.Web 名前空間から Microsoft.App 名前空間に移行されました。 詳細については、「2022 年 3 月に Microsoft.Web から Microsoft.App に名前空間を移行する」を参照してください。

az provider register --namespace Microsoft.App

Azure Monitor Log Analytics ワークスペースの Microsoft.OperationalInsights プロバイダーを登録します (以前に使用したことがない場合)。

az provider register --namespace Microsoft.OperationalInsights

次に、次の環境変数を設定します。

RESOURCE_GROUP="my-container-apps"
LOCATION="canadacentral"
CONTAINERAPPS_ENVIRONMENT="my-environment"

これらの変数を定義すると、新しいコンテナー アプリに関連するサービスを整理するためのリソース グループを作成できます。

az group create \
  --name $RESOURCE_GROUP \
  --location $LOCATION

CLI がアップグレードされ、新しいリソース グループが使用可能になったら、Container Apps 環境を作成し、コンテナー アプリをデプロイできます。

環境の作成

Azure Container Apps 環境では、コンテナー アプリのグループを囲むセキュリティ保護された境界が作成されます。 同じ環境にデプロイされた Container Apps は、同じ仮想ネットワークにデプロイされ、同じ Log Analytics ワークスペースにログを書き込みます。


個々のコンテナー アプリが、Azure Container Apps 環境にデプロイされます。 環境を作成するために、次のコマンドを実行します。

az containerapp env create \
  --name $CONTAINERAPPS_ENVIRONMENT \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION"

ストレージ キューを設定する

まず、ストレージ アカウントの名前を定義します。 ストレージ アカウント名は、Azure 内で一意であり、数字と小文字のみを含めた長さを 3 ~ 24 文字にする必要があります。

STORAGE_ACCOUNT_NAME="<STORAGE_ACCOUNT_NAME>"

Azure ストレージ アカウントを作成します。

az storage account create \
  --name $STORAGE_ACCOUNT_NAME \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION" \
  --sku Standard_RAGRS \
  --kind StorageV2

次に、キューの接続文字列を取得します。

QUEUE_CONNECTION_STRING=`az storage account show-connection-string -g $RESOURCE_GROUP --name $STORAGE_ACCOUNT_NAME --query connectionString --out json | tr -d '"'`

これで、メッセージ キューを作成できます。

az storage queue create \
  --name "myqueue" \
  --account-name $STORAGE_ACCOUNT_NAME \
  --connection-string $QUEUE_CONNECTION_STRING

最後に、キューにメッセージを送信できます。

az storage message put \
  --content "Hello Queue Reader App" \
  --queue-name "myqueue" \
  --connection-string $QUEUE_CONNECTION_STRING

バックグラウンド アプリケーションをデプロイする

queue.json というファイルを作成し、次の構成コードをファイルに貼り付けます。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "defaultValue": "canadacentral",
            "type": "String"
        },
        "environment_name": {
            "type": "String"
        },
        "queueconnection": {
            "type": "secureString"
        }
    },
    "variables": {},
    "resources": [
    {
        "name": "queuereader",
        "type": "Microsoft.App/containerApps",
        "apiVersion": "2022-03-01",
        "kind": "containerapp",
        "location": "[parameters('location')]",
        "properties": {
            "managedEnvironmentId": "[resourceId('Microsoft.App/managedEnvironments', parameters('environment_name'))]",
            "configuration": {
                "activeRevisionsMode": "single",
                "secrets": [
                {
                    "name": "queueconnection",
                    "value": "[parameters('queueconnection')]"
                }]
            },
            "template": {
                "containers": [
                    {
                        "image": "mcr.microsoft.com/azuredocs/containerapps-queuereader",
                        "name": "queuereader",
                        "env": [
                            {
                                "name": "QueueName",
                                "value": "myqueue"
                            },
                            {
                                "name": "QueueConnectionString",
                                "secretRef": "queueconnection"
                            }
                        ]
                    }
                ],
                "scale": {
                    "minReplicas": 1,
                    "maxReplicas": 10,
                    "rules": [
                        {
                            "name": "myqueuerule",
                            "azureQueue": {
                                "queueName": "myqueue",
                                "queueLength": 100,
                                "auth": [
                                    {
                                        "secretRef": "queueconnection",
                                        "triggerParameter": "connection"
                                    }
                                ]
                            }
                        }
                    ]
                }
            }
        }
    }]
}

これで、コンテナー アプリを作成してデプロイできます。

az deployment group create --resource-group "$RESOURCE_GROUP" \
  --template-file ./queue.json \
  --parameters \
    environment_name="$CONTAINERAPPS_ENVIRONMENT" \
    queueconnection="$QUEUE_CONNECTION_STRING" \
    location="$LOCATION"

このコマンドを実行すると、mcr.microsoft.com/azuredocs/containerapps-queuereader というパブリック コンテナー イメージからデモ アプリケーションがデプロイされ、アプリケーションで使われるシークレットと環境変数が設定されます。

アプリケーションは、ARM テンプレートの scale セクションで定義されているように、キューの長さに基づいて最大 10 レプリカまでスケールアウトされます。

結果を確認する

コンテナー アプリはバックグラウンド プロセスとして実行されます。 Azure Storage キューからメッセージが到着すると、アプリケーションは Log Analytics にログ エントリを作成します。 ログされたデータに対してクエリを実行する前に、初回の分析が到着するまで数分待機する必要があります。

ログに記録されたメッセージを表示するには、次のコマンドを実行します。 このコマンドには Log Analytics 拡張機能が必要なので、要求されたらプロンプトを受け入れて拡張機能をインストールします。

LOG_ANALYTICS_WORKSPACE_CLIENT_ID=`az containerapp env show --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.appLogsConfiguration.logAnalyticsConfiguration.customerId --out tsv`

az monitor log-analytics query \
  --workspace $LOG_ANALYTICS_WORKSPACE_CLIENT_ID \
  --analytics-query "ContainerAppConsoleLogs_CL | where ContainerAppName_s == 'queuereader' and Log_s contains 'Message ID' | project Time=TimeGenerated, AppName=ContainerAppName_s, Revision=RevisionName_s, Container=ContainerName_s, Message=Log_s | take 5" \
  --out table

ヒント

問題がある場合は、 GitHub の Azure Container Apps リポジトリでイシューを開いて、お知らせください。

リソースをクリーンアップする

完了したら、次のコマンドを実行して、Container Apps のリソースを含むリソース グループを削除します。

注意事項

次のコマンドを実行すると、指定されたリソース グループとそれに含まれるすべてのリソースが削除されます。 指定したリソース グループにこのチュートリアルの範囲外のリソースが含まれている場合、それらも削除されます。

az group delete \
  --resource-group $RESOURCE_GROUP