Как передать пользовательскую переменную среды в Amazon Elastic Beanstalk (AWS EBS)?

121

Рекламное объявление Amazon Elastic Beanstalk гласит:

Elastic Beanstalk позволяет вам «приоткрыть крышу» и сохранить полный контроль ... даже передавать переменные среды через консоль Elastic Beanstalk.

http://aws.amazon.com/elasticbeanstalk/

Как передать другие переменные среды, кроме той, которая указана в конфигурации Elastic Beanstalk?

Бен
источник
4
вы можете подумать об изменении принятого ответа на этот вопрос
Филипп

Ответы:

137

Внимание всем, кто использует этот .ebextensions/*.configспособ: в настоящее время вы можете добавлять, редактировать и удалять переменные среды в веб-интерфейсе Elastic Beanstalk.

Переменные находятся в Configuration → Software Configuration:

Свойства среды

Создание варов, .ebextensionsкак в ответе Onema, все еще работает.

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

Лайм
источник
2
Кроме того, вы также можете сохранить конфигурацию и запустить новую среду, используя конфигурацию.
Michael Gallego
1
Ага, я бы сказал, что это лучший вариант. Я просто все время забываю об этом и волей-неволей запускаю новые среды. :)
известь
1
@dingdong: да, и, в частности, вы можете получить к ним доступ в своем приложении. Например, в Rails ENV["CUSTOM_ENV"]вернется "something-something".
Lime
3
Если я добавляю новые свойства или изменяю значение свойства, доступны ли они сразу же, требуется ли перезапуск чего-либо и т. Д.? Недавно я изменил размер группы автомасштабирования, и AWS прекратил работу почти всех 40 наших инстансов и создал 45 новых. Я не хочу, чтобы это произошло, если я добавлю новое свойство в существующую среду. Любые идеи?
Engineer81
4
Остерегайтесь последних изменений. Согласно этому ответу они не передаются как переменные среды. Они передаются только как системные свойства
Джеймс,
107

Ограничением является только 5 значений, или вы можете иметь собственное имя переменной среды. Вы можете сделать это с помощью файлов конфигурации. Создайте каталог в корне вашего проекта под названием

.ebextensions /

Затем создайте файл с именем environment.config (этот файл можно называть как угодно, но он должен иметь расширение .config) и добавьте следующие значения

option_settings:
  - option_name: CUSTOM_ENV
    value: staging

После развертывания приложения вы увидите это новое значение в разделе «Сведения о среде» -> «Изменить конфигурацию» -> «Контейнер».

для получения дополнительной информации проверьте документацию здесь: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-options

Обновить

Чтобы предотвратить фиксацию значений вашего репозитория, таких как ключи API, секреты и т. Д., Вы можете поместить значение-заполнитель.

option_settings:
  - option_name: SOME_API_KEY
    value: placeholder-value-change-me

Позже вы можете перейти в панель администратора AWS (Сведения о среде -> Изменить конфигурацию -> Контейнер) и обновить там значения. По моему опыту, эти значения не меняются после последующих развертываний.

Обновление 2 Как заявил @Benjamin в своем комментарии, поскольку новый внешний вид был выпущен 18 июля 2013 г., можно определить любое количество переменных среды непосредственно с консоли:

Configuration > Software Configuration > Environment Properties

Onema
источник
2
@Onema - Как вы справляетесь с добавлением новых ключей в файл конфигурации? Будет ли нажатие обновленного файла обновлять все ранее установленные ключи значениями-заполнителями?
Табрез
1
@Tabrez, любые ранее установленные ключи сохранят свои значения.
Anarchtica
2
Извините, @Tabrez, у меня не было возможности разобраться в этом раньше. Чтобы добавить в ответ Anarchtica, я провел некоторый тест и обнаружил, что если вы используете заполнитель, а затем обновляете значения в консоли AWS с использованием реальных ключей, а затем обновляете значения заполнителя в файле конфигурации и нажимаете, ключи не будут заменен новым заполнителем. Я нахожу это немного странным, но я думаю, что это желанное поведение, так как вам придется управлять всеми значениями env в консоли.
Onema 01
7
@Anarchtica, я спросил об этом в службе поддержки AWS. Они сказали, что как только вы обновите значения в консоли, они будут иметь приоритет, и вы вообще не сможете изменить их с помощью файлов конфигурации. Если вы никогда не изменяете значения в консоли, любые изменения, внесенные в файл конфигурации, будут обновлены.
Onema 04
1
Кто-нибудь знает, как использовать переменные среды внутри вашего файла конфигурации для container_commands? Я пробовалcommand: "nrsysmond-config --set license_key={$NR_INSTALL_KEY}"
colllin
29

В Java8 Tomcat8 AMI 2016 ElasticBeanstalk не может установить переменные среды из веб-конфигурации. Вместо этого они действительно устанавливают свойства jvm -D.

- «Следующие свойства передаются в приложение как переменные среды. Подробнее».

Это утверждение неверно для Java Tomcat ami. Amazon не устанавливает их как переменные среды. Они устанавливаются как системные свойства, передаваемые в командной строке Tomcat как свойство -D для jvm. Метод получения переменных среды в Java отличается от метода получения свойства. System.getenv против System.getProperty

Я ssh'd в поле и убедился, что переменная среды никогда не задавалась. Однако в журналах tomcat я вижу, что свойство -D установлено.

Я изменил свой код, чтобы проверить оба местоположения в качестве временного решения.

Эд Дж
источник
А для .Net они вставляются в ваш файл web.config, а не помещаются в переменные среды, как указано в stackoverflow.com/a/33465765/1991614 . Еще больше сбивает с толку то, что они не вставляются, если этот ключ уже существует в web.confg :(
bitcoder
Ты мой герой! Спасибо, что заметили сопоставление свойств -D в Tomcat 8.
shadowhorst
1
Для тех, кто вроде меня действительно нуждается в установке переменных системной среды, вы можете получить эти свойства среды с помощью встроенного скрипта beanstalk. См. Этот ответ для получения дополнительной информации: serverfault.com/a/770736/292741
BoomShadow
1
Amazon Linux 2017.03 v2.5.4 with Java8также не устанавливает env.
Sanoob
2
Вы не можете использовать SSH в коробке и увидеть переменные. Они устанавливаются только в оболочке, в которой запущено ваше приложение. docs.aws.amazon.com/elasticbeanstalk/latest/dg/ ... In general, however, environment properties are passed only to the application and can't be viewed by connecting an instance in your environment and running env. Ваши переменные не установлены в сценарии входа, например .bashrc. Однако вы правы, переменные Tomcat передаются как свойства. (См. Верхнюю часть связанной страницы.)
Хлоя
18

AWS интерпретирует строки шаблона CloudFormation в переменных вашей среды. Вы можете использовать это для доступа к информации о вашей среде EB внутри вашего приложения:

В веб-интерфейсе AWS следующее будет оцениваться как имя вашей среды (обратите внимание на обратные галочки):

`{ "Ref" : "AWSEBEnvironmentName" }`

Или вы можете использовать .ebextensions/*.configшаблон CloudFormation и заключить его в обратные галочки (`):

{
  "option_settings": [
    {
      "namespace": "aws:elasticbeanstalk:application:environment",
      "option_name": "ENVIRONMENT_NAME",
      "value": "`{ \"Ref\" : \"AWSEBEnvironmentName\" }`"
    }
  ]
}
Джордж Брасси
источник
3
Непонятно, но именно то, что я искал.
Эрик Уокер
1
Есть ли для этого документация? Кажется, я не могу его найти.
yangmillstheory
@yangmillstheory docs.aws.amazon.com/elasticbeanstalk/latest/dg/…
mike mckechnie
12

В качестве альтернативы вы можете использовать интерфейс командной строки Elastic Beanstalk для установки переменных среды.

Чтобы установить переменную среды: eb setenv FOO=bar

Чтобы просмотреть переменные среды: eb printenv

Trex
источник
9

Сведения о среде -> Изменить конфигурацию -> Контейнер

введите описание изображения здесь

Бен
источник
5

Кажется, это единственный способ установить ENV с динамическими значениями в beanstalk. Я придумал обходной путь, который работает для моей настройки с несколькими докерами:

1) Добавьте это в свой Dockerfile перед сборкой + загрузкой в ​​репозиторий ECS:

CMD eval `cat /tmp/envs/env_file$`; <base image CMD goes here>;

2) В вашем файле Dockerrun.aws.json создайте том:

{
    "name": "env-file",
    "host": {
        "sourcePath": "/var/app/current/envs"
    }
}

3) Установите том в свой контейнер

{
  "sourceVolume": "env-file",
  "containerPath": "/tmp/envs",
  "readOnly": true
}

4) В вашем файле .ebextensions / options.config добавьте блок container_commands следующим образом:

container_commands:
  01_create_mount:
    command: "mkdir -p envs/"
  02_create_env_file:
    command: { "Fn::Join" : [ "", [ 'echo "', "export ENVIRONMENT_NAME=" , { "Ref", "RESOURCE" }, ';" > envs/env_file;' ] ] }

5) eb deploy и ваш ENVS должны быть доступны в вашем докер-контейнере

Вы можете добавить больше ENV, добавив больше container_command, например:

  02_create_env_file_2:
    command: { "Fn::Join" : [ "", [ 'echo "', "export ENVIRONMENT_NAME_2=" , { "Ref", "RESOURCE2" }, ';" >> envs/env_file;' \] \] }

Надеюсь это поможет!

dsorensen
источник
Спасатель. Если у вас есть динамические переменные среды, например, X: '{"Ref": "MyCache"} 'значение не анализируется (значение только ' {"Ref": "MyCache"}') по умолчанию, когда контейнер пытается получить к нему доступ. Благодаря этому у вас могут быть такие динамические переменные.
Петтер Кьелкенес