通过


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

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

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

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

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

你创建的作业会为发送到 Azure 存储队列的每条消息启动一次执行。 每个作业执行都会运行容器以执行以下步骤:

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

重要

缩放器监控队列长度以确定要启动多少个任务。 为了进行准确的缩放,在作业执行完成处理之前,不要从队列中删除消息。

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

先决条件

有关容器应用作业不支持的功能的信息,请参阅 作业限制

准备环境

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

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

    az upgrade
    
  3. 安装最新版本的容器应用 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)
    

构建并部署任务

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

  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 容器注册表必须允许使用 Azure 资源管理器 (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 要分配给作业的用户分配的托管标识的资源 ID。
    --registry-identity 用于向注册表服务器进行身份验证的托管标识的资源 ID,而非使用用户名和密码。 如果可能,会自动为该标识创建 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

后续步骤