Spring Boot Admin with Spring Boot Actuator

이미지
이번 글에서는 spring boot admin 에 대해 다루어 보겠다. spring boot admin 은 spring boot 어플리케이션들을 모니터링하고 관리하기 위한 웹 어플리케이션이다. 각각의 어플리케이션은 client 로 간주되고 admin server 에 등록된다. spring boot actuator endpoints 만 열어두면 알아서 설정이 된다. 정말 쉽고 간편하다. https://github.com/codecentric/spring-boot-admin https://www.baeldung.com/spring-boot-admin 정리해볼 내용은 아래와 같다. 1. spring boot admin client 1개 구현 (with spring boot actuator) 2. spring boot admin server 1개 구현 https://github.com/ndgndg91/actuator-boot-admin spring boot admin client 는 임의로 api 하나를 가진 api server application 이다. 이 application 은 spring boot actuator 설정을 통해서 여러가지 endpoint 를 열어둔다. 또한 다른 하나의 application 은 spring boot admin server 이다.  필수 dependency 는 actuator 와 admin-client 이다. data-jpa 와 web 그리고 h2 임의의 api endpoint 를 만들기 위해 추가했다. 다음으로 yaml 파일을 보자.  여기서 must 는 admin.client.url 이다. 1. spring.boot.admin.client.url 이다. admin.server url 을 설정하는 것이다. 2. management.endpoints.web.exposure.include 는 내맘으로 "*" 모든 end points 를 열어주었다. clinet application 의 마지막 임의로 만든 api 를...

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...