Làm cách nào để bạn chuyển biến môi trường tùy chỉnh trên Amazon Elastic Beanstalk (AWS EBS)?


121

Amazon Elastic Beanstalk blurb nói:

Elastic Beanstalk cho phép bạn "mở mui" và giữ toàn quyền kiểm soát ... thậm chí chuyển các biến môi trường thông qua bảng điều khiển Elastic Beanstalk.

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

Làm thế nào để chuyển các biến môi trường khác ngoài biến môi trường trong cấu hình Elastic Beanstalk?


4
bạn có thể muốn xem xét để thay đổi câu trả lời được chấp nhận về vấn đề này
Philipp

Câu trả lời:


136

Lưu ý đến bất kỳ ai sử dụng .ebextensions/*.configcách này: ngày nay bạn có thể thêm, chỉnh sửa và xóa các biến môi trường trong giao diện web Elastic Beanstalk.

Các biến nằm trong Cấu hình → Cấu hình phần mềm:

Thuộc tính môi trường

Tạo các vars .ebextensionsgiống như trong câu trả lời của Onema vẫn hoạt động.

Nó thậm chí có thể tốt hơn, ví dụ: nếu bạn sẽ triển khai sang môi trường khác sau này và sợ quên thiết lập chúng theo cách thủ công hoặc nếu bạn đồng ý với việc cam kết các giá trị cho kiểm soát nguồn. Tôi sử dụng kết hợp cả hai.


2
Ngoài ra, bạn cũng có thể lưu cấu hình và khởi chạy môi trường mới bằng cách sử dụng cấu hình.
Michael Gallego

1
Đúng, tôi muốn nói đó là lựa chọn tốt nhất. Tôi chỉ tiếp tục quên nó và khởi chạy môi trường mới hoàn toàn không. :)
vôi

1
@dingdong: vâng, và đặc biệt là bạn có thể truy cập chúng trong ứng dụng của mình. Ví dụ: trong Rails ENV["CUSTOM_ENV"]sẽ trở lại "something-something".
vôi

3
Nếu tôi thêm thuộc tính mới hoặc thay đổi giá trị thuộc tính, chúng có sẵn ngay lập tức không, chúng có yêu cầu khởi động lại bất cứ thứ gì không, v.v.? Gần đây, tôi đã thay đổi kích thước của một nhóm tự động chia tỷ lệ và AWS đã chấm dứt gần 40 phiên bản của chúng tôi và tạo ra 45 phiên bản mới. Tôi không muốn điều đó xảy ra nếu tôi thêm thuộc tính mới vào môi trường hiện có. Có ý kiến ​​gì không?
Engineer81

4
Hãy cẩn thận với những thay đổi gần đây. Theo câu trả lời này , chúng không được chuyển dưới dạng biến môi trường. Chúng chỉ được chuyển dưới dạng thuộc tính hệ thống
James

107

Chỉ có 5 giá trị là giới hạn hoặc bạn có thể muốn có một tên biến môi trường tùy chỉnh. Bạn có thể làm điều này bằng cách sử dụng các tệp cấu hình. Tạo một thư mục ở gốc của dự án của bạn có tên

.ebextensions /

Sau đó, tạo một tệp có tên là environment.config (tệp này có thể được gọi là bất kỳ thứ gì nhưng nó phải có phần mở rộng .config) và thêm các giá trị sau

option_settings:
  - option_name: CUSTOM_ENV
    value: staging

Sau khi triển khai ứng dụng của mình, bạn sẽ thấy giá trị mới này trong Chi tiết môi trường -> Chỉnh sửa cấu hình -> Vùng chứa

để biết thêm thông tin, hãy kiểm tra tài liệu tại đây: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-options

Cập nhật

Để ngăn việc cam kết các giá trị kho lưu trữ của bạn như khóa API, bí mật, v.v., bạn có thể đặt giá trị giữ chỗ.

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

Sau đó, bạn có thể chuyển đến bảng quản trị AWS (Chi tiết môi trường -> Chỉnh sửa cấu hình -> Vùng chứa) và cập nhật các giá trị ở đó. Theo kinh nghiệm của tôi, các giá trị này không thay đổi sau các lần triển khai tiếp theo.

Cập nhật 2 Như @Benjamin đã nêu trong nhận xét của mình, kể từ khi giao diện mới được triển khai vào ngày 18 tháng 7 năm 2013, có thể xác định bất kỳ số lượng biến môi trường nào trực tiếp từ bảng điều khiển:

Configuration > Software Configuration > Environment Properties


2
@Onema - Bạn xử lý như thế nào khi thêm khóa mới vào tệp cấu hình? Việc đẩy tệp đã cập nhật có cập nhật tất cả các khóa đã đặt trước đó với các giá trị giữ chỗ không?
Tabrez

1
@Tabrez, mọi khóa đã đặt trước đó sẽ giữ nguyên giá trị của chúng.
Anarchtica

2
Xin lỗi @Tabrez, tôi chưa có cơ hội xem xét vấn đề này trước đây. Để thêm vào câu trả lời Anarchtica, tôi đã chạy một số thử nghiệm và phát hiện ra rằng nếu bạn sử dụng trình giữ chỗ và sau đó cập nhật các giá trị trong Bảng điều khiển AWS bằng các khóa thực và sau đó bạn cập nhật giá trị trình giữ chỗ trong tệp cấu hình và đẩy, các khóa sẽ không được được thay thế bằng trình giữ chỗ mới. Tôi thấy điều này hơi lạ, nhưng tôi nghĩ đó là một hành vi đáng hoan nghênh vì bạn sẽ buộc phải quản lý tất cả các giá trị env trong bảng điều khiển.
Onema

7
@Anarchtica, tôi đã hỏi về hành vi này với bộ phận hỗ trợ AWS. Họ nói rằng khi bạn cập nhật các giá trị trong bảng điều khiển, chúng sẽ được ưu tiên và bạn sẽ không thể sửa đổi chúng bằng cách sử dụng tệp cấu hình. Nếu bạn không bao giờ thay đổi các giá trị trong bảng điều khiển, bất kỳ thay đổi nào được thực hiện trong tệp cấu hình sẽ được cập nhật.
Onema

1
Có ai biết cách sử dụng các biến môi trường bên trong tệp cấu hình của bạn cho container_commands không? Tôi đã thửcommand: "nrsysmond-config --set license_key={$NR_INSTALL_KEY}"
colllin

29

Trong Java8 Tomcat8 AMI 2016, ElasticBeanstalk không đặt được các biến môi trường từ cấu hình web. Thay vào đó, họ thực sự thiết lập thuộc tính jvm -D.

- "Các thuộc tính sau được chuyển vào ứng dụng dưới dạng các biến môi trường. Tìm hiểu thêm."

Câu lệnh này không chính xác đối với Java Tomcat ami. Amazon không đặt chúng làm biến môi trường. Chúng được đặt làm thuộc tính Hệ thống được truyền trên dòng lệnh tới Tomcat dưới dạng thuộc tính -D cho jvm. Phương thức trong Java để lấy các biến môi trường không giống với phương thức lấy một thuộc tính. System.getenv so với System.getProperty

Tôi đã vào hộp và xác minh rằng biến môi trường chưa bao giờ được đặt. Tuy nhiên, trong nhật ký tomcat, tôi có thể thấy thuộc tính -D được thiết lập.

Tôi đã thay đổi mã của mình để kiểm tra cả hai vị trí ngay bây giờ như một giải pháp.


Và đối với .Net, chúng được chèn vào tệp web.config của bạn thay vì được đưa vào môi trường vars, theo stackoverflow.com/a/33465765/1991614 . Hơn nữa khó hiểu vấn đề là họ không được chèn nếu quan trọng mà đã tồn tại trong web.confg :(
bitcoder

Bạn là người hùng của tôi! Cảm ơn bạn đã nhận thấy việc lập bản đồ tài sản -D trong Tomcat 8.
shadowhorst

1
Đối với những người như tôi thực sự cần thiết lập các biến môi trường hệ thống, bạn có thể truy xuất các thuộc tính môi trường đó bằng cách sử dụng tập lệnh cây đậu có sẵn. Xem câu trả lời này để biết thêm thông tin: serverfault.com/a/770736/292741
BoomShadow

1
Amazon Linux 2017.03 v2.5.4 with Java8cũng không đặt env.
Sanoob 22/09/17

2
Bạn không thể SSH vào hộp và xem các biến. Chúng chỉ được đặt trong shell đã chạy ứng dụng của bạn. 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. Các biến của bạn không được đặt trong một tập lệnh đăng nhập như .bashrc. Tuy nhiên bạn nói đúng, các biến Tomcat được chuyển dưới dạng thuộc tính. (Xem đầu trang được liên kết.)
Chloe

18

AWS sẽ diễn giải các chuỗi mẫu CloudFormation trong các biến môi trường của bạn. Bạn có thể sử dụng điều này để truy cập thông tin về môi trường EB bên trong ứng dụng của mình:

Trong giao diện web AWS, phần sau sẽ được đánh giá là tên môi trường của bạn (lưu ý dấu tích phía sau):

`{ "Ref" : "AWSEBEnvironmentName" }`

Hoặc, bạn có thể sử dụng .ebextensions/*.configvà bọc mẫu CloudFormation trong dấu tích (`):

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

3
Ít người biết đến, nhưng chỉ là những gì tôi đang tìm kiếm.
Eric Walker

1
Có tài liệu cho việc này không? Tôi dường như không thể tìm thấy nó.
yangmillstheory


12

Ngoài ra, bạn có thể sử dụng Elastic Beanstalk CLI để đặt các biến môi trường.

Để đặt một biến môi trường: eb setenv FOO=bar

Để xem các biến môi trường: eb printenv


9

Chi tiết môi trường -> Chỉnh sửa cấu hình -> Vùng chứa

nhập mô tả hình ảnh ở đây


5

Đây dường như là cách duy nhất để đặt các ENV với các giá trị động trong cây đậu. Tôi đã nghĩ ra một cách giải quyết phù hợp với thiết lập multi-docker của mình:

1) Thêm cái này vào Dockerfile của bạn trước khi xây dựng + tải lên kho lưu trữ ECS của bạn:

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

2) Trong tệp Dockerrun.aws.json của bạn, hãy tạo một ổ đĩa:

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

3) Gắn khối lượng vào thùng chứa của bạn

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

4) Trong tệp .ebextensions / options.config của bạn, hãy thêm một khối container_commands như sau:

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) triển khai eb và ENVS của bạn sẽ có sẵn trong bộ chứa docker của bạn

Bạn có thể thêm nhiều ENV hơn bằng cách thêm nhiều container_command như:

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

Hi vọng điêu nay co ich!


Cứu sinh. Nếu bạn có các biến môi trường động, ví dụ X: ': 'giá trị {"Ref": "MyCache"} không được phân tích cú pháp (giá trị chỉ là ' {"Ref": "MyCache"}') theo mặc định khi vùng chứa cố gắng truy cập nó. Với điều này, bạn có thể có các biến động như vậy.
Petter Kjelkenes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.