Jak przekazać niestandardową zmienną środowiskową w Amazon Elastic Beanstalk (AWS EBS)?

121

Notatka Amazon Elastic Beanstalk mówi:

Elastic Beanstalk pozwala „otworzyć maskę” i zachować pełną kontrolę ... nawet przekazywać zmienne środowiskowe przez konsolę Elastic Beanstalk.

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

Jak przekazać inne zmienne środowiskowe oprócz tej w konfiguracji Elastic Beanstalk?

Ben
źródło
4
możesz rozważyć zmianę zaakceptowanej odpowiedzi w tej sprawie
philipp

Odpowiedzi:

137

Jako uwaga dla każdego, kto skorzysta z tej .ebextensions/*.configdrogi: obecnie możesz dodawać, edytować i usuwać zmienne środowiskowe w interfejsie internetowym Elastic Beanstalk.

Zmienne znajdują się w Konfiguracja → Konfiguracja oprogramowania:

Właściwości środowiska

Tworzenie zmiennych .ebextensionsjak w odpowiedzi Onemy nadal działa.

Może to być nawet preferowane rozwiązanie, np. Jeśli później będziesz wdrażać w innym środowisku i boisz się zapomnieć o ich ręcznym ustawieniu lub jeśli zgadzasz się na przekazanie wartości do kontroli źródła. Używam mieszanki obu.

Limonka
źródło
2
Alternatywnie możesz również zapisać konfigurację i uruchomić nowe środowisko przy użyciu konfiguracji.
Michael Gallego
1
Tak, powiedziałbym, że to najlepsza opcja. Po prostu ciągle o tym zapominam i chcąc nie chcąc uruchamiam nowe środowiska. :)
lime
1
@dingdong: tak, aw szczególności możesz uzyskać do nich dostęp w swojej aplikacji. Np. W Railsach ENV["CUSTOM_ENV"]wróci "something-something".
wapno
3
Jeśli dodam nowe właściwości lub zmienię wartość właściwości, czy są one natychmiast dostępne, czy wymagają ponownego uruchomienia itp.? Niedawno zmieniłem rozmiar grupy autoskalowania i AWS zakończył prawie wszystkie 40 naszych instancji i utworzył 45 nowych. Nie chcę, aby tak się stało, jeśli dodam nową właściwość do istniejącego środowiska. Jakieś pomysły?
Engineer81,
4
Uważaj na ostatnie zmiany. Zgodnie z tą odpowiedzią nie są one przekazywane jako zmienne środowiskowe. Są one przekazywane tylko jako właściwości systemu
James
107

Ograniczające jest tylko 5 wartości lub możesz chcieć mieć niestandardową nazwę zmiennej środowiskowej. Możesz to zrobić za pomocą plików konfiguracyjnych. Utwórz katalog w katalogu głównym projektu o nazwie

.ebextensions /

Następnie utwórz plik o nazwie environment.config (ten plik można nazwać dowolnie, ale musi mieć rozszerzenie .config) i dodaj następujące wartości

option_settings:
  - option_name: CUSTOM_ENV
    value: staging

Po wdrożeniu aplikacji zobaczysz tę nową wartość w obszarze Szczegóły środowiska -> Edytuj konfigurację -> Kontener

aby uzyskać więcej informacji, zapoznaj się z dokumentacją tutaj: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-options

Aktualizacja

Aby zapobiec zatwierdzaniu wartości repozytorium, takich jak klucze API, wpisy tajne itp., Możesz umieścić wartość zastępczą.

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

Później możesz przejść do panelu administracyjnego AWS (Szczegóły środowiska -> Edytuj konfigurację -> Kontener) i tam zaktualizować wartości. Z mojego doświadczenia wynika, że ​​wartości te nie zmieniają się po kolejnych wdrożeniach.

Aktualizacja 2 Jak stwierdził @Benjamin w swoim komentarzu, ponieważ nowy wygląd i styl zostały wprowadzone 18 lipca 2013 r., Możliwe jest zdefiniowanie dowolnej liczby zmiennych środowiskowych bezpośrednio z konsoli:

Configuration > Software Configuration > Environment Properties

Onema
źródło
2
@Onema - Jak radzisz sobie z dodawaniem nowych kluczy do pliku konfiguracyjnego? Czy przekazanie zaktualizowanego pliku spowoduje zaktualizowanie wszystkich wcześniej ustawionych kluczy z wartościami zastępczymi?
Tabrez
1
@Tabrez, wszystkie wcześniej ustawione klucze zachowają swoje wartości.
Anarchtica
2
Przepraszam @Tabrez, nie miałem okazji zajrzeć do tego wcześniej. Aby dodać do odpowiedzi Anarchtica, przeprowadziłem test i odkryłem, że jeśli użyjesz symbolu zastępczego, a następnie zaktualizujesz wartości w konsoli AWS za pomocą prawdziwych kluczy, a następnie zaktualizujesz wartości zastępcze w pliku konfiguracyjnym i wypchniesz, klucze nie będą zastąpiony nowym symbolem zastępczym. Wydaje mi się to trochę dziwne, ale myślę, że jest to mile widziane zachowanie, ponieważ będziesz zmuszony zarządzać wszystkimi wartościami env w konsoli.
Onema
7
@Anarchtica, zapytałem o to zachowanie do wsparcia AWS. Powiedzieli, że po zaktualizowaniu wartości w konsoli będą miały pierwszeństwo i nie będziesz w stanie ich zmodyfikować za pomocą plików konfiguracyjnych. Jeśli nigdy nie zmienisz wartości w konsoli, wszelkie zmiany wprowadzone w pliku konfiguracyjnym zostaną zaktualizowane.
Onema
1
Czy ktoś wie, jak używać zmiennych środowiskowych w pliku konfiguracyjnym dla container_commands? Próbowałemcommand: "nrsysmond-config --set license_key={$NR_INSTALL_KEY}"
colllin
29

W 2016 Java8 Tomcat8 AMI, ElasticBeanstalk nie ustawia zmiennych środowiskowych z konfiguracji internetowej. Naprawdę zamiast tego ustawiają właściwości jvm -D.

- „Następujące właściwości są przekazywane do aplikacji jako zmienne środowiskowe. Więcej informacji”.

To stwierdzenie jest niepoprawne w przypadku ami Java Tomcat. Amazon nie ustawia ich jako zmiennych środowiskowych. Są one ustawiane jako właściwości systemowe przekazywane w wierszu poleceń do serwera Tomcat jako właściwość -D dla jvm. Metoda w Javie do pobierania zmiennych środowiskowych nie jest taka sama, jak w przypadku pobierania właściwości. System.getenv vs System.getProperty

Wrzuciłem ssh do pudełka i sprawdziłem, że zmienna środowiskowa nigdy nie została ustawiona. Jednak w dziennikach tomcat widzę, że właściwość -D jest ustawiona.

Zmieniłem kod, aby sprawdzić teraz obie lokalizacje jako obejście.

Ed J
źródło
W przypadku .Net są one wstawiane do pliku web.config, a nie do zmiennych środowiskowych, zgodnie ze stackoverflow.com/a/33465765/1991614 . Kolejnym zagmatwanym problemem jest to, że nie są one wstawiane, jeśli ten klucz już istnieje w pliku web.confg :(
bitcoder
Jesteś moim bohaterem! Dziękujemy za zwrócenie uwagi na mapowanie właściwości -D w Tomcat 8.
shadowhorst
1
Dla takich jak ja, którzy naprawdę potrzebują ustawić zmienne środowiskowe systemu, możesz pobrać te właściwości środowiska za pomocą wbudowanego skryptu beanstalk. Zobacz tę odpowiedź, aby uzyskać więcej informacji: serverfault.com/a/770736/292741
BoomShadow,
1
Amazon Linux 2017.03 v2.5.4 with Java8również nie ustawia śr.
Sanoob
2
Nie możesz wejść SSH do pola i zobaczyć zmienne. Są ustawiane tylko w powłoce, w której uruchomiono Twoją aplikację. 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. Twoje zmienne nie są ustawiane w skrypcie logowania, takim jak .bashrc. Jednak masz rację, zmienne Tomcat są przekazywane jako właściwości. (Zobacz górę połączonej strony)
Chloe
18

AWS zinterpretuje ciągi szablonów CloudFormation w zmiennych środowiskowych. Możesz użyć tego, aby uzyskać dostęp do informacji o środowisku EB w aplikacji:

W interfejsie internetowym AWS następujące elementy zostaną ocenione jako nazwa twojego środowiska (zwróć uwagę na tylne znaczniki):

`{ "Ref" : "AWSEBEnvironmentName" }`

Lub możesz użyć .ebextensions/*.configszablonu CloudFormation i zawinąć go w tylne znaczniki (`):

{
  "option_settings": [
    {
      "namespace": "aws:elasticbeanstalk:application:environment",
      "option_name": "ENVIRONMENT_NAME",
      "value": "`{ \"Ref\" : \"AWSEBEnvironmentName\" }`"
    }
  ]
}
George Brassey
źródło
3
Niejasne, ale właśnie tego szukałem.
Eric Walker
1
Czy jest na to dokumentacja? Nie mogę tego znaleźć.
yangmillstheory
@yangmillstheory docs.aws.amazon.com/elasticbeanstalk/latest/dg/ ...
mike mckechnie
12

Alternatywnie możesz użyć Elastic Beanstalk CLI do ustawiania zmiennych środowiskowych.

Aby ustawić zmienną środowiskową: eb setenv FOO=bar

Aby wyświetlić zmienne środowiskowe: eb printenv

trex
źródło
9

Szczegóły środowiska -> Edytuj konfigurację -> Kontener

wprowadź opis obrazu tutaj

Ben
źródło
5

Wydaje się, że jest to jedyny sposób na ustawienie ENV z wartościami dynamicznymi w łodydze fasoli. Wymyśliłem obejście, które działa w mojej konfiguracji multi-docker:

1) Dodaj to do swojego Dockerfile przed zbudowaniem + przesłaniem do repozytorium ECS:

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

2) W pliku Dockerrun.aws.json utwórz wolumin:

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

3) Zamontuj objętość do pojemnika

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

4) W pliku .ebextensions / options.config dodaj blok container_commands w następujący sposób:

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, a twój ENVS powinien być dostępny w twoim kontenerze docker

Możesz dodać więcej ENV, dodając więcej container_commands, takich jak:

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

Mam nadzieję że to pomoże!

dsorensen
źródło
Ratownik. Jeśli masz dynamiczne zmienne środowiskowe, np. X: '{"Ref": "MyCache"} 'wartość nie jest analizowana (wartość to tylko „ {"Ref": "MyCache"}”), gdy kontener próbuje uzyskać do niego dostęp. Dzięki temu możesz mieć takie zmienne dynamiczne.
Petter Kjelkenes,