2

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

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

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

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

以上述所有主机类型共有的方式实现这一目标的最佳方法是什么?

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

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

我想这是一个常见的要求,所以我很想知道其他人是如何做到的。

4

2 回答 2

1

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

对于基于 EC2 的部署,可以使用元数据服务相应的 sdks

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

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

Lambda 和容器也是如此。Lambda 确实有办法获取一些元数据,但是,即使对于 lambda,您也会在部署期间知道 lambda 的配置/大小,并可以使用它来设置相关的环境变量。

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

我认为标签应该用于创建你理解的元数据,这个资源属于什么服务,它的用途是什么等。

于 2018-09-19T17:38:47.937 回答
1

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

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


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

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

Name使用and添加一个应用程序属性Value,例如:

  • 名称 = 发布环境;价值 = 分期
  • 名称 = EnvironmentSecretKey;值 = SomeSecureKeyThatGainsAccessToASecureParameterStore

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

所以在应用程序中使用以下代码来读取值:

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

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

通过环境变量还支持其他 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

于 2018-09-20T18:48:06.860 回答