我在不同类型的AWS主机上运行不同类型的应用程序,包括:
我希望我的应用程序能够检测它们在其中运行的环境(开发,暂存,生产),以便它们可以在启动时加载适当的配置,例如从参数存储层次结构中特定于环境的文件夹中获取。
理想情况下,我可以调用一个简单的API(类似于GetCurrentEnvironment()
)。
以上述所有主机类型的通用方式实现此目标的最佳方法是什么?
我所有的AWS资源都用环境名称标记。是否可以从上述所有主机类型中调用API,以返回当前主机的标记值?
否则,我想一种解决方案是在创建主机期间设置环境变量“ CurrentEnvironment”或类似参数。
我想这是一个普遍的要求,所以我很想知道其他人是怎么做到的。
答案 0 :(得分:1)
没有用于检索这些服务的元数据的灵丹妙药。由于服务本身的性质完全不同。
对于基于EC2的部署,可以使用metadata service或corresponding 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> [应用程序名称]> [环境名称]>配置>软件
使用Name
和Value
添加应用程序属性,例如:
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