Spring Boot Application Blue/Green Deploy to AWS Elastic Beanstalk Using Jenkins

이미지
바로 이전 글  스프링 부트 앱 EB 배포  에서 Spring Boot App 을 AWS console 을 이용해서 Elastic Beanstalk 에 단일 인스턴스 환경으로 배포했다. 하지만, 이전에 올렸던 소스는 local mariaDB 를 바라보고 있다. 따라서 회원가입 및 로그인 기능이 전혀 동작하지 않을 것이다.  이번 글에서 정리할 내용은 local MariaDB 를 AWS RDS MariaDB 를 바라보도록 변경하고, Blue/Green Deploy 를 Jenkins 를 이용해서 진행해볼 예정이다. 아래 포스트들에서 EC2 에 Jenkins 를 설치하고, Gradle 과 Git 을 이용하여 jar 로 Build 하고 S3 versioning 을 통해서 jar 를 관리하는 방법을 정리했었다. EC2에 젠킨스 설치 젠킨스로 Build 하고 S3 로 jar 관리하기 또한 Blue/Green Deploy 를 하기 위해서 기존에 Blue Environment 에 대한 설정을 그대로 따르기 위해, option-settings.json 란 파일을 생성하며 새로운 Environment 생성 시 동일한 구성을 사용할 수 있도록 하겠다. 마지막으로 Jenkins 가 설치된 EC2 에 Elastic Beanstalk Full Access Role 을 부여한다. 기존에 배포된 EB 환경에서는 DB connection 이 이루어지지 않아서 기능이 전혀 동작하고 있지 않은것을 확인할 수 있다. 먼저, local MariaDB 를 바라보고 있는 설정을 AWS RDS MariaDB 로 변경해보겠다. url 을 AWS RDS 로 변경했다. username 과 password 는 보안상의 이유로 적지 않았다. 그럼 이제 변경사항을 push 하고 Jenkins 를 이용하여 Build 하겠다. 젠킨스로 Build 하고 S3 로 jar 관리하기  글에서 작성한 방법으로 Build 를 했다. 다음은 기존 Environment 와 동일한 Environme...

Spring Boot Application Deploy to AWS Elastic Beanstalk

이미지
aws console 을 이용해서 spring boot application 을 aws Elastic Beanstalk 에 배포하는 것을 정리해보겠다. EB 를 들어가면 어떤 애플리케이션도 없을 경우 아래와 같은 화면을 확인할 수 있다. Create Application 을 눌러서 배포를 진행해보자. 어플리케이션 이름은 임의로 배포하려는 앱에 따라 지어주면된다. 플랫폼은 spring boot app 을 jar 로 올릴경우 Java 로 선택하면 된다. 코드 업로드는 로컬에서 업로드해도 되고 S3 에 jar 가 있다면, S3 URL 을 넣어주면 된다. 이제 구성쪽으로 넘어가자. 우선 단순한 예제를 진행함으로 단일 인스턴스 구성을 해주었다. 따라서 로드 밸런서에 대한 신경은 꺼버리면 된다. 보안 그룹의 경우, 기본적으로 inbound 에서 80 port 를 열어줘야 된다.  outbound 는 모든 통신을 허용해주면 된다. 제일 중요한 부분이다. EB 는 기본적으로 reverse proxy 용도로 nginx 를 사용하고 있다. default port 는 5000 번이다. 반면에, spring boot 는 default port 8080 을 사용한다. 따라서 그냥 배포를 할 경우, 배포 완료되고 environment url 을 들어가게되면 달콤한 502 error 를 마주할 수 있다. https://aws.amazon.com/ko/blogs/devops/deploying-a-spring-boot-application-on-aws-using-aws-elastic-beanstalk/ 따라서 EB 의 nginx port 설정을 spring boot port 에 맞추거나, spring boot port 를 nginx port 에 맞춰줘야 한다. 나는 EB 기본 port 5000 에 맞추었다. 아래와 같이 application.yaml 의 port 를 5000 으로 변경했다. 그리고 EB 환경 속성에 SERVER_PORT 라 하여 5000 으로 싱크를 맞추었다. 정상적...

Spring Boot App Build With Gradle Using Jenkins In AWS EC2

이미지
지난글  Install Jenkins In AWS EC2  에서 EC2 를 생성하고 Jenkins 를 설치하는 것을 정리해보았다. 이번에는 설치한 Jenkins 를 이용해서 Spring Boot App 을 Build 하고 S3 에서 jar 를 관리하는 것을 정리해보겠다. 먼저, Spring Boot 프로젝트는 Git Repository 가 있다는 전제하에 진행하겠다. 필자의 경우 최근에 공부한 spring-security 프로젝트를 build 해 볼 예정이다. https://github.com/ndgndg91/security 그리고 Build Tool 은 Gradle 을 이용할 것이다. 또한, S3 에 build 한 jar 를 올릴거니까, S3 가 있어야 되며, EC2 안에서 AWS CLI 를 이용할 것이다. Jenkins 로 Build 하려면 Jenkins 에게 권한을 줘야한다. 따라서, 정리하자면 아래의 순서대로 진행하겠다. Generate S3 for jar EC2 에 S3 FullAccess Role 부여 Install Git Install Gradle Grant SU to Jenkins Jenkins JAVA_HOME, GRADLE_HOME, GIT PATH 설정 Build Script 작성 먼저, jar 용 S3 를 aws console 을 이용해서 만든다. Bucket 이름은 자유롭게 알아서 해준다. 나의 경우 spring-boot-app-jars 라는 이름을 정했고, region 은 서울로 했다. 여기서 중요한 포인트는 버전 관리를 하는 것이다. 동일한 이름으로 jar 를 S3에 저장할 것이다. 따라서 S3 에 jar Object 를 올릴 때 마다 S3가 해당 jar 파일의 버전을 관리해 줄것이다. 필자는 해당 S3에 대한 모든 퍼블릭 액세스를 허용했다. 아래의 이미지에서도 보이겠지만, 경고 메세지를 띄워주고 체크해줘야 한다. 실제 운영에서는 ACL 이나 Bucket Policy 를 통해서 접근제한을 해야한다. 자 이제 S3 Bu...

Install Jenkins In AWS EC2

이미지
이번 글에서는 AWS EC2 를 console 을 통해서 생성하고, 생성한 EC2에 Jenkins 를 설치하는 과정을 살펴보겠다. 먼저 AWS console 에 로그인 하고 EC2 를 생성한다. 인스턴스 시작 버튼을 누른다. amazon linux 를 선택한다. EC2 유형은 small 이상으로 하는것이 좋다. jenkins 로 프로젝트를 Build 하는 과정에서 성능이 낮으면, Gradle 같은 경우 DaemonDisapperaredException 을 달콤하게 경험할 수 있다. 해당 예외의 경우 memory 가 부족해서 발생할 수 있다. https://medium.com/@kenkyee/yes-this-means-your-build-server-ran-out-of-memory-running-an-android-gradle-build-69bae138f94f 다음에는, Security Group 을 할당한다. 기본적으로 Jenkins 를 설치하기 위해서 SSH 를 허용하며, Jenkins 의 기본 port 는 8080 이기 때문에 8080 port 도 열어준다. 경고 메세지에서 확인이 가능하듯, 실제 운영에서는 특정 IP 에서만 접근이 가능하도록 하는 것이 좋다. VPC 와 Subnet public IP 및 DNS 그리고 Availability Zone 등 세부적인 사항들은 모두 default 설정을 따랐다. 실제 운영에서는 커스텀하게 설정해주는 것이 좋다. 이제 EC2 를 생성해준다. 정상적으로 EC2 가 생성되고 running 이라면 SSH 로 접속한다. 먼저 sudo yum update 를 해주자. 그렇다면, 이제 Jenkins 를 설치해보자. Jenkins 는 jdk8 이상의 버전이 필요하다. 하지만 기본적으로 설치 되어 있는 jdk 버전은  1.7 이다.  따라서, jdk 1.7 를 먼저 지우고, jdk11 aws corretto 를 설치한다. sudo yum remove java-1.7.0-openjdk 명령어를 통해서 지우...