首页 > 解决方案 > 如何传入 CosmosDBTrigger 的存储帐户连接字符串?

问题描述

我试图找出将存储帐户连接字符串传递给 CosmosDBTrigger 的正确方法。我有一个在 CosmosDB 容器发生更改时运行的函数。此函数将图像 blob 从一个容器复制到另一个容器。如果您查看下面的代码,我已经注释掉了我试图对要连接的存储帐户进行罚款的行。此函数在注释掉时运行。当我没有注释时它不会运行。为什么?

public static class Function1
{
    [FunctionName("ImageCopier")]
    public static async Task Run([CosmosDBTrigger(
        databaseName: "MyDatabase", 
        collectionName: "Orders",
        ConnectionStringSetting = "databaseConnection",
        CreateLeaseCollectionIfNotExists = true,
        LeaseDatabaseName = "TriggerLeases",
        LeaseCollectionName = "TriggerLeases",
        LeaseCollectionPrefix = "ImageCopier")]IReadOnlyList<Document> input, 
        //[StorageAccount("MyStorageAccount")]string storageConnectionString,
        ILogger log)
    {

我在我的 local.settings.json 文件中定义了 MyStorageAccount,并且在我的 Azure 函数配置设置中也有它。我直接从存储帐户密钥面板复制了连接字符串。

标签: azureazure-functionsazure-cosmosdb

解决方案


设置 CosmosDB 触发器时,该触发器中提供的信息特定于该触发器。如果您需要在代码中进行与触发器无关的设置或配置,可以使用Environment.GetEnvironmentVariable 方法.

local.settings.json在您的本地环境中,您可以通过编辑文件,特别是Values数组来设置这些变量。例如:

{
    "IsEncrypted": false,
    "Values": {
        "JobUri": "https://yourapiendpointurl.com",
        "BlobStorageConnectionString" : "the connection string",
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet"
    }
}

在您的方法中,您可以像这样获取该值:

public static class Function1
{
    [FunctionName("ImageCopier")]
    public static async Task Run([CosmosDBTrigger(
        databaseName: "MyDatabase", 
        ...
        ILogger log)
    {
        var connectionString = 
            Environment.GetEnvironmentVariable("BlobStorageConnectionString");
    }
}

local.settings.json文件在 Azure 中运行时不会被使用。

我不确定当您发布该函数时,您的local.settings.json文件是否会将设置迁移到您的 Azure Function 应用程序的配置中,因此我会检查以确保您的设置在发布后在那里。

旁注:将代码提交到 repos 时要小心 .. 你不希望存储库中有“秘密”,以防有人进入你的 repo 并发现它。


推荐阅读