【问题标题】:How do I pass in the storage account connection string for a CosmosDBTrigger?如何传入 CosmosDBTrigger 的存储帐户连接字符串?
【发布时间】:2020-08-08 21:38:03
【问题描述】:

我正在尝试找出将存储帐户连接字符串传递给 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 函数配置设置中也有它。我直接从存储帐户密钥面板复制了连接字符串。

【问题讨论】:

  • 几年前我问过这个问题:stackoverflow.com/questions/47625959/…
  • 哦,我明白了,您需要一个存储帐户连接字符串。您可能必须将其存储在配置中并使用Environment.GetEnvironmentVariable("storageConnectionString") 在运行时拉取它。您可以将其存储在Values 数组中的local.settings.json 中以进行本地调试,然后在发布时将其放入Azure 中的配置中。
  • 谢谢。这是有效的。
  • 我会为这个问题添加一个答案,以便它可以帮助其他人

标签: azure azure-functions azure-cosmosdb


【解决方案1】:

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

在您的本地环境中,您可以通过编辑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 应用程序的配置中,因此我会在发布后检查以确保您的设置在其中。

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

【讨论】:

    【解决方案2】:

    虽然您可以使用 GetEnvironmentVariable 访问原始配置值,但特别是 .NET 的更健壮/惯用的方法是利用 built-in dependency injection of configuration

    使用它,您可以通过函数的构造函数接受 IConfiguration 或强类型 IOptions 并使用代码中的值。例如:

    public class Function1
    {
        private readonly IConfiguration configuration;
    
        public Function1(IConfiguration configuration)
        {
            this.configuration = configuration;
        }
    
        [FunctionName("ImageCopier")]
        public async Task Run([CosmosDBTrigger(/* trigger params */)] IReadOnlyList<Document> input)
        {
            var connectionString = configuration["MyStorageAccount"];
    
            // Use connection string
        }
    }
    

    您可以进一步将“ImageBlobService”之类的服务注入到您的函数中,这些服务已经在 common Startup Configure method 中配置,就像 ASP.NET Core 一样。这样各个功能就不需要了解任何有关配置的信息,只需请求使用相关服务即可。

    【讨论】:

      猜你喜欢
      • 2018-12-20
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2021-11-01
      相关资源
      最近更新 更多