在AWS中运行的应用程序如何知道其环境?

时间:2018-09-19 17:22:02

标签: amazon-web-services amazon-ec2 aws-lambda aws-fargate amazon-elastic-beanstalk

我在不同类型的AWS主机上运行不同类型的应用程序,包括:

  1. 在EC2实例(Windows和Linux)上运行
  2. 在自动缩放的EC2实例上运行
  3. 在ElasticBeanstalk(ASP.NET和ASP.NET Core)上运行
  4. 在Fargate的Linux Docker容器中运行
  5. Lambda函数

我希望我的应用程序能够检测它们在其中运行的环境(开发,暂存,生产),以便它们可以在启动时加载适当的配置,例如从参数存储层次结构中特定于环境的文件夹中获取。

理想情况下,我可以调用一个简单的API(类似于GetCurrentEnvironment())。

以上述所有主机类型的通用方式实现此目标的最佳方法是什么?

我所有的AWS资源都用环境名称标记。是否可以从上述所有主机类型中调用API,以返回当前主机的标记值?

否则,我想一种解决方案是在创建主机期间设置环境变量“ CurrentEnvironment”或类似参数。

我想这是一个普遍的要求,所以我很想知道其他人是怎么做到的。

2 个答案:

答案 0 :(得分:1)

没有用于检索这些服务的元数据的灵丹妙药。由于服务本身的性质完全不同。

对于基于EC2的部署,可以使用metadata servicecorresponding sdks

自动缩放的EC2实例与常规EC2实例没有什么不同。

对于Beanstalk,从技术上讲,使用ec2可以使用元数据服务。但是,我宁愿建议您将相关项目设置为EBS中的配置。例如,您有一个应用程序想要为Prod类型的部署设置4GB的堆空间,为Dev Type设置1GB的应用程序。您可以在部署期间执行此操作。

Lambda和容器也是如此。 Lambda确实有办法获取一些metadata,但是,即使对于lambda,您也将在部署过程中知道lambda的配置/大小,并可以使用它来设置相关的env变量。

因此,您可以让这些元素的部署脚本/作业查看参数存储并在部署期间配置相关服务。这将确保您拥有更简单的应用程序以及CI / CD管道在设置应用程序时承担的工作分担。

我认为标签应用于您了解的已创建元数据,该资源所属的服务,其用途等。

答案 1 :(得分:1)

标记是最广泛支持的方法。

但是,每种类型的环境中都有更多本地支持的方法。


在ElasticBeanstalk 中,您可以为应用程序环境设置环境属性,该属性可以从.NET应用程序中的Web.config appSettings中读取。

ElasticBeanstalk> [应用程序名称]> [环境名称]>配置>软件

使用NameValue添加应用程序属性,例如:

  • 名称= ReleaseEnvironment;值=分期
  • 名称= EnvironmentSecretKey;值= SomeSecureKeyThatGainsAccessToASecureParameterStore

Elastic Beanstalk将应用程序部署到实例时,会将其添加到<appSettings>部分的Web.config文件中。

因此在应用程序内,使用以下代码读取值:

var environmentName = ConfigurationManager.AppSettings["ReleaseEnvironment"];

然后,您可以使用该值从参数存储中获取特定于环境的属性。您也可以通过这种方式传递大量值,并避免在更合适的情况下避免使用参数存储。

环境变量还支持其他EB部署语言:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-softwaresettings.html


在Lambda中,您可以在配置中设置环境变量,并在Lambda容器中读取它们:https://docs.aws.amazon.com/lambda/latest/dg/env_variables.html


在ECS / Fargate 中,您可以传递环境属性,并使用describe-task-definition在容器中读取它们。


在EC2中,您需要使用元数据服务来读取用户数据:

user_data=`curl http://169.254.169.254/latest/user-data/`

请参阅:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html