Bagaimana Anda meneruskan variabel lingkungan kustom di Amazon Elastic Beanstalk (AWS EBS)?

121

Uraian singkat Amazon Elastic Beanstalk mengatakan:

Elastic Beanstalk memungkinkan Anda "membuka kap" dan mempertahankan kendali penuh ... bahkan meneruskan variabel lingkungan melalui konsol Elastic Beanstalk.

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

Bagaimana cara melewatkan variabel lingkungan lain selain yang ada di konfigurasi Elastic Beanstalk?

Ben
sumber
4
Anda mungkin ingin mempertimbangkan untuk mengubah jawaban yang diterima untuk ini
philipp

Jawaban:

136

Untuk mengingatkan siapa pun yang menggunakan .ebextensions/*.configcara: saat ini Anda dapat menambahkan, mengedit, dan menghapus variabel lingkungan di antarmuka web Elastic Beanstalk.

Variabel berada di bawah Konfigurasi → Konfigurasi Perangkat Lunak:

Properti Lingkungan

Membuat vars .ebextensionsseperti dalam jawaban Onema masih berfungsi.

Ini bahkan lebih disukai, misalnya jika Anda akan menerapkan ke lingkungan lain nanti dan takut lupa untuk mengaturnya secara manual, atau jika Anda tidak masalah dengan memasukkan nilai ke kontrol sumber. Saya menggunakan campuran keduanya.

jeruk nipis
sumber
2
Alternatifnya, Anda juga dapat menyimpan konfigurasi, dan meluncurkan lingkungan baru menggunakan konfigurasi.
Michael Gallego
1
Ya, menurut saya itu pilihan terbaik. Saya terus saja melupakannya dan meluncurkan lingkungan baru mau tidak mau. :)
kapur
1
@dingdong: ya, dan khususnya Anda dapat mengaksesnya di aplikasi Anda. Misalnya di Rails ENV["CUSTOM_ENV"]akan kembali "something-something".
jeruk nipis
3
Jika saya menambahkan properti baru, atau mengubah nilai properti, apakah segera tersedia, apakah memerlukan sesuatu untuk direstart, dll? Saya baru-baru ini mengubah ukuran grup penskalaan otomatis dan AWS menghentikan hampir semua 40 instans kami dan menghasilkan 45 instans baru. Saya tidak ingin itu terjadi jika saya menambahkan properti baru ke lingkungan yang ada. Ada ide?
Engineer81
4
Waspadai perubahan terbaru. Sesuai jawaban ini , mereka tidak diteruskan sebagai variabel lingkungan. Mereka hanya disahkan sebagai properti sistem
James
107

Hanya 5 nilai yang membatasi, atau Anda mungkin ingin memiliki nama variabel lingkungan khusus. Anda dapat melakukannya dengan menggunakan file konfigurasi. Buat direktori di root proyek Anda dengan nama

.ebextensions /

Kemudian buat file bernama environment.config (file ini bisa disebut apa saja tetapi harus memiliki ekstensi .config) dan tambahkan nilai berikut

option_settings:
  - option_name: CUSTOM_ENV
    value: staging

Setelah Anda menerapkan aplikasi, Anda akan melihat nilai baru ini di bawah Detail Lingkungan -> Edit Konfigurasi -> Penampung

untuk informasi lebih lanjut, periksa dokumentasi di sini: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-options

Memperbarui

Untuk mencegah komitmen ke nilai repositori Anda seperti kunci API, rahasia, dan sebagainya, Anda dapat meletakkan nilai placeholder.

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

Nanti Anda dapat membuka panel admin AWS (Detail Lingkungan -> Edit Konfigurasi -> Penampung) dan memperbarui nilainya di sana. Menurut pengalaman saya, nilai-nilai ini tidak berubah setelah penerapan berikutnya.

Perbarui 2 Seperti yang dikatakan @Benjamin dalam komentarnya, sejak tampilan dan nuansa baru diluncurkan pada 18 Juli 2013, dimungkinkan untuk menentukan sejumlah variabel lingkungan langsung dari konsol:

Configuration > Software Configuration > Environment Properties

Onema
sumber
2
@Onema - Bagaimana Anda menangani penambahan kunci baru ke file konfigurasi? Akankah mendorong file yang diperbarui memperbarui semua kunci yang ditetapkan sebelumnya dengan nilai placeholder?
Tabrez
1
@Tabrez, kunci yang disetel sebelumnya akan mempertahankan nilainya.
Anarchtica
2
Maaf @Tabrez, saya tidak memiliki kesempatan untuk menyelidiki ini sebelumnya. Untuk menambah jawaban Anarchtica, saya menjalankan beberapa tes dan menemukan bahwa jika Anda menggunakan placeholder, lalu memperbarui nilai di Konsol AWS menggunakan kunci nyata dan kemudian Anda memperbarui nilai placeholder Anda di file konfigurasi dan mendorong, kunci tidak akan diganti dengan placeholder baru. Saya merasa ini agak aneh, tetapi menurut saya ini adalah perilaku yang disambut baik karena Anda akan dipaksa untuk mengelola semua nilai env di konsol.
Onema
7
@Anarchtica, saya menanyakan tentang perilaku ini ke dukungan AWS. Mereka mengatakan bahwa setelah Anda memperbarui nilai di konsol, nilai tersebut akan diutamakan dan Anda tidak akan dapat mengubahnya menggunakan file konfigurasi sama sekali. Jika Anda tidak pernah mengubah nilai di konsol, setiap perubahan yang dibuat di file konfigurasi akan diperbarui.
Onema
1
Adakah yang tahu cara menggunakan variabel lingkungan di dalam file konfigurasi Anda untuk container_commands? Saya sudah mencobacommand: "nrsysmond-config --set license_key={$NR_INSTALL_KEY}"
colllin
29

Di AMI Java8 Tomcat8 2016, ElasticBeanstalk gagal menyetel variabel lingkungan dari konfigurasi web. Mereka sebenarnya menyetel properti jvm -D sebagai gantinya.

- "Properti berikut diteruskan ke aplikasi sebagai variabel lingkungan. Pelajari lebih lanjut."

Pernyataan ini tidak benar untuk Java Tomcat ami. Amazon tidak menetapkan ini sebagai variabel lingkungan. Mereka ditetapkan sebagai properti Sistem yang diteruskan pada baris perintah ke Tomcat sebagai properti -D untuk jvm. Metode di Java untuk mendapatkan variabel lingkungan tidak sama untuk mendapatkan properti. System.getenv vs System.getProperty

Saya ssh ke dalam kotak dan memverifikasi bahwa variabel lingkungan tidak pernah disetel. Namun, di log tomcat saya bisa melihat properti -D disetel.

Saya telah mengubah kode saya untuk memeriksa kedua lokasi sekarang sebagai solusi.

Ed J
sumber
Dan untuk .Net, mereka dimasukkan ke file web.config Anda daripada dimasukkan ke dalam lingkungan vars, sesuai stackoverflow.com/a/33465765/1991614 . Masalah yang lebih membingungkan adalah bahwa mereka tidak dimasukkan jika kunci itu sudah ada di web.confg :(
bitcoder
Kamu adalah pahlawanku! Terima kasih telah memperhatikan pemetaan properti -D di Tomcat 8.
shadowhorst
1
Bagi mereka yang seperti saya yang benar - benar perlu menyetel variabel lingkungan sistem, Anda dapat mengambil properti lingkungan tersebut menggunakan skrip beanstalk bawaan. Lihat jawaban ini untuk info lebih lanjut: serverfault.com/a/770736/292741
BoomShadow
1
Amazon Linux 2017.03 v2.5.4 with Java8juga tidak menyetel env.
Sanoob
2
Anda tidak dapat memasukkan SSH ke dalam kotak dan melihat variabelnya. Mereka hanya disetel di shell yang menjalankan aplikasi Anda. 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. Variabel Anda tidak disetel seperti skrip login .bashrc. Bagaimanapun Anda benar, variabel Tomcat diteruskan sebagai properti. (Lihat bagian atas halaman tertaut.)
Chloe
18

AWS akan menafsirkan string template CloudFormation di variabel lingkungan Anda. Anda dapat menggunakan ini untuk mengakses informasi tentang lingkungan EB Anda di dalam aplikasi Anda:

Di antarmuka web AWS, hal berikut ini akan dievaluasi sebagai nama lingkungan Anda (perhatikan tanda centang di bagian belakang):

`{ "Ref" : "AWSEBEnvironmentName" }`

Atau, Anda dapat menggunakan .ebextensions/*.configdan membungkus template CloudFormation dengan tanda centang (`):

{
  "option_settings": [
    {
      "namespace": "aws:elasticbeanstalk:application:environment",
      "option_name": "ENVIRONMENT_NAME",
      "value": "`{ \"Ref\" : \"AWSEBEnvironmentName\" }`"
    }
  ]
}
George Brassey
sumber
3
Tidak jelas, tapi hanya apa yang saya cari.
Eric Walker
1
Apakah ada dokumentasi untuk ini? Sepertinya saya tidak dapat menemukannya.
yangmillstheory
@yangmillstheory docs.aws.amazon.com/elasticbeanstalk/latest/dg/…
mike mckechnie
12

Alternatifnya, Anda dapat menggunakan CLI Elastic Beanstalk untuk menyetel variabel lingkungan.

Untuk menyetel variabel lingkungan: eb setenv FOO=bar

Untuk melihat variabel lingkungan: eb printenv

trex
sumber
9

Detail Lingkungan -> Edit Konfigurasi -> Penampung

masukkan deskripsi gambar di sini

Ben
sumber
5

Ini tampaknya menjadi satu-satunya cara untuk mengatur ENV dengan nilai dinamis di pohon kacang. Saya menemukan solusi yang berfungsi untuk pengaturan multi-buruh pelabuhan saya:

1) Tambahkan ini ke Dockerfile Anda sebelum membangun + mengunggah ke repositori ECS Anda:

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

2) Di file Dockerrun.aws.json Anda, buat volume:

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

3) Pasang volume ke wadah Anda

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

4) Di file .ebextensions / options.config Anda, tambahkan blok container_commands seperti ini:

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 dan ENVS Anda harus tersedia di container docker Anda

Anda dapat menambahkan lebih banyak ENV dengan menambahkan lebih banyak container_commands seperti:

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

Semoga ini membantu!

dsorensen
sumber
Penyelamat. Jika Anda memiliki variabel lingkungan dinamis, misalnya X: '{"Ref": "MyCache"}, 'nilai tidak diuraikan (hanya nilainya ' {"Ref": "MyCache"}') secara default saat penampung mencoba mengaksesnya. Dengan ini, Anda dapat memiliki variabel dinamis seperti itu.
Petter Kjelkenes