Как приложения, работающие в AWS, могут знать свою среду? - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть приложения разного типа, работающие на разных типах хостов AWS, включая:

  1. Запуск на экземплярах EC2 (Windows и Linux)
  2. Запуск на автоматически масштабируемых экземплярах EC2
  3. Запуск в ElasticBeanstalk (ASP.NET и ASP.NET Core)
  4. Запуск в контейнерах Linux Docker на Fargate
  5. Лямбда-функции

Iхочу, чтобы мои приложения могли определять среду, в которой они работают (разработка, подготовка, производство), чтобы они могли загружать соответствующую конфигурацию при запуске, например, из определенной для среды папки в иерархии хранилища параметров.

В идеале это простой API, который я могу назвать (что-то вроде GetCurrentEnvironment()).

Каков наилучший способ добиться этого способом, который является общим для всех перечисленных выше типов хостов?

Все моиРесурсы AWS помечены именем среды.Существует ли API, который можно вызывать из всех перечисленных выше типов хостов, которые возвращали бы значение тега для текущего хоста?

В противном случае, я думаю, что решением было бы установить переменную окружения "CurrentEnvironment" или подобное во времясоздание хоста.

Полагаю, это общее требование, поэтому мне было бы интересно узнать, как это делают другие.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Маркировка является наиболее широко поддерживаемым методом.

Однако в каждом типе среды есть более встроенные методы.


В ElasticBeanstalk вы можете установить свойства среды для среды приложения, которые можно прочитать изWeb.config appSettings в приложении .NET.

ElasticBeanstalk> [Имя приложения]> [Имя среды]> Конфигурация> Программное обеспечение

Добавить свойство приложения с помощью Name и Value, например:

  • Name = ReleaseEnvironment;Значение = Staging
  • Name = EnvironmentSecretKey;Значение = SomeSecureKeyThatGainsAccessToASecureParameterStore

Когда Elastic Beanstalk развертывает Приложение в экземплярах, оно добавляет его в файл Web.config в разделе <appSettings>.

Поэтому в Приложении используетсяследующий код, чтобы прочитать значение:

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

Затем вы можете получить свойства вашей среды из вашего хранилища параметров, используя это значение.Таким образом, вы также можете передать множество значений и избежать хранилища параметров, если оно более уместно.

Другие языки, развернутые в EB, также поддерживаются с помощью переменных среды: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-softwaresettings.html


В Lambda вы можете установить переменные среды в конфигурации и прочитать их в лямбда-контейнере: https://docs.aws.amazon.com/lambda/latest/dg/env_variables.html


В ECS / Fargate вы можете передать средусвойств и считайте их в контейнере, используя description-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

0 голосов
/ 19 сентября 2018

Нет серебряной пули для получения метаданных для этих сервисов.Поскольку сама природа служб совершенно иная.

Для развертываний на основе EC2 можно использовать службу метаданных или , соответствующую sdks .

Автоматически масштабированные экземпляры EC2 ничем не отличаются от обычных экземпляров EC2.

Для Beanstalk, так как технически используется ec2, вы можете использовать сервис метаданных.Однако я бы скорее рекомендовал вам установить соответствующие пункты конфигурации в EBS.Например, у вас есть приложение, которое вы хотите настроить с 4 ГБ дискового пространства для развертывания типа Prod и 1 ГБ для типа Dev.Вы можете сделать это во время развертывания.

То же самое касается Lambda и контейнеров.У лямбды есть способ получить некоторые метаданные , однако даже для лямбды вы будете знать о конфигурации / размере лямбды во время развертывания и сможете использовать это для установки соответствующих переменных env.

Таким образом, вы можете иметь сценарии / задания развертывания этих элементов, просматривать хранилище параметров и настраивать соответствующие службы во время развертывания.Это гарантирует, что у вас есть более простые приложения и конвейеры CI / CD, которые вы выполняете свою часть работы по настройке приложений.

Тэг, по моему мнению, должен использоваться для создаваемых метаданных, которые вы понимаете, к какому сервису относится данный ресурс, для чего его используют и т. Д.

...