将 CosmosDB const 连接字符串注入 Azure Function V4 CosmosDB 输入/输出绑定?

Posted

技术标签:

【中文标题】将 CosmosDB const 连接字符串注入 Azure Function V4 CosmosDB 输入/输出绑定?【英文标题】:Inject CosmosDB const connection string into Azure Function V4 CosmosDB input/output binding? 【发布时间】:2022-01-14 11:27:01 【问题描述】:

有人知道是否可以从 Azure Functions 配置刀片传递/注入 const 连接字符串(或其他配置值)吗?

以这个绑定签名为例:

[Function("APIHttpInput")]
[CosmosDBOutput("%CosmosDb%", "%CosmosContainerOut%", ConnectionStringSetting = "CosmosDBConnection", CreateIfNotExists = true)]
public static async Task<object> RunAsync(
        [HttpTrigger(AuthorizationLevel.Function, "post", Route = "cosmosin")] HttpRequestData req,
         FunctionContext executionContext)

    var logger = executionContext.GetLogger("APIHttpInput");
    logger.LogInformation("C# HTTP trigger function processed a request.");
    // etc...

它从local.settings.json 获取连接字符串,这很好,它以这种方式工作,但它们不会在默认的 CI/CD 管道中被覆盖,也不打算被推送到生产环境。

我已阅读官方文档:https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection#customizing-configuration-sources 但这不允许在绑定中使用它们,因为它们是通过 DI 传入的(这很好,但并不完全)。

另一种方法是将它们手动写入 Cosmos 并使用 DI。这不是我真正想要的,因为我有以下使用数据的函数:

[Function("APICosmosTrigger")]
//[CosmosDBOutput("%CosmosDb%", "%CosmosContainerOut%", ConnectionStringSetting = "CosmosDBConnection", CreateIfNotExists = true)]
public static void RunCosmos([CosmosDBTrigger(
            databaseName: "%CosmosDb%",
            collectionName: "%CosmosContainerOut%",
            ConnectionStringSetting = "CosmosDBConnection",
            LeaseCollectionName = "leases")] IReadOnlyList<Record> leads,
            FunctionContext executionContext,
            IRestClient client)

     // do stuff...

希望最终结果是绑定字段(如下)可以通过配置刀片进行配置:

“%CosmosDb%” "%CosmosContainerOut%" ConnectionStringSetting = "CosmosDBConnection"

PS:我已经看到了一些与此非常接近的问题,但没有处理绑定属性问题。

【问题讨论】:

【参考方案1】:

所有函数绑定(Cosmos、Storage、EventHub 等)都由配置中的值的相同替换机制管理,也称为 binding expressions。

local.settings.json 文件通常不会被推送/发布,因为它是环境的本地文件。

例如,您可以在 DevOps 管道中使用覆盖 local.settings.json 值的环境变量。

您链接的文章正在初始化配置,如下所示:

builder.ConfigurationBuilder
                .AddJsonFile(Path.Combine(context.ApplicationRootPath, "appsettings.json"), optional: true, reloadOnChange: false)
                .AddJsonFile(Path.Combine(context.ApplicationRootPath, $"appsettings.context.EnvironmentName.json"), optional: true, reloadOnChange: false)
                .AddEnvironmentVariables();

因此,如果您在 DevOps 中定义环境变量,您应该能够覆盖 json 文件中定义的任何内容。

【讨论】:

不幸的是,我宁愿使用 Azure DevOps 管道并尝试通过直接 CI/CD 保持简单,但我确实考虑过这一点。其次,那些appsettings 文件不会像我提到的那样工作,因为值不是const(即尝试在同一个绑定中使用它,VS 会抱怨它不是 const)。不过感谢您的回答,MS 如此 close 到目前为止,真是太可惜了。 不确定我是否理解。您在哪里运行 CI/CD?您应该能够在 CI/CD 管道中定义环境变量就好了。我使用 DevOps 作为一个 CI/CD 管道的示例,但我知道的大多数管道都允许这样做。 特别是 Azure CI/CD(即直接从存储库集成)。没有办法,我知道除非它的内置替换(即默认情况下在那里完成appsettings 令牌替换) - 这在local.settings.json 上不起作用(并且production.settings.json 不存在)。我真的只是想保持简单并使用内置工具而不需要大量的手动管道工作。同样,这不会起作用,因为它们是在运行时计算的,而不是 consts。 功能绑定连接配置(对于任何触发器/绑定)根本不适用于consts,你放在那里的值是之后,从配置源(环境,文件,设置功能应用程序)。我不确定 Azure CI/CD 是否支持环境变量,如果您正在使用链接到 repo(例如来自应用服务),您可以有一个暂存槽,或者如果从 GitHub 部署,请自定义该流程(docs.microsoft.com/azure/app-service/…) 对不起,我真的不明白你在说什么,我不确定你是否明白我想要写的东西。不过感谢您的尝试,我会看看其他人是否对如何在问题范围内解决它有任何想法。

以上是关于将 CosmosDB const 连接字符串注入 Azure Function V4 CosmosDB 输入/输出绑定?的主要内容,如果未能解决你的问题,请参考以下文章

[CosmosDB]如何导出数据

CosmosDB 连接 (SQL API)

SQL注入之报错注入(floorextractvalueupdatexml)

如何将 Cosmos DB 添加到 .Net 6 Web API?

C++标准库 如何连接两个const char *类型字符串,并返回const char * 类型结果?

SQL 注入 - 如果我们将多个预定义字符串与用户值连接起来