У меня есть приложения разных типов, работающие на разных типах хостов AWS, в том числе:
Я хочу, чтобы мои приложения могли определять среду, в которой они работают (разработка, подготовка, производство), чтобы они могли загружать соответствующую конфигурацию при запуске, например из папки для конкретной среды в иерархии хранилища параметров.
В идеале простой API, который я могу вызвать (что-то вроде GetCurrentEnvironment()).
Как лучше всего добиться этого, что является общим для всех вышеперечисленных типов хостов?
Все мои ресурсы AWS помечены именем среды. Есть ли API, который можно вызвать из всех вышеперечисленных типов хостов, который бы возвращал значение тега для текущего хоста?
В противном случае, я думаю, решением было бы установить переменную среды «CurrentEnvironment» или аналогичную во время создания хоста.
Я думаю, это обычное требование, поэтому мне было бы интересно узнать, как это делают другие.
@ krishna_mee2004 - Я знаю об этом API, но как он работает, скажем, с лямбда-функцией? Или Elastic Beanstalk, где, AFAIK, я не управляю экземпляром EC2?
Какие данные вы ждете от GetCurrentEnvironment()? Dev / stage / prod не являются встроенными константами AWS, поэтому я не понимаю, как их где-то не устанавливать.
@Code - я знаю, что они не встроены в константы, и мне придется их где-то установить, но где? Теги?





Не существует серебряной пули для получения метаданных для этих служб. Ведь сам характер услуг совсем другой.
Для развертываний на основе EC2 можно использовать служба метаданных или соответствующийSDKS.
Инстансы EC2 с автомасштабированием ничем не отличаются от обычных инстансов EC2.
Для Beanstalk, поскольку технически используется ec2, вы можете использовать службу метаданных. Однако я бы рекомендовал вам установить соответствующие элементы конфигурации в EBS. Например, у вас есть приложение, которое вы хотите настроить с 4 ГБ пространства кучи для типа развертывания Prod и 1 ГБ для типа Dev. Вы можете сделать это во время развертывания.
То же самое касается Lambda и контейнеров. У Lambda есть способ получить некоторый метаданные, однако даже для лямбда вы будете знать конфигурацию / размер лямбда во время развертывания и можете использовать это для установки соответствующих переменных env.
Таким образом, вы можете сделать так, чтобы сценарии / задания развертывания этих элементов просматривали хранилище параметров и настраивали соответствующие службы во время развертывания. Это гарантирует, что у вас будут более простые приложения и имеющиеся у вас конвейеры CI / CD, которые сделают свою долю работы по настройке приложений.
На мой взгляд, тег должен использоваться для созданных метаданных, которые вы понимаете, к какому сервису принадлежит этот ресурс, для чего он используется и т. д.
Могу ли я получить теги из службы метаданных? Или мне нужно получить идентификатор экземпляра, например, вызвать DescribeTags?
AFAIK, нет, вам нужно использовать API Describe Tags для этого. См. docs.aws.amazon.com/AWSEC2/latest/APIReference/…. Обратите внимание, что это означает, что ваш экземпляр EC2 теперь должен иметь разрешения ec2: describe.
Тегирование - это наиболее широко поддерживаемый метод.
Однако в каждом типе среды есть более встроенные методы.
В ElasticBeanstalk вы можете установить свойства среды для среды приложения, которые можно прочитать из Web.config appSettings в приложении .NET.
ElasticBeanstalk> [Имя приложения]> [Имя среды]> Конфигурация> Программное обеспечение
Добавьте свойство приложения с Name и Value, например:
Когда 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, вы можете передать свойства среды и прочитать их в контейнере с помощью описание-задание-определение.
В EC2, вам необходимо использовать службу метаданных для чтения пользовательских данных:
user_data=`curl http://169.254.169.254/latest/user-data/`
См .: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
Спасибо, это более исчерпывающий ответ
Вы можете вызвать API
DescribeTags, чтобы получить теги, прикрепленные к ресурсу EC2. Вы можете получить идентификатор экземпляра из метаданных экземпляра: 169.254.169.254/latest/meta-data/instance-id. Чтобы это работало, вам необходимо прикрепить к экземпляру роль IAM.