Amazon Elastic Beanstalk (AWS EBS)에서 사용자 지정 환경 변수를 어떻게 전달합니까?


121

Amazon Elastic Beanstalk 광고는 다음과 같이 말합니다.

Elastic Beanstalk를 사용하면 "후드를 열고"모든 권한을 유지할 수 있습니다. 심지어 Elastic Beanstalk 콘솔을 통해 환경 변수를 전달할 수도 있습니다.

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

Elastic Beanstalk 구성에서 다른 환경 변수를 전달하는 방법은 무엇입니까?


4
이에 허용 대답을 변경하는 것을 고려할 수 있습니다
필립

답변:


136

.ebextensions/*.config방법 을 사용하는 모든 사람에게주의를 기울이십시오. 요즘에는 Elastic Beanstalk 웹 인터페이스에서 환경 변수를 추가, 편집 및 제거 할 수 있습니다 .

변수는 구성 → 소프트웨어 구성에 있습니다.

환경 속성

Onema의 답변 에서 .ebextensions와 같이 vars를 만드는 것은 여전히 작동합니다.

예를 들어 나중에 다른 환경에 배포 할 예정이고 수동으로 설정하는 것을 잊는 것이 두려우거나 값을 소스 제어에 커밋하는 것이 괜찮은 경우에도 바람직 할 수 있습니다. 나는 둘 다 사용합니다.


2
또는 구성을 저장하고 구성을 사용하여 새 환경을 시작할 수도 있습니다.
Michael Gallego 2013

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 관리자 패널 (Environment Details-> Edit Configuration-> Container)로 이동하여 값을 업데이트 할 수 있습니다. 내 경험상 이러한 값은 후속 배포 후에도 변경되지 않습니다.

업데이트 2 @Benjamin이 자신의 의견에서 언급했듯이 새로운 모양과 느낌 이 2013 년 7 월 18 일에 출시 되었으므로 콘솔에서 직접 여러 환경 변수를 정의 할 수 있습니다.

Configuration > Software Configuration > Environment Properties


2
@Onema-구성 파일에 새 키 추가를 어떻게 처리합니까? 업데이트 된 파일을 푸시하면 이전에 설정된 모든 키가 자리 표시 자 값으로 업데이트됩니까?
Tabrez

1
@Tabrez, 이전에 설정 한 모든 키는 해당 값을 유지합니다.
Anarchtica

2
죄송합니다 @Tabrez, 전에는 이것을 조사 할 기회가 없었습니다. Anarchtica 답변에 추가하기 위해 몇 가지 테스트를 실행 한 결과 자리 표시자를 사용한 다음 실제 키를 사용하여 AWS 콘솔의 값을 업데이트 한 다음 구성 파일의 자리 표시 자 값을 업데이트하고 푸시하면 키가 새 자리 표시 자로 바뀝니다. 나는 이것이 약간 이상하다고 생각하지만 콘솔의 모든 env 값을 관리해야하므로 환영받는 행동이라고 생각합니다.
Onema 2013-06-01

7
@Anarchtica,이 동작에 대해 AWS 지원팀에 문의했습니다. 그들은 콘솔에서 값을 업데이트하면 우선권이 주어지며 구성 파일을 사용하여 수정할 수 없다고 말했습니다. 콘솔에서 값을 변경하지 않으면 구성 파일의 모든 변경 사항이 업데이트됩니다.
Onema 2013-06-04

1
누구든지 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에 jvm의 -D 속성으로 전달되는 시스템 속성으로 설정됩니다. 환경 변수를 가져 오는 Java의 방법은 속성을 가져 오는 방법과 동일하지 않습니다. System.getenv 대 System.getProperty

상자에 들어가서 환경 변수가 설정되지 않았 음을 확인했습니다. 그러나 tomcat 로그에서 -D 속성이 설정된 것을 볼 수 있습니다.

해결 방법으로 두 위치를 모두 확인하도록 코드를 변경했습니다.


그리고 .Net의 경우 stackoverflow.com/a/33465765/1991614에 따라 환경 변수에 넣지 않고 web.config 파일에 삽입됩니다 . 더 혼란스러운 문제는 해당 키가 이미 web.confg에 있으면 삽입되지 않는다는 것입니다. :(
bitcoder

너는 나의 영웅이야! 톰캣 (8)의 -D 속성 매핑을 몰래 주셔서 감사합니다 당신은
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/*.configCloudFormation 템플릿을 사용하고 백틱 (`)으로 래핑 할 수 있습니다 .

{
  "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


9

환경 세부 정보-> 구성 편집-> 컨테이너

여기에 이미지 설명 입력


5

이것이 beantalk에서 동적 값으로 ENV를 설정하는 유일한 방법 인 것 같습니다. 다중 도커 설정에 적합한 해결 방법을 찾았습니다.

1) 빌드하고 ECS 리포지토리에 업로드하기 전에 Dockerfile에 추가합니다.

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 deploy 및 ENVS를 Docker 컨테이너에서 사용할 수 있어야합니다.

다음과 같은 container_command를 더 추가하여 더 많은 ENV를 추가 할 수 있습니다.

  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.