共用方式為


教學:利用 Azure 容器應用程式部署事件驅動的工作

Azure 容器應用程式 的工作 讓你能執行容器化任務,這些任務會執行有限時間後停止。 您可以透過手動、依照排程或根據事件來觸發作業的執行。 最適合使用作業來進行的工作包括資料處理、機器學習、資源清理,或任何需要無伺服器暫時性計算資源的案例。

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

  • 建立一個容器應用程式環境來部署你的容器應用程式
  • 建立 Azure Storage 佇列來將訊息傳送到容器應用程式
  • 建置會執行作業的容器映像
  • 將作業部署至容器應用程式環境
  • 確認容器應用程式已處理佇列訊息

你建立的工作會為傳送到 Azure Storage 隊列的每個訊息啟動一個執行過程。 每個作業執行所執行的容器都會執行下列步驟:

  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
    

    如果這個指令回傳以下錯誤,請確定你已在 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"
    

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

為避免使用管理員憑證,請從 Azure 容器登錄檔的私人倉庫拉取映像檔。 使用受管理身份來進行驗證。 可能的話,請使用使用者指派的受控識別來提取映像。

  1. 建立使用者指派的受控識別。 在執行以下指令前,先為你的管理身份選擇一個名稱,並建立以下變數:

    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. 您的容器登錄必須允許 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. 在容器應用程式環境中建立工作:

    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 要指派給作業之使用者指派受控識別的資源識別碼。
    --registry-identity 管理身份的資源 ID 用來與登錄伺服器進行驗證,而非使用使用者名稱和密碼。 若可能,acrpull 會自動為該身份建立角色指派。
    --env-vars 要用於作業的環境變數。

    縮放規則設定會定義要監視的事件來源。 系統會在每個輪詢間隔進行評估,並決定要觸發多少個作業執行。 欲了解更多資訊,請參閱 Set 縮放規則

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

驗證部署

工作設定為每 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

後續步驟