Amazon Elastic Beanstalk (AWS EBS) üzerinde özel ortam değişkenini nasıl geçirirsiniz?


121

Amazon Elastic Beanstalk yazısı şöyle diyor:

Elastic Beanstalk, "kapağı açmanıza" ve tam kontrolü elinizde tutmanıza olanak tanır ... hatta Elastic Beanstalk konsolundan ortam değişkenlerini bile geçirebilirsiniz.

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

Elastic Beanstalk yapılandırmasındakinin yanı sıra diğer ortam değişkenleri nasıl iletilir?


4
bu
konudaki

Yanıtlar:


137

.ebextensions/*.configYolu kullanan herkese uyarı olarak: Günümüzde Elastic Beanstalk web arayüzünde ortam değişkenleri ekleyebilir, düzenleyebilir ve kaldırabilirsiniz .

Değişkenler Yapılandırma → Yazılım Yapılandırması altındadır:

Çevre Özellikleri

Onema'nın cevabındaki.ebextensions gibi değişkenler oluşturmak hala işe yarıyor.

Hatta daha sonra başka bir ortama konuşlandıracaksanız ve bunları manuel olarak ayarlamayı unutmaktan korkuyorsanız veya değerleri kaynak kontrolüne kaydetmekte sorun yaşamıyorsanız tercih edilebilir. Ben ikisinin karışımını kullanıyorum.


2
Alternatif olarak, yapılandırmayı kaydedebilir ve yapılandırmayı kullanarak yeni ortamı başlatabilirsiniz.
Michael Gallego

1
Evet, bunun en iyi seçenek olduğunu söyleyebilirim. Sadece unutup duruyorum ve ister istemez yeni ortamlar başlatıyorum. :)
kireç

1
@dingdong: evet ve özellikle uygulamanızda bunlara erişebilirsiniz. Örneğin, Rails'te ENV["CUSTOM_ENV"]geri dönecekti "something-something".
kireç

3
Yeni mülkler eklersem veya bir mülk değerini değiştirirsem, bunlar hemen kullanılabilir mi, yeniden başlatılması gereken herhangi bir şey var mı? Kısa bir süre önce bir otomatik ölçeklendirme grubunun boyutunu değiştirdim ve AWS neredeyse 40 bulut sunucumuzun tamamını sonlandırdı ve 45 yenisini döndürdü. Mevcut bir ortama yeni bir mülk eklersem bunun olmasını istemiyorum. Herhangi bir fikir?
Engineer81

4
Son değişikliklere dikkat edin. Bu cevaba göre , çevre değişkenleri olarak aktarılmazlar. Yalnızca sistem özellikleri olarak aktarılır
James

107

Yalnızca 5 değer sınırlayıcıdır veya özel bir ortam değişkeni adına sahip olmak isteyebilirsiniz. Bunu yapılandırma dosyalarını kullanarak yapabilirsiniz. Projenizin kökünde adlı bir dizin oluşturun

.ebextensions /

Ardından, environment.config adlı bir dosya oluşturun (bu dosya herhangi bir şey olarak adlandırılabilir ancak .config uzantısına sahip olmalıdır) ve aşağıdaki değerleri ekleyin

option_settings:
  - option_name: CUSTOM_ENV
    value: staging

Uygulamanızı dağıttıktan sonra bu yeni değeri Ortam Ayrıntıları -> Yapılandırmayı Düzenle -> Kapsayıcı altında göreceksiniz.

daha fazla bilgi için buradaki belgelere bakın: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-options

Güncelleme

API anahtarları, sırlar vb. Gibi depo değerlerinizi kaydetmeyi önlemek için bir yer tutucu değeri koyabilirsiniz.

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

Daha sonra AWS yönetici paneline (Ortam Ayrıntıları -> Yapılandırmayı Düzenle -> Kapsayıcı) gidebilir ve burada değerleri güncelleyebilirsiniz. Tecrübelerime göre, bu değerler sonraki konuşlandırmalardan sonra değişmez.

Güncelleme 2 @Benjamin'in yorumunda belirttiği gibi, yeni görünüm ve his 18 Temmuz 2013'te kullanıma sunulduğundan, herhangi bir sayıda ortam değişkenini doğrudan konsoldan tanımlamak mümkündür:

Configuration > Software Configuration > Environment Properties


2
@Onema - Yapılandırma dosyasına yeni anahtarlar eklemeyle nasıl başa çıkıyorsunuz? Güncellenen dosyayı itmek, önceden ayarlanmış tüm anahtarları yer tutucu değerlerle günceller mi?
Tabrez

1
@Tabrez, önceden ayarlanmış anahtarlar değerlerini koruyacaktır.
Anarchtica

2
Üzgünüm @Tabrez, bunu daha önce inceleme şansım olmadı. Anarchtica yanıtına eklemek için bazı testler yaptım ve bir yer tutucu kullanırsanız ve ardından gerçek anahtarları kullanarak AWS Konsolundaki değerleri güncellerseniz ve ardından yapılandırma dosyasında yer tutucu değerlerini güncellerseniz ve iterseniz anahtarların olmayacağını öğrendim. yeni yer tutucuyla değiştirilir. Bunu biraz garip buluyorum, ancak konsoldaki tüm env değerlerini yönetmeye zorlanacağınız için bunun hoş bir davranış olduğunu düşünüyorum.
Onema 01

7
@Anarchtica, AWS desteğine bu davranışı sordum. Konsoldaki değerleri güncellediğinizde, öncelik alacaklarını ve yapılandırma dosyalarını kullanarak bunları değiştiremeyeceğinizi söylediler. Konsoldaki değerleri asla değiştirmezseniz, yapılandırma dosyasında yapılan herhangi bir değişiklik güncellenecektir.
Onema

1
Container_commands için yapılandırma dosyanızdaki ortam değişkenlerini nasıl kullanacağınızı bilen var mı? Denedimcommand: "nrsysmond-config --set license_key={$NR_INSTALL_KEY}"
colllin

29

2016 Java8 Tomcat8 AMI'de ElasticBeanstalk, web yapılandırmasından ortam değişkenlerini ayarlayamıyor. Bunun yerine gerçekten jvm -D özelliklerini ayarlıyorlar.

- "Aşağıdaki özellikler uygulamaya ortam değişkenleri olarak aktarılır. Daha fazla bilgi edinin."

Bu ifade, Java Tomcat ami için yanlıştır. Amazon mu değil ortam değişkenleri olarak bu ayarlayın. Komut satırında Tomcat'e jvm için -D özelliği olarak aktarılan Sistem özellikleri olarak ayarlanırlar. Java'da ortam değişkenlerini alma yöntemi, bir özellik almak için aynı değildir. System.getenv vs System.getProperty

Kutunun içine ssh'dedim ve ortam değişkeninin asla ayarlanmadığını doğruladım. Ancak tomcat günlüklerinde -D özelliğinin ayarlandığını görebiliyorum.

Çözüm olarak şimdi her iki konumu da kontrol etmek için kodumu değiştirdim.


Ve .Net için, stackoverflow.com/a/33465765/1991614 uyarınca ortam değişkenlerine yerleştirmek yerine web.config dosyanıza eklenirler . Daha da kafa karıştırıcı olan konu, bu anahtar web.confg'de zaten mevcutsa
eklenmemiş olmalarıdır

Kahramanımsın! Tomcat 8'deki -D mülk eşlemesini fark ettiğiniz için teşekkür ederiz.
shadowhorst

1
Benim gibi sistem ortam değişkenlerini gerçekten ayarlamaya ihtiyaç duyanlar için, bu ortam özelliklerini yerleşik bir beanstalk betiği kullanarak alabilirsiniz. Daha fazla bilgi için bu yanıta bakın: serverfault.com/a/770736/292741
BoomShadow

1
Amazon Linux 2017.03 v2.5.4 with Java8ayrıca env ayarlamaz.
Sanoob

2
Kutuya SSH uygulayamaz ve değişkenleri göremezsiniz. Yalnızca uygulamanızı çalıştıran kabukta ayarlanırlar. 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. Değişkenleriniz gibi bir oturum açma komut dosyasında ayarlanmamıştır .bashrc. Ancak doğru, Tomcat değişkenleri özellik olarak aktarılır. (Bağlantılı sayfanın başına bakın.)
Chloe

18

AWS, ortam değişkenlerinizdeki CloudFormation şablon dizelerini yorumlayacaktır. Bunu uygulamanızdaki EB ortamınız hakkındaki bilgilere erişmek için kullanabilirsiniz:

AWS web arayüzünde, aşağıdakiler ortamınızın adı olarak değerlendirilecektir (geri tik işaretlerine dikkat edin):

`{ "Ref" : "AWSEBEnvironmentName" }`

Veya .ebextensions/*.configCloudFormation şablonunu kullanabilir ve arka tiklere (`) sarabilirsiniz:

{
  "option_settings": [
    {
      "namespace": "aws:elasticbeanstalk:application:environment",
      "option_name": "ENVIRONMENT_NAME",
      "value": "`{ \"Ref\" : \"AWSEBEnvironmentName\" }`"
    }
  ]
}

3
Belirsiz, ama tam aradığım şey.
Eric Walker

1
Bunun için belge var mı? Onu bulamıyorum.
yangmillstheory


12

Alternatif olarak, ortam değişkenlerini ayarlamak için Elastic Beanstalk CLI'yi kullanabilirsiniz.

Bir ortam değişkeni ayarlamak için: eb setenv FOO=bar

Ortam değişkenlerini görüntülemek için: eb printenv


9

Ortam Ayrıntıları -> Yapılandırmayı Düzenle -> Kapsayıcı

görüntü açıklamasını buraya girin


5

Bu, beanstalk'ta dinamik değerlere sahip ENV'leri ayarlamanın tek yolu gibi görünüyor. Çoklu kapı görevlisi kurulumum için çalışan bir geçici çözüm buldum:

1) ECS deponuza derlemeden + yüklemeden önce bunu Dockerfile'ınıza ekleyin:

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

2) Dockerrun.aws.json dosyanızda bir birim oluşturun:

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

3) Hacmi kabınıza monte edin

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

4) .ebextensions / options.config dosyanıza şöyle bir container_commands bloğu ekleyin:

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 ve ENVS'niz docker konteynerinizde mevcut olmalıdır

Aşağıdakiler gibi daha fazla container_command ekleyerek daha fazla ENV ekleyebilirsiniz:

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

Bu yardımcı olur umarım!


Cankurtaran. Dinamik ortam değişkenleriniz varsa, örneğin X: '{"Ref": "MyCache"} 'değeri, {"Ref": "MyCache"}konteyner ona erişmeye çalıştığında varsayılan olarak çözümlenmez (değer yalnızca ' '). Bununla bunun gibi dinamik değişkenlere sahip olabilirsiniz.
Petter Kjelkenes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.