[springboot] AWS Beanstalk 에서 SpringBoot 에 사용할 환경변수 정의
AWS Beanstalk configuration with SpringBoot
AWS 빈즈토크(Beanstalk, 줄여서 빈즈톡)에 스프링 부트 애플리케이션을 배포하는 것과 관련해서는 위의 내용을 참조하기 바란다.
결론부터 내리자면
시스템에서 환경변수는 언더코어('_')를 사용하는데 스프링 부트 속성은 마침표('.')를 사용한다. 이를 궁휼히 여긴 스프링부트 팀에서 언더코어로 정의된 환경변수 중 스프링 부트 속성들에 대해서 주입해주는 기능을 넣었다.
ex) SPRING_DATASOURCE_URL => spring.datasource.url
스프링 부트를 jar 형태로 aws 배포할 때는 시스템 환경변수만 적용되니 언더스코어로 스프링 부트 속성을 정의하면 적용된다.
스프링 부트 외부 구성(External configuration) 기능 설명
스프링 부트는 구동과 관련하여 외부에서 속성값을 받아 실행시 적용하는 외부 구성(External configuration) 기능을 지원한다. 스프링 부트에서 사용할 수 있는 OS 환경변수가 몇가지 있다.
SPRING_APPLICATION_JSON
:spring.application.json
SERVER_PORT
:server.port
와 동일SPRING_PROFILES_ACTIVE
:spring.profiles.active
와 동일SPRING_APPLICATION_JSON
: JSON 형태로 외부구성 값을 전달받는 기능
이는 로컬환경에서 jar 를 실행할 때에도 다음처럼 적용가능하다. 아래 세 가지 방법 모두 동일하게 실행된다.
$ java -jar -Dspring.application.json='{"spring.profiles.active": "dev"}' -jar my-app.jar
$ java -jar my-app.jar --spring.application.json='{"spring.profiles.active": "dev"}'
$ java -jar my-app.jar --SPRING_APPLICATION_JSON='{"spring.profiles.active": "dev"}'
AWS 빈즈토크 구성
애플리케이션 생성
[Create New Application] 생성
'Web Server Environment' [Create web server] 생성
Predefined configuration: Java
Environment type: Load Balancing, auto scaling
Select a source for your application version. (나중에 S3 형태로 선택"
환경설정은 여러분의 몫
Configuration - Softwar configuration
스프링 부트 기본포트는 8080, 빈즈톡에서는 5000번을 듣는다. 둘이 어긋나는 부분이 있으니 환경변수를 지정하여 스프링 부트 앱의 포트번호를 지정한다.
기본 환경속성은 다음과 같다.
Environment Properties
Property Name | Property Value |
---|---|
GRADLE_HOME |
|
JAVA_HOME |
|
M2 |
|
M2_HOME |
|
SERVER_PORT |
|
여기에 스프링 부트 환경변수에 해당하는 환경속성들을 추가해야한다.
SPRING_DATASOURCE_URL
: jdbc:mysql://{url}/ebdbSPRING_DATASOURCE_USERNAME
: {username}SPRING_DATASOURCE_PASSWORD
: {password}SPRING_JPA_HIBERNATE_DDL_AUTO
: update // 변경가능SPRING_JPA_DATABASE_PLATFORM
: org.hibernate.dialect.MySQL5Dialect // 변경가능
기본적인 실행환경에 대해서는 스프링 프로파일 을 이용해서 구분짓도록 한다. application.properties
혹은 application.yml
의 기본적인 구성을 다음과 같이 했다면…
# 기본적용공간server:error:whitelabel:enabled: falseinclude-stacktrace: always---spring: #localprofiles: localdatasource:url: jdbc:mysql:localhost:3306/localusername: honeymonpassword: gooddeveloperjpa:show-sql: truehibernate.ddl-auto: updateaws:s3.url: https://s3.aws.com/local-honeymon---spring: #testprofiles: testdatasource:url: jdbc:mysql:localhost:3306/testusername: honeymonpassword: goodtesterjpa:show-sql: truehibernate.ddl-auto: create-dropaws:s3.url: https://s3.aws.com/test-honeymon---spring: #devprofiles: devdatasource:url: jdbc:mysql:localhost:3306/devusername: honeymonpassword: goodmanjpa:show-sql: falsehibernate.ddl-auto: validateaws:s3.url: https://s3.aws.com/dev-honeymon---spring:profiles: prod
빈즈톡으로 운영서버에 배포하면서 prod
프로파일을 실행하고 싶다. 그런데 이때 변경되어야 할 정보들이 몇가지 있다. 보이는가?
spring.datasource.url
, spring.datasource.username
, spring.datasource.password
, spring.jpa.hibernate.ddl-auto
등이 보인다.
스프링 부트의 자동 구성(Auto-Configuration) 은 외부 구성을 통해서 값을 변경하는 게 가능하다. 그런데 빈즈 토크에서는 외부 구성을 설정해도 java -jar
실행을 해도 외부 설정값을 실행인자로 전달하지 않는 것으로 보인다. 이런 기능적인 제약을 해소하기 위해 제공하는 환경 변수들이 있다.
SPRING_DATASOURCE_URL=jdbc:mysql://{rdb}/ebdb //
spring.datasource.url
대응SPRING_DATASOURCE_USERNAME=<username> //
spring.datasource.username
대응SPRING_DATASOURCE_PASSWORD=<password> //
spring.datasource.password
대응SPRING_JPA_HIBERNATE_DDL_AUTO=update //
spring.jpa.hibernate.ddl-auto
대응SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.MySQL5Dialect //
spring.jpa.database-platform
대응
-
5가지 환경변수는 배포하는 환경에 따라 크게 달라질 수 있는 부분이기 제공하는 듯 하다. 대부분의 운영체제에서는 환경변수에서 .
로 명명하는 것을 허용하지 않고 언더스코어(_
) 로 사용한다. 스프링부트에서는 이에 대한 지원을 하고 있다. 즉, spring.datasource.url
가 SPRING_DATASOURCE_URL
와 대응된다는 것이다. 그러니 빈즈톡에서는 환경변수를 SPRING_DATASOURCE_URL
로 지정해도 스프링 부트에서 알아서 spring.datasource.url
에 대입해주는 것이다.
;;;
짱 좋군.
스프링 부트를 jar 형태로 배포하고, 빈즈톡에서는 Java 애플리케이션 서버로 배포하기 위한 설정은 위의 '환경변수'를 정의하는 것으로 간단하게 구성이 가능하다.
이제 손쉽게!! 빈즈톡에 스프링부트 애플리케이션을 jar로 배포하면서 외부 구성을 변경하는 시도를 해볼 수 있을 것이다.