使用英语阅读

通过


你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:使用 Azure 容器应用部署事件驱动作业

使用 Azure 容器应用作业可以运行容器化任务,这些任务会在有限的时间内执行并退出。 可以根据计划或基于事件手动触发作业执行。 作业最适合用于数据处理、机器学习、资源清理等任务,或任何需要无服务器临时计算资源的方案。

本教程介绍如何使用事件驱动作业

  • 创建容器应用环境以部署容器应用
  • 创建 Azure 存储队列以将消息发送到容器应用
  • 生成运行作业的容器映像
  • 将作业部署到容器应用环境
  • 验证队列消息是否由容器应用处理

创建的作业会针对发送到 Azure 存储队列的每条消息开始执行。 每个作业执行都会运行容器以执行以下步骤:

  1. 获取队列中的一条消息。
  2. 将消息记录到作业执行日志。
  3. 从队列中删除该消息。
  4. 退出。

重要

缩放器会监视队列的长度,以确定要启动的作业数。 为了进行准确的缩放,在作业执行处理完消息之前,不要从队列中删除该消息。

本教程中运行的作业源代码在 Azure 示例 GitHub 存储库中提供。

先决条件

设置

  1. 若要从 CLI 登录到 Azure,请运行以下命令,然后按照提示完成身份验证过程。

    Azure CLI
    az login
    
  2. 确保通过升级命令运行最新版本的 CLI。

    Azure CLI
    az upgrade
    
  3. 安装最新版 Azure 容器应用 CLI 扩展。

    Azure CLI
    az extension add --name containerapp --upgrade
    
  4. 如果尚未在 Azure 订阅中注册 Microsoft.AppMicrosoft.OperationalInsightsMicrosoft.Storage 命名空间,请进行注册。

    Azure CLI
    az provider register --namespace Microsoft.App
    az provider register --namespace Microsoft.OperationalInsights
    az provider register --namespace Microsoft.Storage
    
  5. 完成 Azure CLI 安装后,接下来可以定义要在本文中使用的环境变量。

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

创建容器应用环境

Azure 容器应用环境充当容器应用和作业周围的安全边界,因此容器应用和作业可以共享同一网络并相互通信。

  1. 使用以下命令创建资源组。

    Azure CLI
    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. 使用以下命令创建容器应用环境。

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

设置存储队列

作业使用 Azure 存储队列来接收消息。 在本部分中,将创建一个存储帐户和一个队列。

  1. 为存储帐户定义一个名称。

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

    使用存储帐户的唯一名称替换 <STORAGE_ACCOUNT_NAME>。 存储帐户名称在 Azure 中必须是唯一的,长度为 3 到 24 个字符,仅包含数字和小写字母。

  2. 创建 Azure 存储帐户。

    Azure CLI
    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 命名空间。

    Azure CLI
    az provider register --namespace Microsoft.Storage
    
  3. 将队列的连接字符串保存到变量中。

    Bash
    QUEUE_CONNECTION_STRING=$(az storage account show-connection-string -g $RESOURCE_GROUP --name $STORAGE_ACCOUNT_NAME --query connectionString --output tsv)
    
  4. 创建消息队列。

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

创建用户分配的托管标识

为了避免使用管理凭据,请使用托管标识进行身份验证,从 Microsoft Azure 容器注册表中的专用存储库拉取映像。 如果可能,请使用用户分配的托管标识来拉取映像。

  1. 创建用户分配的托管标识。 在运行以下命令之前,请选择托管标识的名称,并将 \<PLACEHOLDER\> 替换为该名称。

    Bash
    IDENTITY="<YOUR_IDENTITY_NAME>"
    
    Azure CLI
    az identity create \
        --name $IDENTITY \
        --resource-group $RESOURCE_GROUP
    
  2. 获取标识的资源 ID。

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

生成并部署作业

若要部署作业,必须先为作业生成容器映像并将其推送到注册表。 然后,可以将作业部署到容器应用环境。

  1. 为容器映像和注册表定义一个名称。

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

    使用容器注册表的唯一名称替换 <CONTAINER_REGISTRY_NAME>。 容器注册表名称在 Azure 中必须是唯一的,长度为 5 到 50 个字符,仅包含数字和小写字母。

  2. 创建容器注册表。

    Azure CLI
    az acr create \
        --name "$CONTAINER_REGISTRY_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --location "$LOCATION" \
        --sku Basic
    
  3. 容器注册表必须允许使用 Azure 资源管理器 (ARM) 受众令牌进行身份验证,才能使用托管标识来拉取映像。

    请使用以下命令来检查是否允许使用 ARM 令牌访问 Azure 容器注册表 (ACR)。

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

    如果允许 ARM 令牌,命令将输出以下内容。

    {
      "status": "enabled"
    }
    

    如果 statusdisabled,请使用以下命令允许 ARM 令牌。

    Azure CLI
    az acr config authentication-as-arm update --registry "$CONTAINER_REGISTRY_NAME" --status enabled
    
  4. 作业的源代码在 GitHub 上提供。 运行以下命令,以使用 az acr build 命令克隆存储库并在云中生成容器映像。

    Azure CLI
    az acr build \
        --registry "$CONTAINER_REGISTRY_NAME" \
        --image "$CONTAINER_IMAGE_NAME" \
        "https://github.com/Azure-Samples/container-apps-event-driven-jobs-tutorial.git"
    

    映像现已在容器注册表中可用。

  5. 在容器应用环境中创建作业。

    Azure CLI
    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。
    --registry-identity 要通过注册表服务器(而不是使用用户名和密码)进行身份验证的托管标识的资源 ID。 如果可能,会自动为标识创建“acrpull”角色分配。
    --env-vars 作业要使用的环境变量。

    缩放规则配置定义要监视的事件源。 缩放规则会在每个轮询间隔进行评估,并确定要触发的作业执行次数。 若要了解详细信息,请参阅设置缩放规则

事件驱动作业现已在容器应用环境中创建。

验证部署

将作业配置为每隔 60 秒评估一次缩放规则,该规则检查队列中的消息数。 对于每个评估周期,它会为队列中的每个消息启动一个新的作业执行,最多可执行 10 次。

若要验证作业是否已正确配置,可以发送一些消息到队列,确认作业执行已启动,并将消息记录到作业执行日志。

  1. 发送消息到队列。

    Azure CLI
    az storage message put \
        --content "Hello Queue Reader Job" \
        --queue-name "$QUEUE_NAME" \
        --connection-string "$QUEUE_CONNECTION_STRING"
    
  2. 列出作业的执行情况。

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

    由于作业配置为每 60 秒评估一次缩放规则,因此可能需要整整一分钟的时间才能开始执行作业。 重复该命令,直到看到作业执行并且其状态为 Succeeded

  3. 运行以下命令以查看记录的消息。 这些命令需要 Log Analytics 扩展,因此请在请求时接受安装扩展的提示。

    Azure CLI
    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 的信息。

清理资源

完成后,运行以下命令以删除包含容器应用资源的资源组。

注意

以下命令删除指定的资源组及其包含的所有资源。 如果指定的资源组中存在本教程范围外的资源,这些资源也会被删除。

Azure CLI
az group delete \
    --resource-group $RESOURCE_GROUP

后续步骤