教程:使用 Azure 容器应用部署后台处理应用程序

使用 Azure 容器应用,无需公开公共终结点即可部署应用程序。 通过使用容器应用缩放规则,应用程序可以基于 Azure 存储队列长度进行横向扩展和横向缩减。 当队列中没有消息时,容器应用将横向缩减为零。

学习如何:

  • 创建容器应用环境以部署容器应用
  • 创建 Azure 存储队列以将消息发送到容器应用
  • 将后台处理应用程序部署为容器应用
  • 验证队列消息是否由容器应用处理

设置

首先,登录到 Azure。 运行以下命令,然后按照提示完成身份验证过程。

az login

接下来,安装适用于 CLI 的 Azure 容器应用扩展。

az extension add --name containerapp --upgrade

安装当前扩展或模块后,注册 Microsoft.App 命名空间。

注意

Azure 容器应用资源已从 Microsoft.Web 命名空间迁移到 Microsoft.App 命名空间。 有关详细信息,请参阅 2022 年 3 月从 Microsoft.Web 到 Microsoft.App 的命名空间迁移

az provider register --namespace Microsoft.App

为 Azure Monitor Log Analytics 工作区注册 Microsoft.OperationalInsights 提供程序(如果以前未使用过)。

az provider register --namespace Microsoft.OperationalInsights

接下来,设置以下环境变量:

RESOURCE_GROUP="my-container-apps"
LOCATION="canadacentral"
CONTAINERAPPS_ENVIRONMENT="my-environment"

定义这些变量后,可以创建一个资源组来组织与新容器应用相关的服务。

az group create \
  --name $RESOURCE_GROUP \
  --location $LOCATION

升级 CLI 并提供新的资源组后,可以创建容器应用环境并部署容器应用。

创建环境

Azure 容器应用中的环境围绕一组容器应用创建安全边界。 部署到相同环境的容器应用部署在同一虚拟网络中,并将日志写入同一个 Log Analytics 工作区。


单个容器应用部署到 Azure 容器应用环境。 若要创建环境,请运行以下命令:

az containerapp env create \
  --name $CONTAINERAPPS_ENVIRONMENT \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION"

设置存储队列

首先定义存储帐户的名称。 存储帐户名称在 Azure 中必须是唯一的,长度为 3 到 24 个字符,仅包含数字和小写字母。

STORAGE_ACCOUNT_NAME="<STORAGE_ACCOUNT_NAME>"

创建 Azure 存储帐户。

az storage account create \
  --name $STORAGE_ACCOUNT_NAME \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION" \
  --sku Standard_RAGRS \
  --kind StorageV2

接下来,获取队列的连接字符串。

QUEUE_CONNECTION_STRING=`az storage account show-connection-string -g $RESOURCE_GROUP --name $STORAGE_ACCOUNT_NAME --query connectionString --out json | tr -d '"'`

现在可以创建消息队列。

az storage queue create \
  --name 'myqueue" \
  --account-name $STORAGE_ACCOUNT_NAME \
  --connection-string $QUEUE_CONNECTION_STRING

最后,可以将消息发送到队列。

az storage message put \
  --content "Hello Queue Reader App" \
  --queue-name "myqueue" \
  --connection-string $QUEUE_CONNECTION_STRING

部署后台应用程序

创建名为 queue.json 的文件并将以下配置代码粘贴到文件中。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "defaultValue": "canadacentral",
            "type": "String"
        },
        "environment_name": {
            "defaultValue": "",
            "type": "String"
        },
        "queueconnection": {
            "defaultValue": "",
            "type": "String"
        }
    },
    "variables": {},
    "resources": [
    {
        "name": "queuereader",
        "type": "Microsoft.App/containerApps",
        "apiVersion": "2022-03-01",
        "kind": "containerapp",
        "location": "[parameters('location')]",
        "properties": {
            "managedEnvironmentId": "[resourceId('Microsoft.App/managedEnvironments', parameters('environment_name'))]",
            "configuration": {
                "activeRevisionsMode": "single",
                "secrets": [
                {
                    "name": "queueconnection",
                    "value": "[parameters('queueconnection')]"
                }]
            },
            "template": {
                "containers": [
                    {
                        "image": "mcr.microsoft.com/azuredocs/containerapps-queuereader",
                        "name": "queuereader",
                        "env": [
                            {
                                "name": "QueueName",
                                "value": "myqueue"
                            },
                            {
                                "name": "QueueConnectionString",
                                "secretRef": "queueconnection"
                            }
                        ]
                    }
                ],
                "scale": {
                    "minReplicas": 1,
                    "maxReplicas": 10,
                    "rules": [
                        {
                            "name": "myqueuerule",
                            "azureQueue": {
                                "queueName": "myqueue",
                                "queueLength": 100,
                                "auth": [
                                    {
                                        "secretRef": "queueconnection",
                                        "triggerParameter": "connection"
                                    }
                                ]
                            }
                        }
                    ]
                }
            }
        }
    }]
}

现在可以创建和部署容器应用。

az deployment group create --resource-group "$RESOURCE_GROUP" \
  --template-file ./queue.json \
  --parameters \
    environment_name="$CONTAINERAPPS_ENVIRONMENT" \
    queueconnection="$QUEUE_CONNECTION_STRING" \
    location="$LOCATION"

此命令从名为 mcr.microsoft.com/azuredocs/containerapps-queuereader 的公共容器映像部署演示应用程序,并设置应用程序使用的机密和环境变量。

根据 ARM 模板的 scale 部分定义的队列长度,应用程序可横向扩展到 10 个副本。

验证结果

容器应用作为后台进程运行。 当消息从 Azure 存储队列到达时,应用程序会在日志分析中创建日志条目。 必须等待分析结果第一次到达(可能需要几分钟),然后才能查询记录的数据。

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

LOG_ANALYTICS_WORKSPACE_CLIENT_ID=`az containerapp env show --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.appLogsConfiguration.logAnalyticsConfiguration.customerId --out tsv`

提示

遇到问题? 在 Azure 容器应用存储库中提交问题,告知我们有关 GitHub 的信息。

清理资源

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

注意

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

az group delete \
  --resource-group $RESOURCE_GROUP