次の方法で共有


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

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

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

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

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

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

重要

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

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

前提条件

  • アクティブなサブスクリプションが含まれる Azure アカウント。 持っていない場合は、無料で作成できます。
  • Azure CLI

Container Apps ジョブでサポートされていない機能の詳細については、「 ジョブの制限」を参照してください。

環境の準備

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

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

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

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

    az provider register --namespace Microsoft.App
    az provider register --namespace Microsoft.OperationalInsights
    az provider register --namespace Microsoft.Storage
    
  5. この記事全体で使用される環境変数を定義します。

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

Container Apps 環境を作成する

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
    

    このコマンドで次のエラーが返される場合は、azure サブスクリプションに Microsoft.Storage 名前空間を登録していることを確認してください。

    (SubscriptionNotFound) Subscription <SUBSCRIPTION_ID> was not found.
    Code: SubscriptionNotFound
    Message: Subscription <SUBSCRIPTION_ID> was not found.
    

    名前空間を登録するには、次のコマンドを使用します。

    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 を作成する

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

  1. ユーザー割り当てマネージド ID を作成します。 次のコマンドを実行する前に、マネージド ID の名前を選択し、次の変数を作成します。

    IDENTITY="<YOUR_IDENTITY_NAME>"
    
    az identity create \
        --name $IDENTITY \
        --resource-group $RESOURCE_GROUP
    
  2. アイデンティティのリソース 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) 対象ユーザー トークンを認証に使用できるようにする必要があります。

    次のコマンドを使用して、ARM トークンが Azure コンテナー レジストリへのアクセスを許可されているかどうかを確認します。

    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 \
        --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 コンテナー レジストリの場合、コマンドによって認証が自動的に構成されます。
    --mi-user-assigned ジョブに割り当てるユーザー割り当てマネージド ID のリソース ID。
    --registry-identity ユーザー名とパスワードを使用するのではなく、レジストリ サーバーで認証するマネージド ID のリソース ID。 可能であれば、 ロールの割り当てが ID に対して自動的に作成されます。
    --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

次のステップ