次の方法で共有


チュートリアル: Azure Container Apps でイベントドリブン ジョブをデプロイする

Azure Container Apps のジョブを使用すると、有限の期間実行して終了するコンテナー化されたタスクを実行できます。 ジョブの実行は、手動で、スケジュールに従って、またはイベントに基づいてトリガーできます。 ジョブが最適なタスクは、データ処理、機械学習、リソースのクリーンアップ、サーバーレスのエフェメラル コンピューティング リソースを必要とするシナリオなどです。

このチュートリアルでは、イベントドリブン ジョブを使う方法について説明します。

  • コンテナー アプリをデプロイするための Container Apps 環境を作成する
  • コンテナー アプリにメッセージを送信するための Azure ストレージ キューを作成する
  • ジョブを実行するコンテナー イメージを構築する
  • ジョブを Container Apps 環境にデプロイする
  • キューのメッセージがコンテナー アプリによって処理されることを確認する

Azure Storage のキューに送信されたメッセージごとに、作成したジョブによって実行が開始されます。 ジョブの実行ごとに、次の手順を実行するコンテナーが実行されます。

  1. キューから 1 つのメッセージを取得します。
  2. ジョブの実行ログにメッセージをログします。
  3. キューからメッセージを削除します。
  4. 終了します。

重要

スケーラーによってキューの長さが監視され、開始するジョブの数が決まります。 正確なスケーリングを行うために、ジョブの実行で処理が完了するまで、キューからメッセージを削除しないでください。

このチュートリアルで実行するジョブのソース コードは、Azure サンプルの GitHub リポジトリで入手できます。

前提条件

  • アクティブなサブスクリプションが含まれる Azure アカウント。
  • Azure CLI をインストールします。
  • 制限事項の一覧については、「ジョブの制限事項」を参照してください。

設定

  1. CLI から Azure にサインインするには、次のコマンドを実行し、プロンプトに従って認証プロセスを完了します。

    az login
    
  2. upgrade コマンドを使用して、最新バージョンの CLI を実行していることを確認します。

    az upgrade
    
  3. 最新バージョンの Azure Container Apps CLI 拡張機能をインストールします。

    az extension add --name containerapp --upgrade
    
  4. まだ登録していない場合は、Azure サブスクリプションに Microsoft.AppMicrosoft.OperationalInsights、および Microsoft.Storage の名前空間を登録します。

    az provider register --namespace Microsoft.App
    az provider register --namespace Microsoft.OperationalInsights
    az provider register --namespace Microsoft.Storage
    
  5. Azure CLI のセットアップが完了したところで、この記事全体で使用される環境変数を定義できます。

    RESOURCE_GROUP="jobs-quickstart"
    LOCATION="northcentralus"
    ENVIRONMENT="env-jobs-quickstart"
    JOB_NAME="my-job"
    

Container Apps 環境を作成する

Azure Container Apps 環境は、コンテナー アプリとジョブを囲む安全な境界として機能するため、同じネットワークを共有したり、相互に通信したりすることができます。

  1. リソース グループを作成するには、次のコマンドを使用します。

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. 次のコマンドを使用して、Container Apps 環境を作成します。

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

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

ジョブは Azure Storage キューを使ってメッセージを受信します。 このセクションでは、ストレージ アカウントとキューを作成します。

  1. ストレージ アカウントの名前を定義します。

    STORAGE_ACCOUNT_NAME="<STORAGE_ACCOUNT_NAME>"
    QUEUE_NAME="myqueue"
    

    <STORAGE_ACCOUNT_NAME> は、お使いのストレージ アカウントの一意の名前に置き換えます。 ストレージ アカウント名は、Azure 内で一意であり、数字と小文字のみを含めた長さを 3 ~ 24 文字にする必要があります。

  2. 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
    
  3. キューの接続文字列を変数に保存します。

    QUEUE_CONNECTION_STRING=$(az storage account show-connection-string -g $RESOURCE_GROUP --name $STORAGE_ACCOUNT_NAME --query connectionString --output tsv)
    
  4. メッセージ キューを作成します。

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

ユーザー割り当てマネージド ID を作成する

管理資格情報の使用を避けるために、マネージド ID を認証に使用して Microsoft Azure Container Registry のプライベート リポジトリからイメージをプルできます。 可能な限り、イメージのプルにはユーザー割り当てマネージド ID を使用します。

  1. 「ユーザー割り当てマネージド ID を作成する」の手順を使用して、ユーザー割り当てマネージド ID を作成します。 次のコマンドを実行する前に、マネージド ID の名前を選択し、\<PLACEHOLDER\> をその名前に置き換えます。

    IDENTITY="<YOUR_IDENTITY_NAME>"
    
    az identity create \
        --name $IDENTITY \
        --resource-group $RESOURCE_GROUP
    
  2. この ID のリソース ID を取得します。

    IDENTITY_ID=$(az identity show \
        --name $IDENTITY \
        --resource-group $RESOURCE_GROUP \
        --query id \
        --output tsv)
    

ジョブを構築してデプロイする

ジョブをデプロイするには、まずジョブのコンテナー イメージを構築し、レジストリにプッシュする必要があります。 これで、ジョブを Container Apps 環境にデプロイできるようになります。

  1. コンテナー イメージとレジストリの名前を定義します。

    CONTAINER_IMAGE_NAME="queue-reader-job:1.0"
    CONTAINER_REGISTRY_NAME="<CONTAINER_REGISTRY_NAME>"
    

    <CONTAINER_REGISTRY_NAME> をコンテナー レジストリの一意の名前に置き換えます。 コンテナー レジストリ名は、"Azure 内で一意" であり、数字と小文字のみを含む 5 文字から 50 文字の長さにする必要があります。

  2. コンテナー レジストリを作成します。

    az acr create \
        --name "$CONTAINER_REGISTRY_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --location "$LOCATION" \
        --sku Basic
    
  3. マネージド ID を使用してイメージをプルするには、コンテナー レジストリで Azure Resource Manager (ARM) 対象ユーザー トークンを認証に使用できるようにする必要があります。

    次のコマンドを使用して、自分の Azure コンテナー レジストリ (ACR) に ARM トークンがアクセスできるかどうかを確認します。

    az acr config authentication-as-arm show --registry "$CONTAINER_REGISTRY_NAME"
    

    ARM トークンが許可されている場合、コマンドの出力は次のようになります。

    {
      "status": "enabled"
    }
    

    statusdisabled である場合は、次のコマンドを使用して ARM トークンを許可します。

    az acr config authentication-as-arm update --registry "$CONTAINER_REGISTRY_NAME" --status enabled
    
  4. このジョブのソース コードは 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"
    

    これで、コンテナー レジストリでイメージを使用できるようになります。

  5. 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 回実行されます。

ジョブが正しく構成されたことを確認するには、一部のメッセージをキューに送信して、ジョブの実行が開始されたことと、メッセージがジョブの実行ログが記録されていることを確認できます。

  1. メッセージをキューに送信します。

    az storage message put \
        --content "Hello Queue Reader Job" \
        --queue-name "$QUEUE_NAME" \
        --connection-string "$QUEUE_CONNECTION_STRING"
    
  2. ジョブの実行を一覧表示します。

    az containerapp job execution list \
        --name "$JOB_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --output json
    

    60 秒ごとにスケール ルールを評価するようにジョブが構成されているので、ジョブの実行が開始されるまで最長で 1 分かかる場合があります。 ジョブの実行を確認し、その状態が Succeeded になるまで、このコマンドを繰り返します。

  3. 次のコマンドを実行して、ログされたメッセージを確認します。 これらのコマンドには 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

次のステップ