繁体   English   中英

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

[英]Store connection string for asp.net core 2 on aws eb

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

您可以在 ASP.NET Core 中使用选项模式

例如你有这样的 appsetting.json

"WebAppUrl": {
  "Staging": "someurl",
  "Qa": "someurl",
  "Prod": "someurl"
}

我需要定义一个这样的模型类来存储信息

public class WebAppUrl
{
  public string Staging { get; set; }
  public string Qa { get; set; }
  public string Prod { get; set; }
}

所以我们有配置结构。 我们需要的最后一件事是在 Startup.cs 中注册

services.Configure(configuration.GetSection("WebAppUrl"));

所以你可以像这样使用

private readonly IOptions<WebAppUrl> _webAppUrl;

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

_webAppUrl.Value.Staging;
_webAppUrl.Value.Qa;
_webAppUrl.Value.Prod;

好的,这就是 Microsoft 设置多个 appsetting.json 文件的方式 你可以看看,因为它有点长

这是我如何根据环境使用 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();
            }
        }

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

在您的应用程序启动之前,使用ebextensions来管理服务器的自定义。

  • 您的实例应具有具有ec2:DescribeTags权限的角色。
  • 配置您的 EB 应用程序以设置环境标记
  • 您要么有一个包含每个环境的连接字符串的应用程序配置文件,要么使用 AWS Secrets manager 之类的东西(您的实例角色需要此服务的权限)来保存您的连接字符串(更好的安全性)。
  • 应用程序代码使用环境变量从配置文件或 Secrets manager 中选择正确的连接字符串。
  • 您部署与应用程序init.config文件中.ebextensions夹断了根。
  • init.config 读取实例元数据以确定环境并设置环境变量。
  • 您的应用程序启动,读取变量,提取连接字符串并连接到正确的数据库。

下面的示例是带有 powershell 的 windows 实例的 init.config,但可以适应 bash + aws cli。

第一步写出一个powershell脚本。 该脚本读取 Environment 标记并将值写入机器范围的变量以供应用程序提取。 第二步调用脚本。

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 核心应用程序处理来自弹性 beantalk 的 env 变量存在问题。

这是答案(hack)如何强制应用程序获取ASP.NET Core 1.0 中的环境变量 AWS Elastic Beanstalk 环境变量

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

只是不要忘记在 env 变量中添加ASPNETCORE_ENVIRONMENT var。

我建议将配置放入 AWS System Manager 的 Parameter Store。 Amazon.Extensions.Configuration.SystemsManager NuGet 包将 Parameter Store 作为配置提供程序添加到 .NET 配置系统。 这是一篇博客文章以获取更多信息。 https://aws.amazon.com/blogs/developer/net-core-configuration-provider-for-aws-systems-manager/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM