チュートリアル: Azure Container Apps でイベントドリブン ジョブをデプロイする
Azure Container Apps のジョブを使用すると、有限の期間実行して終了するコンテナー化されたタスクを実行できます。 ジョブの実行は、手動で、スケジュールに従って、またはイベントに基づいてトリガーできます。 ジョブが最適なタスクは、データ処理、機械学習、リソースのクリーンアップ、サーバーレスのエフェメラル コンピューティング リソースを必要とするシナリオなどです。
このチュートリアルでは、イベントドリブン ジョブを使う方法について説明します。
- コンテナー アプリをデプロイするための Container Apps 環境を作成する
- コンテナー アプリにメッセージを送信するための Azure ストレージ キューを作成する
- ジョブを実行するコンテナー イメージを構築する
- ジョブを Container Apps 環境にデプロイする
- キューのメッセージがコンテナー アプリによって処理されることを確認する
Azure Storage のキューに送信されたメッセージごとに、作成したジョブによって実行が開始されます。 ジョブの実行ごとに、次の手順を実行するコンテナーが実行されます。
- キューから 1 つのメッセージを取得します。
- ジョブの実行ログにメッセージをログします。
- キューからメッセージを削除します。
- 終了します。
重要
スケーラーによってキューの長さが監視され、開始するジョブの数が決まります。 正確なスケーリングを行うために、ジョブの実行で処理が完了するまで、キューからメッセージを削除しないでください。
このチュートリアルで実行するジョブのソース コードは、Azure サンプルの GitHub リポジトリで入手できます。
前提条件
- アクティブなサブスクリプションが含まれる Azure アカウント。
- 持っていない場合は、無料で作成できます。
- Azure CLI をインストールします。
- 制限事項の一覧については、「ジョブの制限事項」を参照してください。
設定
CLI から Azure にサインインするには、次のコマンドを実行し、プロンプトに従って認証プロセスを完了します。
az login
upgrade コマンドを使用して、最新バージョンの CLI を実行していることを確認します。
az upgrade
最新バージョンの Azure Container Apps CLI 拡張機能をインストールします。
az extension add --name containerapp --upgrade
まだ登録していない場合は、Azure サブスクリプションに
Microsoft.App
、Microsoft.OperationalInsights
、およびMicrosoft.Storage
の名前空間を登録します。az provider register --namespace Microsoft.App az provider register --namespace Microsoft.OperationalInsights az provider register --namespace Microsoft.Storage
Azure CLI のセットアップが完了したところで、この記事全体で使用される環境変数を定義できます。
RESOURCE_GROUP="jobs-quickstart" LOCATION="northcentralus" ENVIRONMENT="env-jobs-quickstart" JOB_NAME="my-job"
Container Apps 環境を作成する
Azure Container Apps 環境は、コンテナー アプリとジョブを囲む安全な境界として機能するため、同じネットワークを共有したり、相互に通信したりすることができます。
リソース グループを作成するには、次のコマンドを使用します。
az group create \ --name "$RESOURCE_GROUP" \ --location "$LOCATION"
次のコマンドを使用して、Container Apps 環境を作成します。
az containerapp env create \ --name "$ENVIRONMENT" \ --resource-group "$RESOURCE_GROUP" \ --location "$LOCATION"
ストレージ キューを設定する
ジョブは Azure Storage キューを使ってメッセージを受信します。 このセクションでは、ストレージ アカウントとキューを作成します。
ストレージ アカウントの名前を定義します。
STORAGE_ACCOUNT_NAME="<STORAGE_ACCOUNT_NAME>" QUEUE_NAME="myqueue"
<STORAGE_ACCOUNT_NAME>
は、お使いのストレージ アカウントの一意の名前に置き換えます。 ストレージ アカウント名は、Azure 内で一意であり、数字と小文字のみを含めた長さを 3 ~ 24 文字にする必要があります。Azure Storage アカウントを作成します。
az storage account create \ --name "$STORAGE_ACCOUNT_NAME" \ --resource-group "$RESOURCE_GROUP" \ --location "$LOCATION" \ --sku Standard_LRS \ --kind StorageV2
このコマンドでエラーが返された場合:
(SubscriptionNotFound) Subscription <SUBSCRIPTION_ID> was not found. Code: SubscriptionNotFound Message: Subscription <SUBSCRIPTION_ID> was not found.
Microsoft.Storage
名前空間が Azure サブスクリプションに登録されていることを確認します。az provider register --namespace Microsoft.Storage
キューの接続文字列を変数に保存します。
QUEUE_CONNECTION_STRING=$(az storage account show-connection-string -g $RESOURCE_GROUP --name $STORAGE_ACCOUNT_NAME --query connectionString --output tsv)
メッセージ キューを作成します。
az storage queue create \ --name "$QUEUE_NAME" \ --account-name "$STORAGE_ACCOUNT_NAME" \ --connection-string "$QUEUE_CONNECTION_STRING"
ユーザー割り当てマネージド ID を作成する
管理資格情報の使用を避けるために、マネージド ID を認証に使用して Microsoft Azure Container Registry のプライベート リポジトリからイメージをプルできます。 可能な限り、イメージのプルにはユーザー割り当てマネージド ID を使用します。
「ユーザー割り当てマネージド ID を作成する」の手順を使用して、ユーザー割り当てマネージド ID を作成します。 次のコマンドを実行する前に、マネージド ID の名前を選択し、
\<PLACEHOLDER\>
をその名前に置き換えます。IDENTITY="<YOUR_IDENTITY_NAME>"
az identity create \ --name $IDENTITY \ --resource-group $RESOURCE_GROUP
この ID のリソース ID を取得します。
IDENTITY_ID=$(az identity show \ --name $IDENTITY \ --resource-group $RESOURCE_GROUP \ --query id \ --output tsv)
ジョブを構築してデプロイする
ジョブをデプロイするには、まずジョブのコンテナー イメージを構築し、レジストリにプッシュする必要があります。 これで、ジョブを Container Apps 環境にデプロイできるようになります。
コンテナー イメージとレジストリの名前を定義します。
CONTAINER_IMAGE_NAME="queue-reader-job:1.0" CONTAINER_REGISTRY_NAME="<CONTAINER_REGISTRY_NAME>"
<CONTAINER_REGISTRY_NAME>
をコンテナー レジストリの一意の名前に置き換えます。 コンテナー レジストリ名は、"Azure 内で一意" であり、数字と小文字のみを含む 5 文字から 50 文字の長さにする必要があります。コンテナー レジストリを作成します。
az acr create \ --name "$CONTAINER_REGISTRY_NAME" \ --resource-group "$RESOURCE_GROUP" \ --location "$LOCATION" \ --sku Basic
マネージド ID を使用してイメージをプルするには、コンテナー レジストリで Azure Resource Manager (ARM) 対象ユーザー トークンを認証に使用できるようにする必要があります。
次のコマンドを使用して、自分の Azure コンテナー レジストリ (ACR) に ARM トークンがアクセスできるかどうかを確認します。
az acr config authentication-as-arm show --registry "$CONTAINER_REGISTRY_NAME"
ARM トークンが許可されている場合、コマンドの出力は次のようになります。
{ "status": "enabled" }
status
がdisabled
である場合は、次のコマンドを使用して ARM トークンを許可します。az acr config authentication-as-arm update --registry "$CONTAINER_REGISTRY_NAME" --status enabled
このジョブのソース コードは GitHub で入手できます。 次のコマンドを実行してリポジトリをクローンし、クラウドで
az acr build
コマンドを使ってコンテナー イメージを構築します。az acr build \ --registry "$CONTAINER_REGISTRY_NAME" \ --image "$CONTAINER_IMAGE_NAME" \ "https://github.com/Azure-Samples/container-apps-event-driven-jobs-tutorial.git"
これで、コンテナー レジストリでイメージを使用できるようになります。
Container Apps 環境でジョブを作成します。
az containerapp job create \ --name "$JOB_NAME" \ --resource-group "$RESOURCE_GROUP" \ --environment "$ENVIRONMENT" \ --trigger-type "Event" \ --replica-timeout "1800" \ --min-executions "0" \ --max-executions "10" \ --polling-interval "60" \ --scale-rule-name "queue" \ --scale-rule-type "azure-queue" \ --scale-rule-metadata "accountName=$STORAGE_ACCOUNT_NAME" "queueName=$QUEUE_NAME" "queueLength=1" \ --scale-rule-auth "connection=connection-string-secret" \ --image "$CONTAINER_REGISTRY_NAME.azurecr.io/$CONTAINER_IMAGE_NAME" \ --cpu "0.5" \ --memory "1Gi" \ --secrets "connection-string-secret=$QUEUE_CONNECTION_STRING" \ --registry-server "$CONTAINER_REGISTRY_NAME.azurecr.io" \ --mi-user-assigned "$IDENTITY_ID" \ --registry-identity "$IDENTITY_ID" \ --env-vars "AZURE_STORAGE_QUEUE_NAME=$QUEUE_NAME" "AZURE_STORAGE_CONNECTION_STRING=secretref:connection-string-secret"
次の表で、コマンドで使われるキー パラメーターについて説明します。
パラメーター 説明 --replica-timeout
レプリカが実行できる最長時間。 --min-executions
ポーリング間隔ごとに実行するジョブの実行の最小数。 --max-executions
ポーリング間隔ごとに実行するジョブの実行の最大数。 --polling-interval
スケール ルールを評価するポーリング間隔。 --scale-rule-name
スケール ルールの名前。 --scale-rule-type
使うスケール ルールの種類。 --scale-rule-metadata
スケール ルールのメタデータ。 --scale-rule-auth
スケール ルールの認証。 --secrets
ジョブに使うシークレット。 --registry-server
ジョブに使うコンテナー レジストリ サーバー。 Azure Container Registry の場合、このコマンドによって認証が自動的に構成されます。 --mi-user-assigned
ジョブに割り当てるユーザー割り当てマネージド ID のリソース ID。 --registry-identity
レジストリ サーバーで認証するためにユーザー名とパスワードの代わりに使用するマネージド ID のリソース ID。 可能な場合は、ID に対して "acrpull" ロールの割り当てが自動的に作成されます。 --env-vars
ジョブに使う環境変数。 スケール ルールの構成によって、監視するイベント ソースを定義します。 これはポーリング間隔ごとに評価され、トリガーするジョブの実行回数が決まります。 詳細については、スケーリング ルールの設定に関する記事を参照してください。
これでイベントドリブン ジョブが Container Apps 環境に作成されました。
デプロイを検証する
このジョブは、キュー内のメッセージ数を確認するスケール ルールを 60 秒ごとに評価するように構成されています。 評価期間ごとに、キュー内の各メッセージに対して新しいジョブの実行が開始され、最大で 10 回実行されます。
ジョブが正しく構成されたことを確認するには、一部のメッセージをキューに送信して、ジョブの実行が開始されたことと、メッセージがジョブの実行ログが記録されていることを確認できます。
メッセージをキューに送信します。
az storage message put \ --content "Hello Queue Reader Job" \ --queue-name "$QUEUE_NAME" \ --connection-string "$QUEUE_CONNECTION_STRING"
ジョブの実行を一覧表示します。
az containerapp job execution list \ --name "$JOB_NAME" \ --resource-group "$RESOURCE_GROUP" \ --output json
60 秒ごとにスケール ルールを評価するようにジョブが構成されているので、ジョブの実行が開始されるまで最長で 1 分かかる場合があります。 ジョブの実行を確認し、その状態が
Succeeded
になるまで、このコマンドを繰り返します。次のコマンドを実行して、ログされたメッセージを確認します。 これらのコマンドには Log Analytics 拡張機能が必要なので、要求されたらプロンプトを受け入れて拡張機能をインストールします。
LOG_ANALYTICS_WORKSPACE_ID=$(az containerapp env show --name $ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.appLogsConfiguration.logAnalyticsConfiguration.customerId --output tsv) az monitor log-analytics query \ --workspace "$LOG_ANALYTICS_WORKSPACE_ID" \ --analytics-query "ContainerAppConsoleLogs_CL | where ContainerJobName_s == '$JOB_NAME' | order by _timestamp_d asc"
ContainerAppConsoleLogs_CL
テーブルの準備が整うまで、このコマンドからエラーBadArgumentError: The request had some invalid properties
が返されます。 しばらく待ってから再試行してください。
ヒント
問題がある場合は、 GitHub の Azure Container Apps リポジトリでイシューを開いて、お知らせください。
リソースをクリーンアップする
完了したら、次のコマンドを実行して、Container Apps のリソースを含むリソース グループを削除します。
注意事項
次のコマンドを実行すると、指定されたリソース グループとそれに含まれるすべてのリソースが削除されます。 指定したリソース グループにこのチュートリアルの範囲外のリソースが含まれている場合、それらも削除されます。
az group delete \
--resource-group $RESOURCE_GROUP