AWS 中的应用程序 运行 如何了解它们的环境?
How can applications running in AWS know their environment?
我在不同类型的 AWS 主机上有不同类型的应用程序 运行,包括:
- 运行 在 EC2 实例上(Windows 和 Linux)
- 运行 在自动扩展的 EC2 实例上
- 运行 在 ElasticBeanstalk 上(ASP.NET 和 ASP.NET 核心)
Fargate 上 Linux Docker 容器中的 - 运行
- 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 > [应用程序名称] > [环境名称] > 配置 > 软件
添加带有 Name
和 Value
的应用程序 属性,例如:
- 名称=发布环境;值 = 分期
- 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
我在不同类型的 AWS 主机上有不同类型的应用程序 运行,包括:
- 运行 在 EC2 实例上(Windows 和 Linux)
- 运行 在自动扩展的 EC2 实例上
- 运行 在 ElasticBeanstalk 上(ASP.NET 和 ASP.NET 核心) Fargate 上 Linux Docker 容器中的
- 运行
- 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 > [应用程序名称] > [环境名称] > 配置 > 软件
添加带有 Name
和 Value
的应用程序 属性,例如:
- 名称=发布环境;值 = 分期
- 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