다음을 통해 공유

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

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

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

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

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

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

重要

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

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

先决条件

设置

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

    az cloud set -n AzureChinaCloud
    az login
    # az cloud set -n AzureCloud   //means return to Public Azure.
    
  2. 确保通过升级命令运行最新版本的 CLI。

    az upgrade
    
  3. 安装最新版 Azure 容器应用 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. 完成 Azure CLI 安装后,接下来可以定义要在本文中使用的环境变量。

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

创建容器应用环境

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

  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 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.cn/$CONTAINER_IMAGE_NAME" \
        --cpu "0.5" \
        --memory "1Gi" \
        --secrets "connection-string-secret=$QUEUE_CONNECTION_STRING" \
        --registry-server "$CONTAINER_REGISTRY_NAME.azurecr.cn" \
        --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

提示

是否有任何疑问? 在 GitHub 上告知我们,请在 Azure 容器应用存储库中创建一个问题。

清理资源

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

注意

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

az group delete \
    --resource-group $RESOURCE_GROUP

后续步骤