教程:使用 Azure 容器应用部署后台处理应用程序
使用 Azure 容器应用,无需公开公共终结点即可部署应用程序。 通过使用容器应用缩放规则,应用程序可以基于 Azure 存储队列长度进行横向扩展和横向缩减。 当队列中没有消息时,容器应用将横向缩减为零。
学习如何:
- 创建容器应用环境以部署容器应用
- 创建 Azure 存储队列以将消息发送到容器应用
- 将后台处理应用程序部署为容器应用
- 验证队列消息是否由容器应用处理
安装
若要从 CLI 登录到 Azure,请运行以下命令,然后按照提示完成身份验证过程。
az cloud set -n AzureChinaCloud
az login
# az cloud set -n AzureCloud //means return to Public Azure.
为了确保运行最新版本的 CLI,请运行升级命令。
az upgrade
接下来,安装或更新适用于 CLI 的 Azure 容器应用扩展。
如果在 Azure CLI 中运行 az containerapp
命令,或在 Azure PowerShell 中运行 Az.App
模块中的 cmdlet 时收到有关缺少参数的错误,请确保已安装最新版本的 Azure 容器应用扩展。
az extension add --name containerapp --upgrade
注意
从 2024 年 5 月开始,Azure CLI 扩展不再默认启用预览功能。 要访问容器应用预览功能,请使用 --allow-preview true
安装容器应用扩展。
az extension add --name containerapp --upgrade --allow-preview true
现在已安装当前扩展或模块,接下来请注册 Microsoft.App
和 Microsoft.OperationalInsights
命名空间。
注意
Azure 容器应用资源已从 Microsoft.Web
命名空间迁移到 Microsoft.App
命名空间。 如需更多详细信息,请参阅 2022 年 3 月的从 Azure.Web 到 Microsoft.App 的命名空间迁移。
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
设置环境变量。
设置以下环境变量。 将 <占位符> 替换为自己的值:
RESOURCE_GROUP="<RESOURCE_GROUP>"
LOCATION="<LOCATION>"
CONTAINERAPPS_ENVIRONMENT="<CONTAINERAPPS_ENVIRONMENT>"
创建 Azure 资源组
创建一个资源组来组织与你的容器应用部署相关的服务。
az group create \
--name $RESOURCE_GROUP \
--location "$LOCATION"
创建环境
Azure 容器应用中的环境围绕一组容器应用创建安全边界。 部署到相同环境的容器应用部署在同一虚拟网络中,并将日志写入同一个 Log Analytics 工作区。
若要创建环境,请运行以下命令:
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": {
"type": "String"
},
"queueconnection": {
"type": "secureString"
}
},
"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`
az monitor log-analytics query \
--workspace $LOG_ANALYTICS_WORKSPACE_CLIENT_ID \
--analytics-query "ContainerAppConsoleLogs_CL | where ContainerAppName_s == 'queuereader' and Log_s contains 'Message ID' | project Time=TimeGenerated, AppName=ContainerAppName_s, Revision=RevisionName_s, Container=ContainerName_s, Message=Log_s | take 5" \
--out table
提示
遇到问题? 在 Azure 容器应用存储库中提交问题,告知我们有关 GitHub 的信息。
清理资源
完成后,运行以下命令以删除包含容器应用资源的资源组。
注意
以下命令删除指定的资源组及其包含的所有资源。 如果指定的资源组中存在本教程范围外的资源,这些资源也会被删除。
az group delete \
--resource-group $RESOURCE_GROUP