共用方式為


教學課程:使用 Azure 容器應用程式來部署事件驅動作業

Azure 容器應用程式的作業 (部分機器翻譯) 可讓您執行會在執行一段有限時間後結束的容器化工作。 您可以透過手動、依照排程或根據事件來觸發作業的執行。 最適合使用作業來進行的工作包括資料處理、機器學習、資源清理,或任何需要無伺服器暫時性計算資源的案例。

在本教學課程中,您會了解如何使用事件驅動作業 (部分機器翻譯)。

  • 建立容器應用程式環境以部署容器應用程式
  • 建立 Azure 儲存體佇列以將訊息傳送至容器應用程式
  • 建置會執行作業的容器映像
  • 將作業部署至容器應用程式環境
  • 確認容器應用程式已處理佇列訊息

您建立的作業會針對傳送至 Azure 儲存體佇列的每個訊息來開始執行。 每個作業執行所執行的容器都會執行下列步驟:

  1. 從佇列中取得一則訊息。
  2. 將訊息記錄至作業執行記錄。
  3. 從佇列中刪除該訊息。
  4. 結束。

重要事項

縮放器會監視佇列的長度以確定要啟動的工作數。 為了準確調整,在工作執行完成處理訊息之前,請勿從佇列中刪除該訊息。

您在本教學課程中執行的作業,其原始程式碼可在 Azure 範例 GitHub 存放庫 (英文) 中取得。

先決條件

關於容器應用程式工作不支援的功能資訊,請參閱 工作限制

準備環境

  1. 要從 Azure CLI 登入 Azure,請執行以下指令並依照提示完成認證流程。

    az login
    
  2. 請透過指令 az upgrade 確認你正在執行最新版本的 Azure CLI。

    az upgrade
    
  3. 安裝最新版本的 Container Apps CLI 擴充功能。

    az extension add --name containerapp --upgrade
    
  4. 如果你的 Azure 訂閱中還沒註冊,請註冊 Microsoft.AppMicrosoft.OperationalInsightsMicrosoft.Storage 命名空間。

    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"
    

建立容器應用程式環境

容器應用程式環境作為容器應用程式與工作之間的隔離邊界,讓它們能共享同一網路並彼此通訊。

  1. 使用下列命令來建立資源群組。

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. 請使用以下指令建立容器應用程式環境。

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

設定儲存體佇列

作業會使用 Azure 儲存體佇列來接收訊息。 在本節中,您會建立儲存體帳戶和佇列。

  1. 定義儲存體帳戶的名稱。

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

    <STORAGE_ACCOUNT_NAME> 取代為儲存體帳戶的唯一名稱。 儲存體帳戶名稱必須是 Azure 中唯一的,且長度為 3 到 24 個字元,僅包含數字和小寫字母。

  2. 建立 Azure 儲存體帳戶。

    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.
    

    請確定您已在您的 Azure 訂用帳戶中註冊了 Microsoft.Storage 命名空間。

    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"
    

建立使用者指派的受控識別

若要避免使用管理認證,請使用受控識別進行驗證,從 Microsoft Azure Container Registry 中的私人存放庫中提取映像。 可能的話,請使用使用者指派的受控識別來提取映像。

  1. 建立使用者指派的受控識別。 執行下列命令之前,請為您的受控識別選擇一個名稱,並將 \<PLACEHOLDER\> 取代為該名稱。

    IDENTITY="<YOUR_IDENTITY_NAME>"
    
    az identity create \
        --name $IDENTITY \
        --resource-group $RESOURCE_GROUP
    
  2. 取得身分識別的資源識別碼。

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

建置和部署作業

若要部署作業,您必須先建置作業的容器映像,並將其推送至登錄。 然後,您可以將作業部署至容器應用程式環境。

  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. 您的容器登錄必須允許 Azure Resource Manager (ARM) 對象權杖進行驗證,才能使用受控識別來提取映像。

    使用下列命令來檢查是否允許 ARM 權杖來存取您的 Azure Container Registry (ACR)。

    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. 在容器應用程式環境中建立作業。

    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 要指派給作業之使用者指派受控識別的資源識別碼。
    --registry-identity 用於向登錄伺服器進行驗證的受控識別的資源識別碼,而不是使用使用者名稱和密碼。 可能的話,系統會自動為身分識別建立 'acrpull' 角色指派。
    --env-vars 要用於作業的環境變數。

    縮放規則設定會定義要監視的事件來源。 其會在每個輪詢間隔進行評估,並判斷要觸發的作業執行數目。 若要深入了解,請參閱設定縮放規則 (部分機器翻譯)。

系統現在會在容器應用程式環境中建立事件驅動作業。

驗證部署

作業會設定為每隔 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 秒評估一次縮放規則,因此最多可能需要一分鐘的時間,作業的執行才會開始。 重複該命令,直到您看到作業執行且其狀態為 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。 請等候幾分鐘後再試。

秘訣

有問題嗎? 在 Azure 容器應用程式存放庫中提出問題,讓我們在 GitHub 上了解該問題。

清除資源

完成後,請執行下列命令來刪除包含您容器應用程式資源的資源群組。

注意

下列命令會刪除指定的資源群組和其中包含的所有資源。 如果本教學課程範圍以外的資源存在於指定的資源群組中,則也會一併刪除。

az group delete \
    --resource-group $RESOURCE_GROUP

後續步驟