AWS 中的应用程序 运行 如何了解它们的环境?

How can applications running in AWS know their environment?

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

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

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

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

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

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

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

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

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

对于基于 EC2 的部署,可以使用 metadata service or corresponding sdks

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

对于 Beanstalk,由于技术上使用了 ec2,因此您可以使用元数据服务。但是,我更推荐大家设置相关的项目是EBS中的配置。示例假设您有一个应用程序,您想要为 Prod 类型的部署设置 4GB 的堆空间,为 Dev 类型设置 1GB 的堆空间。您可以在部署期间执行此操作。

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

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

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

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

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


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

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

添加带有 NameValue 的应用程序 属性,例如:

  • 名称=发布环境;值 = 分期
  • Name = 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