Як ви передаєте користувацьку змінну середовища на Amazon Elastic Beanstalk (AWS EBS)?


121

Розмиття Amazo Elastic Beanstalk говорить:

Elastic Beanstalk дозволяє "відкрити капот" і зберегти повний контроль ... навіть передавати змінні середовища через консоль Elastic Beanstalk.

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

Як передавати інші змінні середовища, окрім тієї в конфігурації Elastic Beanstalk?


4
ви можете розглянути можливість змінити прийняту відповідь на це
philipp

Відповіді:


136

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

Змінні знаходяться в розділі Конфігурація → Конфігурація програмного забезпечення:

Властивості навколишнього середовища

Створення vars у, .ebextensionsяк у відповіді Onema, все ще працює.

Це навіть може бути кращим, наприклад, якщо ви пізніше будете розгортатися в інше середовище і боїтесь забути їх встановити вручну, або якщо ви все в порядку з введенням значень для контролю джерела. Я використовую суміш обох.


2
Крім того, ви також можете зберегти конфігурацію та запустити нове середовище за допомогою конфігурації.
Майкл Галлего

1
Так, я б сказав, що це найкращий варіант. Я просто забуваю про це і запускаю нове середовище мимоволі. :)
вапна

1
@dingdong: так, і, зокрема, ви можете отримати доступ до них у своїй програмі. Наприклад, у Рейлах ENV["CUSTOM_ENV"]повернеться "something-something".
лайм

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


2
@Onema - Як ви обробляєте додавання нових ключів у конфігураційний файл? Чи буде натискання оновленого файлу оновити всі раніше встановлені клавіші зі значеннями заповнення?
Тебрез

1
@Tabrez, будь-які раніше встановлені клавіші збережуть свої значення.
Anarchtica

2
Вибачте @Tabrez, я раніше не мав можливості розібратися в цьому. Щоб додати відповідь Anarchtica, я провів деякий тест і з'ясував, що якщо ви використовуєте заповнювач, а потім оновлюєте значення на консолі AWS за допомогою реальних ключів, а потім оновлюєте значення заповнювача у файлі конфігурації та натискаєте, ключі не будуть замінено на новий заповнювач. Я вважаю це трохи дивним, але я думаю, що це доброзичлива поведінка, оскільки ви будете змушені керувати всіма значеннями env в консолі.
Онема

7
@Anarchtica, я запитав про цю поведінку до служби підтримки AWS. Вони сказали, що як тільки ви оновите значення в консолі, вони матимуть перевагу, і ви не зможете змінювати їх, використовуючи конфігураційні файли взагалі. Якщо ви ніколи не змінюєте значення в консолі, будь-які зміни, внесені в конфігураційний файл, будуть оновлені.
Онема

1
Хтось знає, як використовувати змінні середовища всередині вашого конфігураційного файлу для контейнерів_команд? Я спробувавcommand: "nrsysmond-config --set license_key={$NR_INSTALL_KEY}"
colllin

29

У 2016 JavaI Tomcat8 AMI, ElasticBeanstalk не вдається встановити змінні середовища з веб-конфігурації. Вони замість цього дійсно встановлюють властивості jvm -D.

- "Наступні властивості передаються в додаток як змінні середовища. Дізнайтеся більше."

Це твердження є невірним для Java Tomcat ami. Amazon не встановлює їх як змінні середовища. Вони встановлюються як властивості системи, передані в командному рядку Tomcat як -D властивість для jvm. Метод отримання Java змінних середовища не є однаковим для отримання властивості. System.getenv vs System.getProperty

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

Я змінив код, щоб перевірити обидва місця зараз як спосіб вирішення.


А для .Net вони вставляються у ваш файл web.config, а не ставляться у середовище vars, відповідно до stackoverflow.com/a/33465765/1991614 . Подальше заплутане питання полягає в тому, що вони не вставляються, якщо цей ключ уже існує у web.confg :(
bitcoder

Ви - мій герой! Дякуємо вам за те, що помітили картографію власності -D у Tomcat 8.
shadowhorst

1
Для таких, як я, яким дійсно потрібно встановити змінні системного середовища, ви можете отримати ці властивості середовища за допомогою вбудованого скрипта підключення. Дивіться цю відповідь для отримання додаткової інформації: 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


12

Крім того, ви можете використовувати CLI Elastic Beanstalk для встановлення змінних середовища.

Щоб встановити змінну середовища: eb setenv FOO=bar

Щоб переглянути змінні середовища: eb printenv


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:
  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 розгортання, і ваш ENVS має бути доступний у вашому докерному контейнері

Ви можете додати більше ENV, додавши більше контейнерів-команд, таких як:

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

Сподіваюся, це допомагає!


Рятувальник. Якщо у вас є динамічні змінні середовища, наприклад, X: '{"Ref": "MyCache"} 'значення не розбирається (значення лише " {"Ref": "MyCache"}") за замовчуванням, коли контейнер намагається отримати доступ до нього. Завдяки цьому ви можете мати такі динамічні змінні.
Петтер Келькенес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.