歡迎光臨
每天分享高質量文章

如何使用AWS和Azure的配置儲存服務儲存讀取配置

原文:Want to yank configuration values from your .NET Core apps? 
作者:pauljwheeler
譯文:https://www.cnblogs.com/lwqlun/p/10508748.html
譯者:Lamond Lu
示例原始碼:https://github.com/lamondlu/LoadConfigurationFromCloud

背景

我們建立的大部分.NET Core應用都會使用配置檔案。如果你瞭解過12 Factor理論(https://12factor.net/zh_cn/), 你可能會希望將配置檔案與程式碼隔離。這就意味你不能將應用配置存在appsetting.json檔案中或者硬編碼在程式中。

這時候我們可以使用環境變數來完成以上的需求,但這並不是很好的選擇,這種方案有2個缺點

  • 沒有版本控制
  • 沒有訪問許可權控制

今天我就給大家介紹一下AWS和Azure中提供的配置服務。

AWS

AWS的AWS Systems Manager服務中,提供了一個名為Parameter Store的子服務。此服務可以用來維護專案中使用的配置資料。 據我所知,它可以免費使用。

使用配置服務新增配置

首先,我們訪問了AWS控制檯,找到了Systems Manager服務,並從左側選單中選擇了Parameter Store。 從這裡,我們可以編輯或刪除現有引數,並建立新引數。

每個引數都有一個名稱和值。 對於名稱,我們使用“/”來定義層次結構(例如:/lamond/project1/config1)。 引數型別可以是字串,字串串列或加密字串。

整個UI的功能非常智慧,這裡當輸入引數名稱的時候,它會自動匹配已有的引數名稱

為了演示效果,這裡我添加了2個配置,一個名為/lamond/project1/config1,值是”Hello world”, 另外一個名為/lamond/project1/config2, 值為”We love Cloud”.

好的,以上我們就完成在AWS控制臺中的配置,下麵讓我們看一下如何在一個.NET Core Web應用中讀取這個配置。

如何從程式碼中讀取配置

這裡首先我們建立建立一個ASP.NET Core MVC專案,並新增程式集

Amazon.Extensions.Configuration.SystemsManager

然後,我們建立一個簡單的Setting類, 用來儲存從AWS Parameter Store中拉取的配置值

    public class Settings
    {

       public string Config1 { get; set; }
       public string Config2 { get; set; }
    }

然後,我們需要在appsettings.json檔案中配置AWS配置服務的region和profile.

    {
      "Logging": {
        "LogLevel": {
          "Default""Warning"
        }
      },
      "AllowedHosts""*",
      "AWS": {
        "Profile""default",
        "Region""us-west-2"
      }
    }

下一步,我們需要修改Program.cs檔案,啟用從AWS Systems Manager中讀取配置, 這裡我是從/lamond中讀取配置

    public class Program
    {

      public static void Main(string[] args)
      
{
         CreateWebHostBuilder(args).Build().Run();
      }

      public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
         WebHost.CreateDefaultBuilder(args)
           .ConfigureAppConfiguration(builder =>
           {
              builder.AddSystemsManager("/lamond");
           })
           .UseStartup();
    }

接下來,和一般的強型別配置系結一樣,我們還需要在Startup.cs的ConfigureService方法中,系結配置。

    public void ConfigureServices(IServiceCollection services)
    
{
        services.Configure(Configuration.GetSection("properties"));

        services.Configure(options =>
        {
           options.CheckConsentNeeded = context => true;
           options.MinimumSameSitePolicy = SameSiteMode.None;
        });
    }

最後,我們就可以在控制器中註入強配型配置, 並讀取配置了

    private readonly Settings _settings;

    public HomeController(IOptions settings)
    
{
        _settings = settings.Value;
    }

    public IActionResult Index()
    
{
        ViewData["configval"] = _settings.Config1;
        ViewData["configval2"] = _settings.Config2;

        return View();
    }

最終效果

註意: 這裡啟動專案的時候如果出現未授權錯誤,你需要安裝AWS CLI配置本地使用Access Key ID和Access Secret, 或者只用環境變數來設定Access Key ID和Access Secret。

其他優點

AWS的Parameter Store除了免費之外,還提供了一個歷史記錄功能。你可以每個版本配置的更改內容和操作人。

另外AWS團隊還編寫一個針對.NET Core的擴充套件,使用這個擴充套件,當你的配置發生變化的時候,.NET Core應用可以自動掃清配置資訊。

Azure

微軟近期剛剛推出了Azure App Configuration服務的預覽版。這個服務可以幫助你集中你的配置。這是一個全新的服務,下麵讓我們看一看如何使用它。

使用配置服務新增配置

首先,我們可以透過Azure管理站點,搜尋configuration服務, 圖中的App Configuration就是我們所需的服務。

下一步,我們來建立一個配置組,這裡我將配置組命名為lamond-config

新增完成之後,我們就可以在Key-Value Explorer面板中為當前配置組新增配置資訊了

和前面AWS的例子一樣,我們新增2個配置值。

這樣配置工作就完成了,接下來我們編寫程式碼使用.NET Core讀取App Configuration服務中的配置。

如何從程式碼中讀取配置

這裡我重新建立了一個新的ASP.NET Core API站點,並新增程式集

Microsoft.Extensions.Configuration.AzureAppConfiguration

專案建立成功後,我們首先新增一個Settings類

public class Settings
{

    public string Config1 { get; set; }
    public string Config2 { get; set; }
}

下一步,我們需要更新Program.cs檔案,啟動Azure App Configuration

    public class Program
    {

        public static void Main(string[] args)
        
{
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    var settings = config.Build();
                    config.AddAzureAppConfiguration("[xxx]");
                })
                .UseStartup();
    }

這裡我們需要將Azure App Configuration的連線字串放在這裡。

第三步,我們依然要在ConfigureServices方法中進行強型別配置系結

    public void ConfigureServices(IServiceCollection services)
    
{
        services.Configure(Configuration.GetSection("lamond-config"));
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

最後,我們就可以在API中讀取強型別配置了

    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private Settings _settings;

        public ValuesController(IOptions settingsAccessor)
        
{
            _settings = settingsAccessor.Value;
        }

        // GET api/values
        [HttpGet]
        public ActionResultstring>> Get()
        {
            return new List<string> { _settings.Config1, _settings.Config2 };
        }
    }

最終效果

啟動專案後,配置從Azure App Configuration中正確讀取了。

其他優點

與AWS Parameter Store類似,Azure App Configuration也提供了配置的審計功能,你可以檢視每個配置的歷史記錄和修改人。除此之外,Azure App Configuration還提供了一個Label功能,使用該功能可以為同一個配置設定不同環境下的值。

例如下圖中,我添加了一個lamond-config:config3的配置項,當執行環境是qa的時候讀取的值是1,當執行環境是dev的時候值是2

總結

今天給大家分享了一下,如何使用AWS Parameter Store和Azure App Configuration來儲存配置資訊,並且給出瞭如何使用.NET Core載入配置服務中的配置項。其實原文中還介紹了Spring Cloud Config, 有興趣的同學也可以去試一下。

 

    贊(0)

    分享創造快樂