[Jenkins] Springboot + Gradle + Github + CodeDeploy + ELB (1)

반응형

이번글에서는 jenkins와 codedeploy를 사용해 ec2 server에 무중단 배포를 해보도록 하겠습니다.

첫 성공까지의 history.. 😂

image.png

0. Proejct Structure

전체적인 구조는 아래와 같습니다.

image.png

• local에서 spring boot application을 작성합니다.
• github에 code를 push 합니다.
• github에 code가 push되면 webhook이 작동해 해당 code가 jenkins server로 이동합니다.
• jenkins server에서 application을 build를 합니다.
• build한 파일 중 deploy 필요한 파일들을 S3에 zip해서 upload 합니다.
• upload가 완료되면 codedeploy가 해당 파일을 사용해 deploy를 시작합니다.
• elb에 연결된 ec2에 순차적으로 deploy가 진행됩니다.
• deploy 순간에도 나머지 ec2는 살아있으므로 무중단으로 배포가 진행됩니다.

이제 기나긴 여정을 떠나봅시다 😎..

1. IAM

먼저 IAM 권한을 생성해야합니다.

CodeDeploy가 사용할 deploy 권한과 EC2가 사용할 S3 접근권한을 생성해야합니다.

1-1) AWSCodeDeployRole

CodeDeployApplication이 사용할 role을 생성해보겠습니다.

IAM에서 Role을 선택합니다.

image.png

Create Role을 선택합니다.

image.png

role을 사용할 service에서 codedeploy를 선택하고 use case도 codedeploy를 선택합니다.

image.png

codedeploy가 사용할 수 있는 권한은 한개밖에 없습니다. 다음으로 이동합니다.

image.png

적절한 tag를 입력합니다. 저는 생략하겠습니다. 다음으로 이동합니다.

image.png

role 이름을 입력합니다. 다음으로 이동합니다.

image.png

role이 정상적으로 생성되었습니다.

image.png

1-2) S3FullAccessRole

이번에는 EC2가 사용할 S3 접근권한을 생성하겠습니다.

role을 사용할 service에서 ec2를 선택하고 다음으로 이동합니다.

image.png

filter에 S3를 입력하고 AmazonS3ReadOnlyAccess를 선택합니다. 다음으로 이동합니다.

EC2가 S3 접근권한이 필요한 이유는, jenkins에서 build한 파일을 s3에 zip형식으로 upload 하기 때문입니다. ec2는 해당 zip 파일을 사용해 deploy를 진행합니다.

image.png

tag는 건너뛰도록 하겠습니다. 다음으로 이동합니다.

image.png

role 이름을 입력합니다. 다음으로 이동합니다.

image.png

role이 생성되었습니다.

image.png

2. ELB + EC2

이번에는 server를 구동할 ec2를 생성하고 elb로 연결해보겠습니다.

2-1) create ec2

EC2로 이동해 Lanunch Instacne를 클릭합니다.

image.png

Amazon Linux를 선택합니다.

image.png

t2 micro를 선택합니다.

image.png

다른 설정은 default로 두고 IAM role에서 앞서 생성한 S3ReadOnlyAccess role을 선택합니다.

image.png

저장소 용량은 default를 사용하겠습니다. 다음으로 이동합니다.

image.png

Name tag를 추가하겠습니다. 이후 codedeploy에서 deploy할 ec2 instance를 선택할때 name tag로 instance를 구분할 수 있습니다.

image.png

security group은 default 값인 ssh에 추가적으로 8080 port를 열도록 하겠습니다. 이번 실습에선 따로 apache나 nginx와 같은 web server는 두지 않을 것이므로 ec2 instance와 직접 http 통신을 하도록 하겠습니다.

image.png

리뷰 후 ec2 luanch 버튼을 눌러 ec2 instance 생성을 완료합니다.

image.png

instance 생성이 완료되었습니다.

image.png

이제 생성한 instance의 setting을 좀 해줘야합니다. ec2 인스턴스에 접속하도록 하겠습니다. 저는 window를 사용하고 있으므로 putty를 사용해 아래와 같이 ec2 instance에 접속했습니다.

image.png

2-2) download jdk 1.8

Amazon Linux AMI로 생성한 ec2 instance의 default jdk version은 1.7입니다. 이를 jdk 1.8로 변경하도록 하겠습니다.

image.png

순서대로 아래의 명령어를 입력합니다.

## download jdk 1.8
sudo yum install -y java-1.8.0-openjdk-devel.x86_64

## change defualt java version 1.7 to 1.8
sudo /usr/sbin/alternatives --config java
2

## remove jdk 1.7
sudo yum remove java-1.7.0-openjdk
y

완료 후 다시한번 java -version을 확인해보면 아래와 같이 1.8로 변경된 것을 확인할 수 있습니다.

image.png

2-3) download codedeploy agent

다음으로 codedeploy agent를 다운받아야합니다. codedeploy는 향후 ec2 instance에 접근해 deploy를 수행합니다.

순서대로 아래의 명령어를 입력합니다.

sudo yum update
sudo yum install ruby
sudo yum install wget
cd /home/ec2-user
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto

설치가 완료된 후 아래의 명령어로 agent가 정상적으로 실행중인지 확인할 수 있습니다. PID number가 정상적으로 확인되면 됩니다.

sudo service codedeploy-agent status

image.png

2-5) make ami

이제 기본적인 ec2 instance setting은 완료했습니다. 앞서 우리는 elb를 사용하기로 했으므로 최소 2개의 ec2 instance가 필요합니다. 따라서 앞서 setting을 완료한 ec2 instance를 AMI로 만들어 사용하겠습니다.

instance에서 우클릭 후 create image를 선택합니다.

image.png

name과 description을 입력후 이미지를 생성합니다.

image.png

ami 생성이 완료되었습니다.

image.png

2-6) create ec2 instance by custom ami

이제 이 ami를 사용해 새로운 ec2 instance를 launch 하면 앞서 진행한 download jdk1.8 & codedeploy agent를 또 수행하지 않아도 됩니다. 인스턴스를 하나더 생성해보도록 하겠습니다.

앞서 생성한 ami를 선택해 instance를 생성합니다.

image.png

모든 instance의 setting은 위에서 생성한 instance와 반드시 동일하게 진행합니다. 특히 role에서 S3ReadOnlyAccess를 반드시 선택합니다.

이제 instance가 2개가 되었습니다.

image.png

이때 custom ami를 사용해 launch한 ec2 instance에 접속해보면 아래와 같이 jdk가 1.8로 변경되어있으머 codedeply agent가 이미 실행되고 있는 것을 확인할 수 있습니다.

image.png

2-7) integrate with elb

이제 생성한 2개의 instance를 elb에 연결해보도록 하겠습니다. elb는 client의 traffic을 2개의 ec2 instance에 분배합니다.

Load Balncers 탭으로 이동해 Create Load Balancer를 클릭합니다.

image.png

Application Load Balancer를 선택합니다.

image.png

name을 입력하고, Listners에서 HTTP port를 8080으로 변경합니다. 앞서 말씀드렸다 싶이 이번 실습에서는 ec2 server에 따로 apache나 nginx와 같은 web server를 두지 않으므로 8080 port로 health check를 하도록 하겠습니다.

image.png

availability zone은 아래와 같이 전체 선택을 하도록 하겠습니다. 다음으로 이동합니다.

image.png

load balancer에 https가 등록되지 않았다는 경고구문이 나타나지만, 이번실습에서는 다루지 않겠습니다. 다음으로 이동합니다.

image.png

security group에서 8080 port를 열도록 하겠습니다.

image.png

다음으로 target group을 생성해야 합니다. target group의 name을 입력합니다. port는 8080으로 변경하도록 하겠습니다.

image.png

advanced setting을 열어 아래와 같이 값을 변경하도록 하겠습니다. default 값을 사용하면, codedeply 실행시 너무많은 시간이 소요됩니다. 다음으로 이동합니다.

image.png

앞서 생성한 2개의 ec2 instance를 선택하고 add to registered 버튼을 눌러 target group에 등록합니다.

image.png

리뷰후 생성합니다.

image.png

elb 생성이 완료되었습니다. listener에는 8080이 등록된 것을 확인할 수 있습니다.

image.png

target group도 생성되었으며 2개의 ec2 instance가 등록되어있습니다.

image.png

기본적인 server 구성이 완료되었습니다 😅.

이제 우리는 spring boot로 작성한 applicaton을 2개의 ec2 instance에서 구동하고, github의 code가 변경될때마다 변경된 code를 사용해 무중단으로 각 ec2 instance에 deploy를 수행하도록 하겠습니다.


참고 자료 : [ https://jojoldu.tistory.com/283?category=777282 , https://www.youtube.com/watch?v=83d5YuG-KiQ&t=1685s ]


추천서적

 

스프링 부트와 AWS로 혼자 구현하는 웹 서비스

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

'Jenkins' 카테고리의 다른 글

[Jenkins] Springboot + Gradle + Github + CodeDeploy + ELB (2)  (1) 2020.08.22
[Jenkins] Gradle Build  (0) 2020.08.22
[Jenkins] Delivery Pipeline  (0) 2020.08.21
[Jenkins] Deploy  (0) 2020.08.21
[Jenkins] Compile  (0) 2020.08.21

댓글

Designed by JB FACTORY