你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用 Azure 容器应用 作业 ,可以运行在有限持续时间内运行的容器化任务,然后停止。 可以根据计划或基于事件手动触发作业执行。 作业最适合用于数据处理、机器学习、资源清理等任务,或任何需要无服务器临时计算资源的方案。
本教程介绍如何使用事件驱动作业。
- 创建用于部署容器应用的容器应用环境
- 创建 Azure 存储队列以将消息发送到容器应用
- 生成运行作业的容器映像
- 将作业部署到容器应用环境
- 验证队列消息是否由容器应用处理
你创建的作业会为发送到 Azure 存储队列的每条消息启动一次执行。 每个作业执行都会运行容器以执行以下步骤:
- 获取队列中的一条消息。
- 将消息记录到作业执行日志。
- 从队列中删除该消息。
- 停止。
重要
缩放器监控队列长度以确定要启动多少个任务。 为了进行准确的缩放,在作业执行完成处理之前,不要从队列中删除消息。
本教程中运行的作业源代码在 Azure 示例 GitHub 存储库中提供。
先决条件
有关容器应用作业不支持的功能的信息,请参阅 作业限制。
准备环境
若要从 Azure CLI 登录到 Azure,请运行以下命令并按照提示完成身份验证过程。
az login确保通过
az upgrade命令运行最新版本的 Azure CLI。az upgrade安装最新版本的容器应用 CLI 扩展。
az extension add --name containerapp --upgrade在您的 Azure 订阅中,如果
Microsoft.App、Microsoft.OperationalInsights和Microsoft.Storage命名空间尚未注册,请注册它们。az provider register --namespace Microsoft.App az provider register --namespace Microsoft.OperationalInsights az provider register --namespace Microsoft.Storage定义本文中使用的环境变量。
RESOURCE_GROUP="jobs-quickstart" LOCATION="northcentralus" ENVIRONMENT="env-jobs-quickstart" JOB_NAME="my-job"
创建容器应用环境
容器应用环境充当容器应用和作业的隔离边界,因此它们可以共享同一网络并相互通信。
使用以下命令创建资源组。
az group create \ --name "$RESOURCE_GROUP" \ --location "$LOCATION"使用以下命令创建容器应用环境。
az containerapp env create \ --name "$ENVIRONMENT" \ --resource-group "$RESOURCE_GROUP" \ --location "$LOCATION"
设置存储队列
作业使用 Azure 存储队列来接收消息。 在本部分中,将创建一个存储帐户和一个队列。
为存储帐户定义一个名称。
STORAGE_ACCOUNT_NAME="<STORAGE_ACCOUNT_NAME>" QUEUE_NAME="myqueue"使用存储帐户的唯一名称替换
<STORAGE_ACCOUNT_NAME>。 存储帐户名称在 Azure 中必须是唯一的。 它们长度必须介于 3 到 24 个字符之间,并且仅包含数字和小写字母。创建 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将队列的连接字符串保存到变量中:
QUEUE_CONNECTION_STRING=$(az storage account show-connection-string -g $RESOURCE_GROUP --name $STORAGE_ACCOUNT_NAME --query connectionString --output tsv)创建消息队列:
az storage queue create \ --name "$QUEUE_NAME" \ --account-name "$STORAGE_ACCOUNT_NAME" \ --connection-string "$QUEUE_CONNECTION_STRING"
创建用户分配的托管标识
为了避免使用管理凭据,请从 Azure 容器注册表中的专用存储库拉取映像。 使用托管标识进行身份验证。 如果可能,请使用用户分配的托管标识来拉取映像。
创建用户分配的托管标识。 在运行以下命令之前,请选择托管标识的名称并创建以下变量:
IDENTITY="<YOUR_IDENTITY_NAME>"az identity create \ --name $IDENTITY \ --resource-group $RESOURCE_GROUP获取标识的资源 ID:
IDENTITY_ID=$(az identity show \ --name $IDENTITY \ --resource-group $RESOURCE_GROUP \ --query id \ --output tsv)
构建并部署任务
若要部署作业,必须先为其生成容器映像,然后将容器推送到注册表。 然后,可以将作业部署到容器应用环境。
定义容器映像和注册表的名称:
CONTAINER_IMAGE_NAME="queue-reader-job:1.0" CONTAINER_REGISTRY_NAME="<CONTAINER_REGISTRY_NAME>"使用容器注册表的唯一名称替换
<CONTAINER_REGISTRY_NAME>。 容器注册表名称在 Azure 中必须是唯一的。 它们长度必须介于 5 到 50 个字符之间,并且仅包含数字和小写字母。创建容器注册表:
az acr create \ --name "$CONTAINER_REGISTRY_NAME" \ --resource-group "$RESOURCE_GROUP" \ --location "$LOCATION" \ --sku BasicAzure 容器注册表必须允许使用 Azure 资源管理器 (ARM) 受众令牌进行身份验证,才能使用托管标识来拉取映像。
使用以下命令检查是否允许 ARM 令牌访问 Azure 容器注册表:
az acr config authentication-as-arm show --registry "$CONTAINER_REGISTRY_NAME"如果允许 ARM 令牌,则会看到以下输出:
{ "status": "enabled" }如果
status是disabled,请使用以下命令来启用 ARM 令牌:az acr config authentication-as-arm update --registry "$CONTAINER_REGISTRY_NAME" --status enabled作业的源代码在 GitHub 上提供。 运行以下命令,克隆存储库并在云中生成容器映像:
az acr build \ --registry "$CONTAINER_REGISTRY_NAME" \ --image "$CONTAINER_IMAGE_NAME" \ "https://github.com/Azure-Samples/container-apps-event-driven-jobs-tutorial.git"映像现已在容器注册表中可用。
在容器应用环境中创建作业:
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 次。
若要验证作业是否已正确配置,可以将一些消息发送到队列,并确认作业执行已启动,以及消息记录到作业执行日志。
将消息发送到队列:
az storage message put \ --content "Hello Queue Reader Job" \ --queue-name "$QUEUE_NAME" \ --connection-string "$QUEUE_CONNECTION_STRING"列出作业的执行情况:
az containerapp job execution list \ --name "$JOB_NAME" \ --resource-group "$RESOURCE_GROUP" \ --output json由于作业配置为每 60 秒评估一次缩放规则,作业执行可能需要长达一分钟才能启动。 重复该命令,直到看到作业执行并且其状态为
Succeeded。运行以下命令以查看记录的消息。 这些命令需要 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