Azure Function 中使用 appSettings 當設定檔

在 Azure Function 中使用 appSettings 當設定檔

前言

最近由於工作的關係,開始研究Azure Function,不過原先內建的環境變數作法, 不太適合於有多環境設定的方式,所以就研究一下改為使用 appsettings.json, 來做為環境設定檔的作法。

作法

新增Azure Function專案

新增Azure Function專案

新增appsetting.json 設定檔

簡單做三個環境,Debug、QAS、Release以及建立對應的Model 新增appsetting.json 設定檔

Startup 處理注入的部分

新增Startup.cs,在這裡需要處理,依照環境變數設定取得對應的設定檔,主要是參考官方的資料,不過只用官方的語法我發現, Startup確實有抓到正確的參數,但是取得注入物件時全都空的,卡Bug所以有進行一些調整,下面上Code。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using FunctionApp1.Models;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.IO;

[assembly: FunctionsStartup(typeof(FunctionApp1.Startup))]

namespace FunctionApp1
{
    public class Startup : FunctionsStartup
    {
        public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
        {
            FunctionsHostBuilderContext context = builder.GetContext();

            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();
        }

        public override void Configure(IFunctionsHostBuilder builder)
        {
            var context = builder.GetContext();
            builder.Services.Configure<AppSettings>(context.Configuration);
        }
    }
}

設定.csproj檔

這邊我們要處理Publish的部分,確保appsetting設定檔在打包時有正常輸出。

1
2
3
4
5
6
  <ItemGroup>
 	<None Update="appsettings.*.json">
 		<CopyToOutputDirectory>Always</CopyToOutputDirectory>
 		<DependentUpon>appsettings.json</DependentUpon>
 	</None>
 </ItemGroup>

建立一個測試的Function

這裡簡單做一個範例注入的部分,順便把對應的設定檔讀取後輸出方便確認結果。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using FunctionApp1.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System.Threading.Tasks;

namespace FunctionApp1.Functions
{
   public class Function1
   {
       private readonly AppSettings _appSettings;

       public Function1(IOptions<AppSettings> appSettings)
       {
           _appSettings = appSettings.Value;
       }

       [FunctionName("Function1")]
       public async Task<IActionResult> Run(
           [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
           ILogger log)
       {
           log.LogInformation("C# HTTP trigger function processed a request.");

           string responseMessage = _appSettings.Test1;

           return new OkObjectResult(responseMessage);
       }
   }
}

launchSettings.json設定

要怎樣模擬帶入環境變數呢? 沒錯在launchSettings.json裡面設定,跟Console App有點像, 那Azure Function使用的參數是AZURE_FUNCTIONS_ENVIRONMENT,來加進去吧,這邊故意帶QAS來測試一下。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
 "profiles": {
   "FunctionApp1": {
     "commandName": "Project",
     "environmentVariables": {
       "AZURE_FUNCTIONS_ENVIRONMENT": "QAS"
     }
   }
 }
}

測試結果

測試結果

小結

其實做起來不會太困難,就是需要花點時間測試一下官方文件內容, 讓azure function也能用DI來進行開發也會比較習慣XD,下方附上參考跟sourceCode。

參考連結

All rights reserved,未經允許不得隨意轉載
Built with Hugo
Theme Stack designed by Jimmy