5

Chúng tôi đang cố gắng lưu trữ các tệp cấu hình ứng dụng dành riêng cho môi trường trong s3. Các tệp được lưu trữ trong các thư mục con khác nhau được đặt tên theo môi trường và cũng có môi trường như là một phần của tên tệp.AWS Elastic Beanstalk: Làm thế nào để sử dụng các biến môi trường trong ebextensions?

Ví dụ như

dev/application-dev.properties 
stg/application-stg.properties 
prd/application-prd.properties 

Các môi trường đàn hồi cây đậu được đặt tên dev, stg, prd và cách khác Tôi cũng có một biến môi trường quy định tại Elastic Beanstalk tên MÔI TRƯỜNG mà có thể dev, stg hoặc prd .

Câu hỏi của tôi bây giờ là, làm cách nào để tham chiếu tên môi trường hoặc biến MÔI TRƯỜNG khi tải xuống tệp cấu hình từ tệp cấu hình trong .ebextensions?

Tôi đã thử sử dụng tham chiếu {"Ref": "AWSEBEnvironmentName" } trong .ebextensions/myapp.config nhưng gặp lỗi cú pháp khi triển khai.

Nội dung của .ebextensions/myapp.config là:

files: 
    /config/application-`{"Ref": "AWSEBEnvironmentName" }`.properties: 
    mode: "000666" 
    owner: webapp 
    group: webapp 
    source: https://s3.amazonaws.com/com.mycompany.mybucket/`{"Ref": "AWSEBEnvironmentName" }`/application-`{"Ref": "AWSEBEnvironmentName" }`.properties 
    authentication: S3Access 

Resources: 
    AWSEBAutoScalingGroup: 
    Metadata: 
     AWS::CloudFormation::Authentication: 
     S3Access: 
      type: S3 
      roleName: aws-elasticbeanstalk-ec2-role 
      buckets: com.mycompany.api.config 

Các lỗi tôi nhận được là:

The configuration file .ebextensions/myapp.config in application version 
manualtest-18 contains invalid YAML or JSON. YAML exception: Invalid Yaml: 
mapping values are not allowed here in "<reader>", line 6, column 85: 
... .config/stg/application-`{"Ref": "AWSEBEnvironmentName" }`.prop ...^, 
JSON exception: Invalid JSON: Unexpected character (f) at position 0.. 
Update the configuration file. 

cách đúng đắn về tham khảo một biến môi trường trong một .ebextensions cấu hình là gì tập tin trong AWS đàn hồi Beanstalk?

Trả lời

4

Tôi đấu tranh để làm việc này, cho đến khi tôi phát hiện ra rằng chức năng Sub không xuất hiện để có mặt tại ebextensions: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/ebextensions-functions.html

Điều này có nghĩa là bạn cần phải quay trở lại Fn::JoinRef, ít nhất là cho đến khi hỗ trợ cho Sub được giới thiệu với ebextensions. Dường như thuộc tính tệp yêu cầu đường dẫn cố định (và tôi không thể sử dụng Fn::Join trong ngữ cảnh này).

giải pháp tổng thể của tôi cho điều này là như sau:

Resources: 
    AWSEBAutoScalingGroup: 
    Metadata: 
     AWS::CloudFormation::Authentication: 
     S3Auth: 
      type: S3 
      buckets: arn:aws:s3:::elasticbeanstalk-xxx 
      roleName: aws-elasticbeanstalk-ec2-role 

files: 
    "/tmp/application.properties" : 
    mode: "000644" 
    owner: root 
    group: root 
    source: { "Fn::Join" : ["", ["https://s3-xxx.amazonaws.com/elasticbeanstalk-xxx/path/to/application-", { "Ref" : "AWSEBEnvironmentName" }, ".properties" ]]} 
    authentication: S3Auth 

container_commands: 
    01-apply-configuration: 
    command: mkdir -p config && mv /tmp/application.properties config 

này sẽ dẫn đến một tập tin application.properties (mà không có tên môi trường vòng loại) trong một thư mục config bên cạnh dụ ứng dụng triển khai.

Nếu bạn muốn giữ tên môi trường như một phần của tên tệp bằng cách sử dụng phương pháp này, bạn sẽ cần phải điều chỉnh lệnh di chuyển tệp để sử dụng biểu thức Fn::Join khác để kiểm soát tên tệp.

1

Bạn sắp hoàn thành .bản họa đang sử dụng định dạng YAML, trong khi bạn đang cố gắng sử dụng JSON. Sử dụng Ref: AWSEBEnvironmentName. Ngoài ra, bạn có thể tận dụng Sub chức năng để tránh pesky Join:

!Sub "/config/application-${AWSEBEnvironmentName}.properties"

1

Tệp cấu hình .ebextensions của bạn gần như chính xác. Thay thế tên tệp bằng biến môi trường hoặc tên tài nguyên AWS sẽ không hoạt động, điều đó làm như trong câu trả lời của Mark để đổi tên tệp được tạo trong phần container_commands.

Các source tùy chọn giá trị cố gắng truy cập tên tài nguyên AWS sử dụng Ref là đúng, nó chỉ có được bao quanh bởi dấu nháy đơn ', như dưới đây:

files: 
    /config/application.properties: 
    mode: "000666" 
    owner: webapp 
    group: webapp 
    source: 'https://s3.amazonaws.com/com.mycompany.mybucket/`{"Ref": "AWSEBEnvironmentName" }`/application-`{"Ref": "AWSEBEnvironmentName" }`.properties' 
    authentication: S3Access 

Và để truy cập các biến môi trường sử dụng Fn::GetOptionSetting. Biến môi trường có trong aws:elasticbeanstalk:application:environmentnamespace.

Dưới dụ truy cập vào một biến môi trường ENVIRONMENT trong source tùy chọn files:

files: 
    "/tmp/application.properties" : 
    mode: "000666" 
    owner: webapp 
    group: webapp 
    source: 'https://s3.amazonaws.com/com.mycompany.mybucket/`{"Ref": "AWSEBEnvironmentName" }`/application-`{"Fn::GetOptionSetting": {"Namespace": "aws:elasticbeanstalk:application:environment", "OptionName": "ENVIRONMENT ", "DefaultValue": "dev"}}`.properties' 
    authentication: S3Auth 
Các vấn đề liên quan