C# 在aws eb上存储asp.net core 2的连接字符串

C# 在aws eb上存储asp.net core 2的连接字符串,c#,amazon-web-services,asp.net-core,.net-core,asp.net-core-mvc,C#,Amazon Web Services,Asp.net Core,.net Core,Asp.net Core Mvc,我在aws eb上部署了.net core 2应用程序。我需要登台、qa和prod服务器,不知道如何处理连接字符串? 是否可以将其存储在eb上的env变量中? 或者是否可以为这三个实例创建env,并为每个实例创建不同的application.json文件?您可以使用 例如,您有如下appsetting.json "WebAppUrl": { "Staging": "someurl", "Qa": "someurl", "Prod": "someurl" } private read

我在aws eb上部署了.net core 2应用程序。我需要登台、qa和prod服务器,不知道如何处理连接字符串? 是否可以将其存储在eb上的env变量中? 或者是否可以为这三个实例创建env,并为每个实例创建不同的application.json文件?

您可以使用

例如,您有如下appsetting.json

"WebAppUrl": {
  "Staging": "someurl",
  "Qa": "someurl",
  "Prod": "someurl"
}
private readonly IOptions<WebAppUrl> _webAppUrl;

public EmailSender(IOptions<WebAppUrl> _webAppUrl)
{
  _webAppUrl = _webAppUrl;
}

_webAppUrl.Value.Staging;
_webAppUrl.Value.Qa;
_webAppUrl.Value.Prod;
我需要定义一个这样的模型类来存储信息

public class WebAppUrl
{
  public string Staging { get; set; }
  public string Qa { get; set; }
  public string Prod { get; set; }
}
所以我们有了配置结构。我们最不需要的是在Startup.cs中注册

Configure(configuration.GetSection(“WebAppUrl”)

所以你可以这样用

"WebAppUrl": {
  "Staging": "someurl",
  "Qa": "someurl",
  "Prod": "someurl"
}
private readonly IOptions<WebAppUrl> _webAppUrl;

public EmailSender(IOptions<WebAppUrl> _webAppUrl)
{
  _webAppUrl = _webAppUrl;
}

_webAppUrl.Value.Staging;
_webAppUrl.Value.Qa;
_webAppUrl.Value.Prod;
private readonly IOptions\u webAppUrl;
公共电子邮件发件人(IOOptions\u webAppUrl)
{
_webAppUrl=_webAppUrl;
}
_webAppUrl.Value.Staging;
_webAppUrl.Value.Qa;
_webAppUrl.Value.Prod;
好的,这是Microsoft设置多个appsetting.json的方式。你可以看看,因为这是一篇很长的文章

下面是我如何基于Environment使用json文件进行配置

public Startup(
            IConfiguration configuration,
            IHostingEnvironment hostingEnvironment)
        {
            _configuration = configuration;
            _hostingEnvironment = hostingEnvironment;

            var builder = new ConfigurationBuilder();

            if (_hostingEnvironment.IsDevelopment())
            {
                builder.AddUserSecrets<Startup>();
            }
            else
            {
                builder
                    .SetBasePath(hostingEnvironment.ContentRootPath)
                    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{hostingEnvironment.EnvironmentName}.json", optional: true)
                    .AddEnvironmentVariables();
            }
        }
公共启动(
i配置配置,
IHostingEnvironment主机环境)
{
_配置=配置;
_hostingEnvironment=hostingEnvironment;
var builder=new ConfigurationBuilder();
if(_hostingEnvironment.IsDevelopment())
{
builder.AddUserSecrets();
}
其他的
{
建设者
.SetBasePath(hostingEnvironment.ContentRootPath)
.AddJsonFile(“appsettings.json”,可选:false,reloadOnChange:true)
.AddJsonFile($“appsettings.{hostingEnvironment.EnvironmentName}.json”),可选:true)
.AddenEnvironmentVariables();
}
}

以下是一种使用ebextensions和实例元数据的方法:

用于在应用程序启动前管理服务器的自定义

  • 您的实例应该有一个具有
    ec2:descripbetags
    权限的角色
  • 配置您的EB应用程序以设置环境
  • 您可以在每个环境中使用带有连接字符串的应用程序配置文件,也可以使用类似AWS Secrets manager(您的实例角色需要此服务的权限)的内容来保存连接字符串(更好的安全性)
  • 应用程序代码使用环境变量从配置文件或机密管理器中选择正确的连接字符串
  • 您可以在根目录下的
    .ebextensions
    文件夹中使用
    init.config
    文件部署应用程序
  • init.config读取实例元数据以确定环境并设置环境变量
  • 应用程序启动、读取变量、提取连接字符串并连接到正确的数据库
下面的示例是使用powershell的windows实例的init.config,但可以适应bash+aws cli

第一步编写一个powershell脚本。脚本读取环境标记并将值写入计算机范围的变量,以便应用程序拾取。第二步调用脚本

files:
  "c:/cfn/init.ps1":
    content: |
      $instanceDoc = Invoke-RestMethod 'http://169.254.169.254/latest/dynamic/instance-identity/document'
      $nameTagList = Get-EC2Tag -Region ($instanceDoc.region) -Filter @{name='resource-type';value='instance'},@{name='resource-id';value=$instanceDoc.instanceId},@{name='tag:Environment';value='*'} | Select -First 1
      $envName = $nameTagList.Value
      [Environment]::SetEnvironmentVariable("APP_ENV", $envName, [EnvironmentVariableTarget]::Machine
container_commands:
  00-invoke-init:
    command: powershell.exe -nologo -noprofile -file "c:\cfn\init.ps1"

因此,从.net核心应用程序的elastic beanstalk处理环境变量时存在问题

下面是如何强制应用程序获取环境变量的答案(hack)

所以,所有敏感数据(如连接字符串)都应该位于弹性beanstalk环境变量上。其他的可以是
appsettings.Staging.json
appsettings.Qa.json
,等等


只是别忘了在env变量中添加
ASPNETCORE\u环境
var

我建议将配置放入AWS系统管理器的参数存储中。Amazon.Extensions.Configuration.SystemsManagerNuGet包将参数存储作为配置提供程序添加到.NET配置系统中。这里有一篇博文来获取更多信息

这是可能的解决方案的一部分。主要问题是在.net核心应用程序的elastic beanstalk上生成env变量,但eb无法处理。另外,正如我所读到的,最佳实践是将其存储在不同的
appsettings.json
文件(
appsettings.Stanging.json
appsettings.Qa.json
)中,就像我刚刚用答案更新的一样。你能接受吗。谢谢