C# 在aws eb上存储asp.net core 2的连接字符串
我在aws eb上部署了.net core 2应用程序。我需要登台、qa和prod服务器,不知道如何处理连接字符串? 是否可以将其存储在eb上的env变量中? 或者是否可以为这三个实例创建env,并为每个实例创建不同的application.json文件?您可以使用 例如,您有如下appsetting.jsonC# 在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
"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读取实例元数据以确定环境并设置环境变量
- 应用程序启动、读取变量、提取连接字符串并连接到正确的数据库
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
)中,就像我刚刚用答案更新的一样。你能接受吗。谢谢