将函数应用从 Azure Cosmos DB 扩展版本 3.x 迁移到版本 4.x
本文重点介绍升级使用 Azure Cosmos DB 扩展版本 3.x 的现有 Azure Functions 应用程序,以便使用新的扩展版本 4.x 的注意事项。 从 Azure Cosmos DB 扩展版本 3.x 迁移到版本 4.x 后,应用程序将发生中断性变更。
重要
2024 年 8 月 31 日,Azure Cosmos DB 扩展版本 3.x 将停用。 扩展以及使用该扩展的所有应用程序将继续正常运行,但 Azure Cosmos DB 将停止为该扩展提供进一步的维护和支持。 建议迁移到该扩展的最新版本 4.x。
本文将指导你完成迁移函数应用以在 Azure Cosmos DB 扩展版本 4.x 上运行的过程。 由于项目升级说明与语言相关,因此请务必从文章顶部的选择器中选择你的开发语言。
扩展中不再自动填充项 ID。 因此,对于使用输出绑定创建项的情况,项 ID 必须特别包含生成的 ID。 若要保持与以前版本相同的行为,可以将一个随机 GUID 分配为 ID 属性。
.NET 函数使用以 NuGet 包的形式安装在项目中的绑定。 根据 Functions 进程模型,要更新的 NuGet 包会有所不同。
函数进程模型 | Azure Cosmos DB 扩展 | 建议的版本 |
---|---|---|
进程模型 | Microsoft.Azure.WebJobs.Extensions.CosmosDB | >= 4.3.0 |
独立工作模型 | Microsoft.Azure.Functions.Worker.Extensions.CosmosDB | >= 4.4.1 |
更新 .csproj
项目文件,将最新的扩展版本用于进程模型。 以下 .csproj
文件使用 Azure Cosmos DB 扩展版本 4。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<OutputType>Exe</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.21.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.CosmosDB" Version="4.6.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.16.4" />
</ItemGroup>
<ItemGroup>
<None Update="host.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="local.settings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
</ItemGroup>
</Project>
默认情况下,非 .NET 函数应用使用扩展捆绑包来安装绑定扩展。 Azure Cosmos DB 版本 4 扩展是 Azure Functions 版本 4 扩展捆绑包的一部分。
若要更新应用程序以使用最新版本的扩展捆绑包,请更新 host.json
。 以下 host.json
文件使用 Azure Functions 扩展捆绑包版本 4。
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[4.*, 5.0.0)"
}
}
进程内和独立进程 C# 库使用 CosmosDBTriggerAttribute 来定义函数。
下表仅包含已重命名或已从版本 3 扩展中删除的特性。 有关版本 4 扩展中可用的特性的完整列表,请访问特性参考。
版本 3 特性属性 | 版本 4 特性属性 | 版本 4 特性说明 |
---|---|---|
ConnectionStringSetting | Connection | 应用设置或设置集合的名称,用于指定如何连接到受监视的 Azure Cosmos DB 帐户。 有关详细信息,请参阅连接。 |
CollectionName | ContainerName | 要监视的容器的名称。 |
LeaseConnectionStringSetting | LeaseConnection | (可选)应用设置或设置集合的名称,用于指定如何连接到保留租用容器的 Azure Cosmos DB 帐户。 未设置时,使用 Connection 值。 在门户中创建绑定时,将自动设置该参数。 用于租用容器的连接字符串必须具有写入权限。 |
LeaseCollectionName | LeaseContainerName | (可选)用于存储租约的容器的名称。 未设置时,使用值 leases 。 |
CreateLeaseCollectionIfNotExists | CreateLeaseContainerIfNotExists | (可选)设置为 true 时,如果租用容器并不存在,将自动创建该集合。 默认值是 false 。 在使用 Microsoft Entra 标识时,如果将值设为 true ,创建容器就不是受允许的操作,且无法启动函数。 |
LeasesCollectionThroughput | LeasesContainerThroughput | (可选)在创建租用容器时,定义要分配的请求单位的数量。 仅当 CreateLeaseContainerIfNotExists 设置为 true 时,才会使用此设置。 使用门户创建绑定时,将自动设置该参数。 |
LeaseCollectionPrefix | leaseContainerPrefix | (可选)设置后,该值将作为前缀添加到在此函数的租用容器中创建的租约。 使用前缀可让两个不同的 Azure 函数通过不同的前缀来共享同一个租用容器。 |
UseMultipleWriteLocations | 已删除 | 不再需要此特性,因为它会被自动检测到。 |
UseDefaultJsonSerialization | 已删除 | 不再需要此特性,因为可以使用 Azure Cosmos DB 版本 3 .NET SDK 中的内置支持完全自定义序列化。 |
CheckpointInterval | 已删除 | 此特性已在版本 4 扩展中删除。 |
CheckpointDocumentCount | 已删除 | 此特性已在版本 4 扩展中删除。 |
更新 function.json
文件中的绑定配置属性。
下表仅包含已更改或已从版本 3.x 扩展中删除的特性。 有关版本 4 扩展中可用的特性的完整列表,请访问特性参考。
版本 3 特性属性 | 版本 4 特性属性 | 版本 4 特性说明 |
---|---|---|
connectionStringSetting | 连接 | 应用设置或设置集合的名称,用于指定如何连接到受监视的 Azure Cosmos DB 帐户。 有关详细信息,请参阅连接。 |
collectionName | containerName | 要监视的容器的名称。 |
leaseConnectionStringSetting | leaseConnection | (可选)应用设置或设置集合的名称,用于指定如何连接到保留租用容器的 Azure Cosmos DB 帐户。 未设置时,使用 connection 值。 在门户中创建绑定时,将自动设置该参数。 用于租用容器的连接字符串必须具有写入权限。 |
leaseCollectionName | leaseContainerName | (可选)用于存储租约的容器的名称。 未设置时,使用值 leases 。 |
createLeaseCollectionIfNotExists | createLeaseContainerIfNotExists | (可选)设置为 true 时,如果租用容器并不存在,将自动创建该集合。 默认值是 false 。 在使用 Microsoft Entra 标识时,如果将值设为 true ,创建容器就不是受允许的操作,且无法启动函数。 |
leasesCollectionThroughput | leasesContainerThroughput | (可选)在创建租用容器时,定义要分配的请求单位的数量。 仅当 createLeaseContainerIfNotExists 设置为 true 时,才会使用此设置。 使用门户创建绑定时,将自动设置该参数。 |
leaseCollectionPrefix | leaseContainerPrefix | (可选)设置后,该值将作为前缀添加到在此函数的租用容器中创建的租约。 使用前缀可让两个不同的 Azure 函数通过不同的前缀来共享同一个租用容器。 |
useMultipleWriteLocations | 已删除 | 不再需要此特性,因为它会被自动检测到。 |
checkpointInterval | 已删除 | 此特性已在版本 4 扩展中删除。 |
checkpointDocumentCount | 已删除 | 此特性已在版本 4 扩展中删除。 |
Azure Functions 扩展版本 4 基于 Azure Cosmos DB .NET SDK 版本 3 构建,该版本删除了对 Document
类的支持。 现在你可以直接接收自己类型的 Document
对象列表,而不是使用每个函数调用接收对象列表,然后必须将其反序列化为自己的对象类型。
此示例引用简单的 ToDoItem
类型。
namespace CosmosDBSamples
{
// Customize the model with your own desired properties
public class ToDoItem
{
public string id { get; set; }
public string Description { get; set; }
}
}
定义函数时,必须直接在代码中更改特性名称。
using System.Collections.Generic;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
namespace CosmosDBSamples
{
public static class CosmosTrigger
{
[FunctionName("CosmosTrigger")]
public static void Run([CosmosDBTrigger(
databaseName: "databaseName",
containerName: "containerName",
Connection = "CosmosDBConnectionSetting",
LeaseContainerName = "leases",
CreateLeaseContainerIfNotExists = true)]IReadOnlyList<ToDoItem> input, ILogger log)
{
if (input != null && input.Count > 0)
{
log.LogInformation("Documents modified " + input.Count);
log.LogInformation("First document Id " + input[0].id);
}
}
}
}
备注
如果你的方案依赖于 Document
类型的动态性质来标识不同的架构和事件类型,可使用跨你的类型具有共同属性的基本抽象类型,或者使用允许像 Document
一样访问属性的动态类型,例如 JObject
(使用 Microsoft.Azure.WebJobs.Extensions.CosmosDB
时)和 JsonNode
(使用 Microsoft.Azure.Functions.Worker.Extensions.CosmosDB
时)。
此外,如果你使用输出绑定,请查看项 ID 生成中的更改,以确认你是否需要进行其他代码更改。
将 host.json
更新为使用正确的扩展捆绑包版本并将 function.json
修改为使用正确的特性名称后,在使用输入绑定或触发器的情况下无需进一步更改代码。 如果你使用输出绑定,请查看项 ID 生成中的更改,以确认你是否需要进行其他代码更改。