前言
最近由於工作的關係,開始研究Azure Function,不過原先內建的環境變數作法, 不太適合於有多環境設定的方式,所以就研究一下改為使用 appsettings.json, 來做為環境設定檔的作法。
作法
新增Azure Function專案
新增appsetting.json 設定檔
簡單做三個環境,Debug、QAS、Release以及建立對應的Model
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。