본문 바로가기

개발이야기/AWS

Spring boot에 AWS Elasticbeanstalk의 ebextensions 적용하기

Elasticbeanstalk란?

Elasticbeanstalk는 Java, .NET, PHP, Node.js, Python, Ruby, Go, Docker를 사용하여 Apache, Nginx, Passenger, IIS와 같은 친숙한 서버에서 개발된 웹 애플리케이션 및 서비스를 간편하게 배포하고 조정할 수 있는 서비스이다.


Tomcat 배포시 web server configuration?

Spring boot MVC를 war package하여 Elasticbeanstalk(tomcat)을 통해 배포하면 자동으로 WAS, WEB 서버가 프로비져닝되어 배포된다. 아주 간편하고 쉬운 배포지만 was control 뿐만아니라 web server을 어떻게 컨트롤 할지 의문이든다. 


이 때를 위하여 Elasticbeanstalk는 .ebextensions를 사용하여 고급 환경 사용자 설정을 유도하고 있다. .ebextensions를 통해 배포시 apache설정, JVM 설정등을 포함하여 배포하면 배포시 자동적용된다.



이번 포스팅에서는 Tomcat was와 Nginx web server을 사용할때를 가정한다. 

http 접속을 요청할 때 https로 auto redirect되도록 하는 configuration을 셋팅하는 예제를 아래에서 보여줄 것이다.


Spring boot + maven 사용시 ebextensions 설정

1) pom.xml

src/main/ebextensions의 내용을 war로 package시에 .ebextensions folder을 만들어 root directory에 저장하도록 한다.

<build>
  <plugins>
    <!-- Package as an executable jar/war -->
    <plugin>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-maven-plugin</artifactid>
    </plugin>
    <plugin>
      <artifactid>maven-war-plugin</artifactid>
      <version>2.6</version>
      <configuration>
        <webresources>
          <resource>
            <directory>src/main/ebextensions</directory>
            <targetpath>.ebextensions</targetpath>
            <filtering>true</filtering>
          </resource>
        </webresources>
      </configuration>
    </plugin>
  </plugins>
</build>

2) 경로

src/main/ebextensions 폴더에 configuration에 필요한 내용들을 넣는다.
| pom.xml
+ src/main
|    + ebextensions/nginx/conf.d/elasticbeanstalk/00_application.conf
|    + resources
|    + java/com.company/HelloworldApplication.java
|    + webapp/WEB-INF/jsp

3) configuration

nginx의 셋팅에 필요한 configuration을 작성한다. 
github의 awsdocs에서도 examples(바로가기)를 제공한다.
location / {
  set $redirect 0;
  if ($http_x_forwarded_proto != "https") {
    set $redirect 1;
  }
  if ($http_user_agent ~* "ELB-HealthChecker") {
    set $redirect 0;
  }
  if ($redirect = 1) {
    return 301 https://$host$request_uri;
  }

  proxy_pass          http://127.0.0.1:8080;
    proxy_http_version  1.1;

  proxy_set_header    Connection          $connection_upgrade;
  proxy_set_header    Upgrade             $http_upgrade;
  proxy_set_header    Host                $host;
  proxy_set_header    X-Real-IP           $remote_addr;
  proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
}


결과물

Elasticbeanstalk에 war를 배포하면 아래와 같이 configuration이 완료되었음을 동시에 알리면서 배포가 완료된다.



맺음말

Elasticbeanstalk와 ebextension이 함께라면 ec2에서 수행해야할 어려운 configuration들을 code화 하여 간편하게 배포할 뿐만아니라 history관리까지 가능하다. Infra에 대한 걱정은 적게 생각하고 비즈니스에 집중할 수 있게 도와주는 훌륭한 aws 제품인 Elasticbeanstalk는 1인 개발, 스타트업, 학생들에게 유용한 도구임에 틀림없다. 


End of Document