คุณส่งผ่านตัวแปรสภาพแวดล้อมที่กำหนดเองบน 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

ตัวแปรอยู่ภายใต้การกำหนดค่า→การกำหนดค่าซอฟต์แวร์:

คุณสมบัติของสภาพแวดล้อม

การสร้าง vars ใน.ebextensionslike ในคำตอบของ Onemaยังคงใช้งานได้

สามารถทำได้ดีกว่าเช่นหากคุณจะปรับใช้กับสภาพแวดล้อมอื่นในภายหลังและกลัวว่าจะลืมตั้งค่าด้วยตนเองหรือหากคุณพอใจที่จะกำหนดค่าให้กับการควบคุมแหล่งที่มา ฉันใช้ทั้งสองอย่างผสมกัน


2
หรือคุณยังสามารถบันทึกการกำหนดค่าและเรียกใช้สภาพแวดล้อมใหม่โดยใช้การกำหนดค่า
Michael Gallego

1
ใช่ฉันจะบอกว่านั่นเป็นตัวเลือกที่ดีที่สุด ฉันแค่ลืมมันไปเรื่อย ๆ และเปิดตัวสภาพแวดล้อมใหม่โดยเต็มใจ :)
มะนาว

1
@dingdong: ใช่และโดยเฉพาะอย่างยิ่งคุณสามารถเข้าถึงได้ในแอปพลิเคชันของคุณ เช่นในทางรถไฟจะกลับมาENV["CUSTOM_ENV"] "something-something"
มะนาว

3
หากฉันเพิ่มคุณสมบัติใหม่หรือเปลี่ยนค่าคุณสมบัติคุณสมบัติเหล่านี้จะพร้อมใช้งานทันทีหรือไม่จำเป็นต้องเริ่มต้นใหม่หรือไม่ ฉันเพิ่งเปลี่ยนขนาดของกลุ่มการปรับขนาดอัตโนมัติและ AWS ได้ยุติอินสแตนซ์เกือบทั้งหมด 40 อินสแตนซ์ของเราและเพิ่มขึ้น 45 อินสแตนซ์ใหม่ ฉันไม่ต้องการให้สิ่งนั้นเกิดขึ้นถ้าฉันเพิ่มคุณสมบัติใหม่ในสภาพแวดล้อมที่มีอยู่ ความคิดใด ๆ ?
Engineer81

4
ระวังการเปลี่ยนแปลงล่าสุด ตามคำตอบนี้จะไม่ถูกส่งผ่านเป็นตัวแปรสภาพแวดล้อม พวกเขาจะถูกส่งผ่านเป็นคุณสมบัติของระบบเท่านั้น
James

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 - คุณจะจัดการกับการเพิ่มคีย์ใหม่ให้กับไฟล์ config ได้อย่างไร? การพุชไฟล์ที่อัปเดตจะอัปเดตคีย์ที่ตั้งไว้ก่อนหน้านี้ทั้งหมดด้วยค่าตัวยึดหรือไม่
Tabrez

1
@Tabrez คีย์ที่ตั้งไว้ก่อนหน้านี้จะยังคงรักษาค่าไว้
Anarchtica

2
ขอโทษ @ ทาเบรซฉันไม่ได้มีโอกาสดูเรื่องนี้มาก่อน เพื่อเพิ่มคำตอบ Anarchtica ฉันได้ทำการทดสอบและพบว่าหากคุณใช้ตัวยึดตำแหน่งแล้วอัปเดตค่าใน AWS Console โดยใช้คีย์จริงจากนั้นคุณอัปเดตค่าตัวยึดตำแหน่งในไฟล์กำหนดค่าและกดคีย์จะไม่เป็น แทนที่ด้วยตัวยึดตำแหน่งใหม่ ฉันคิดว่าสิ่งนี้ค่อนข้างแปลก แต่ฉันคิดว่ามันเป็นพฤติกรรมที่น่ายินดีเนื่องจากคุณจะต้องจัดการค่า env ทั้งหมดในคอนโซล
Onema

7
@Anarchtica ฉันถามเกี่ยวกับพฤติกรรมนี้กับฝ่ายสนับสนุนของ AWS พวกเขากล่าวว่าเมื่อคุณอัปเดตค่าในคอนโซลแล้วค่านั้นจะมีความสำคัญกว่าและคุณจะไม่สามารถแก้ไขโดยใช้ไฟล์กำหนดค่าได้เลย หากคุณไม่เคยแก้ไขค่าในคอนโซลการเปลี่ยนแปลงใด ๆ ที่ทำในไฟล์กำหนดค่าจะได้รับการอัปเดต
Onema

1
ไม่มีใครรู้วิธีใช้ตัวแปรสภาพแวดล้อมภายในไฟล์ config ของคุณสำหรับ container_commands? ฉันได้ลองแล้วcommand: "nrsysmond-config --set license_key={$NR_INSTALL_KEY}"
colllin

29

ใน 2016 Java8 Tomcat8 AMI ElasticBeanstalk ไม่สามารถตั้งค่าตัวแปรสภาพแวดล้อมจากการกำหนดค่าเว็บ พวกเขากำลังตั้งค่าคุณสมบัติ jvm -D แทน

- "คุณสมบัติต่อไปนี้ถูกส่งไปยังแอปพลิเคชันเป็นตัวแปรสภาพแวดล้อมเรียนรู้เพิ่มเติม"

คำสั่งนี้ไม่ถูกต้องสำหรับ Java Tomcat ami Amazon ไม่ได้ตั้งค่าสิ่งเหล่านี้เป็นตัวแปรสภาพแวดล้อม พวกเขาถูกตั้งค่าเป็นคุณสมบัติของระบบที่ส่งผ่านบนบรรทัดรับคำสั่งไปยัง Tomcat เป็นคุณสมบัติ -D สำหรับ jvm วิธีการใน Java เพื่อรับตัวแปรสภาพแวดล้อมไม่เหมือนกันสำหรับการรับคุณสมบัติ System.getenv กับ System.getProperty

ฉันเข้าไปในช่องและตรวจสอบว่าไม่เคยตั้งค่าตัวแปรสภาพแวดล้อม อย่างไรก็ตามในบันทึก 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 จะถูกส่งผ่านเป็นคุณสมบัติ (ดูด้านบนของหน้าที่เชื่อมโยง)
Chloe

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
ปิดบัง แต่สิ่งที่ฉันกำลังมองหา
Eric Walker

1
มีเอกสารสำหรับเรื่องนี้หรือไม่? ดูเหมือนจะหาไม่เจอ
yangmillstheory


12

หรือคุณสามารถใช้ Elastic Beanstalk CLI เพื่อตั้งค่าตัวแปรสภาพแวดล้อม

ในการตั้งค่าตัวแปรสภาพแวดล้อม: eb setenv FOO=bar

ในการดูตัวแปรสภาพแวดล้อม: eb printenv



5

นี่เป็นวิธีเดียวในการตั้งค่า ENV ด้วยค่าไดนามิกในต้นถั่ว ฉันคิดวิธีแก้ปัญหาที่ใช้ได้กับการตั้งค่า multi-docker ของฉัน:

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 และ ENVS ของคุณควรมีอยู่ในคอนเทนเนอร์นักเทียบท่าของคุณ

คุณสามารถเพิ่ม ENV ได้โดยการเพิ่ม container_commands เช่น:

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

หวังว่านี่จะช่วยได้!


ผู้ช่วยชีวิต หากคุณมีตัวแปรสภาพแวดล้อมแบบไดนามิกเช่นค่าX: '{"Ref": "MyCache"} 'จะไม่ถูกแยกวิเคราะห์ (ค่าเป็นเท่านั้น ' {"Ref": "MyCache"}') ตามค่าเริ่มต้นเมื่อคอนเทนเนอร์พยายามเข้าถึง ด้วยสิ่งนี้คุณสามารถมีตัวแปรแบบไดนามิกเช่นนั้นได้
Petter Kjelkenes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.