web-dev-qa-db-ja.com

Azure Functionsのlocal.settings.jsonからカスタム設定を読み取ります

Local.settings.jsonファイルからカスタム設定を取得しようとしています。例以下のlocal.settings.jsonファイルにあるテーブルリストを読み取ろうとしています

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "AzureWebJobsDashboard": "UseDevelopmentStorage=true",
    "TableList": "TestTableName1,TestTableName2"
  }
}

次のコードを使用して読んでいます

string tableslist = ConfigurationManager.AppSettings["TableList"];

それは機能しますが、これはローカルでデバッグする場合にのみ機能することをいくつかの場所で読んでおり、運用環境で展開した後は機能しない可能性があります。誰かがこれを正しい方法で行う方法を教えてもらえますか?または、問題は接続文字列に関連する設定にのみ適用されますか?

7

@Kirkと@Slavaは、混乱を取り除くのに役立ちました。参照する詳細を追加してください。

デフォルトでは、パブリケーションはlocal.settings.jsonをAzureにアップロードせず、そのローカルファイルに基づいてアプリケーション設定を変更することもありません。したがって、Azureポータルで手動で更新する必要があります。 VSパブリッシュパネルでも実行できます(パブリッシュする前に設定を変更する必要がある場合は、最初にプロファイルを作成します)。

enter image description here

アプリの設定でパラメーターを取得する方法については、v [2]関数(ランタイムベータ版)ではConfigurationManagerがサポートされなくなり、nullまたは例外のみが取得される可能性があります。 v1関数(実行時〜1)の場合、引き続き機能します。

  1. V1機能の場合

    Azureのアプリケーション設定(local_settings.jsonのValuesも)を読み取るには、System.Environment.GetEnvironmentVariable($"{parameterName}")をお勧めします。

    接続文字列(local.settings.jsonのConnectionStrings)は環境変数にインポートされないため、残念ながらGetEnvironmentVariableはAzureでのみ機能します。そのため、Azureとローカル環境の両方で機能するConfigurationManagerが必要です。もちろん、アプリケーションの設定も読み取ることができます。

  2. V2機能の場合、アプリケーション設定と接続文字列の2つの選択肢。

    1つは、GetEnvironmentVariableを使用することです。 Azureの接続文字列のプレフィックスについては、 このリスト を参照できます。

    // Get Application settings
    var appParameter= "AzureWebJobsStorage";
    System.Environment.GetEnvironmentVariable($"{appParameter}");
    
    // Get Connection strings(put local and Azure env together)
    var connParameter= "MySqlAzureConnection";
    var Prefix = "SQLAZURECONNSTR_";
    var connectionString = System.Environment.GetEnvironmentVariable($"ConnectionStrings:{connParameter}");
    if(string.IsNullOrEmpty(connectionString )){
       connectionString = System.Environment.GetEnvironmentVariable($"{Prefix}{connParameter}");
    }
    

    もう1つは、ConfigurationBuilderを使用することです。 ExecutionContextパラメーターを追加します。これは、関数アプリのディレクトリを見つけるために使用されます。

    [FunctionName("FunctionName")]
    public static void Run(...,ExecutionContext context)
    {
       //"Values" and "Connection" sections are injected into EnvironmentVariables automatically hence we don't need to load Json file again. 
       //Hence SetBasePath and AddJsonFile are only necessary if you have some custom settings(e.g. nested Json rather than key-value pairs) outside those two sections. It's recommended to put those setting to another file if we need to publish them.
       //Note that Function binding settings(e.g. Storage Connection String) must be EnvironmentVariables, i.e. must be stored in "Values" section.
        var config = new ConfigurationBuilder()
            .SetBasePath(context.FunctionAppDirectory)
            .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables()
            .Build();
    
        // Get Application Settings
        var appParameter= "AzureWebJobsStorage";
        string appsetting = config[$"{appParameter}"];
    
        // Get Connection strings
        var connParameter= "MySqlAzureConnection";
        string connectionString = config.GetConnectionString($"{connParameter}");
    }
    
14
Jerry Liu

.Net Core Azure FunctionでEnvironment.GetEnvironmentVariableを使用する場合、EnvironmentVariableTarget.Processパラメーターを追加して接続文字列を取得する必要がありました

 string connectionString= Environment.GetEnvironmentVariable("DBConnectionString", 
 EnvironmentVariableTarget.Process);

Local.settings.jsonは次のようになりました。

 {"IsEncrypted": false,
 "Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"DBConnectionString": "<conn string here>"
 }
}