我是參考此篇教學文
https://codewithmukesh.com/blog/working-with-aws-s3-using-aspnet-core/
提到原本C#專案儲存金鑰等資訊都是儲存在appsettings.json,在專案執行時在從appsettings.json 提取key,但AWS提供更安全的方式是存在本地端。目前理解這種作法就是把金鑰另外儲存在其他檔案,這樣為何會比較安全,是因為有加密過?
還有若是以這樣的形式儲存,在部屬時不也是連同檔案都要一起放在server嗎?
但如果選擇以 AWS Elastic Beanstalk 方式部屬,這種方式還可行嗎?
主要是目前開發經驗都是把key儲存在appsettings.json,想請教這兩種方式的差異。
還有是否有儲存 Access key 在appsettings.json的範例
你提到的是 .NET 設定外部變數時存放檔案的地方,
明文儲存的設定檔,在編譯後發行的部署檔仍然會有 appsettings.json 的存在,一般會用來儲存資料庫連接字串或是相關的服務金鑰。
這裡的風險有兩點:
又稱環境變數,一般不論在 EC2、Azure App Service... 都可以設置,他儲存於機器本身因此不會存於 git,而一般開發者也不會有正式環境的訪問權限,因此相較放於 appsettings.json 的確更為安全。
開發時依然可以使用 appsettings.json,正式環境時可以使用 Environment Variables 覆蓋 appsettings.json 上的設定,在 .NET 的設計上你可以用同名的 Environment Variables 覆蓋掉 appsettings.json,Environment Variables 的優先度更高。
Environment Variables 的命名規則是雙下滑線 _ 來連接,如 AWS__Region
舉例:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"AWS": {
"Profile": "s3-dotnet-demo",
"Region": "ap-south-1"
}
}
你可以在 Environment Variables 設定
AWS__Region=ap-south-2
這樣在啟動時,讀取到的區域就會是 ap-south-2 而不是 ap-south-1,appsettings.json 內的變數可作為開發方便使用,程式碼都不需要更改就可以讀取寫在 Environment Variables 的變數。
單看 .NET 變數來看,使用 appsetting.json 依然是個好方案,可以方便進行開發與測試而在正式環境時再設定環境變數就可。
至於 AWS 也有提供的資源間的認證方式,可以在不在程式內設定任何金鑰就容許連接,這偏向 AWS 的驗證方式而與 .NET 本身無關,這裡可以參考 AWS 不同資源間的 IAM 設定,這裡就簡單帶過而已。