이번글에서는 jenkins와 codedeploy를 사용해 ec2 server에 무중단 배포를 해보도록 하겠습니다.
첫 성공까지의 history.. 😂
0. Proejct Structure
전체적인 구조는 아래와 같습니다.
• 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을 선택합니다.
Create Role을 선택합니다.
role을 사용할 service에서 codedeploy를 선택하고 use case도 codedeploy를 선택합니다.
codedeploy가 사용할 수 있는 권한은 한개밖에 없습니다. 다음으로 이동합니다.
적절한 tag를 입력합니다. 저는 생략하겠습니다. 다음으로 이동합니다.
role 이름을 입력합니다. 다음으로 이동합니다.
role이 정상적으로 생성되었습니다.
1-2) S3FullAccessRole
이번에는 EC2가 사용할 S3 접근권한을 생성하겠습니다.
role을 사용할 service에서 ec2를 선택하고 다음으로 이동합니다.
filter에 S3를 입력하고 AmazonS3ReadOnlyAccess를 선택합니다. 다음으로 이동합니다.
EC2가 S3 접근권한이 필요한 이유는, jenkins에서 build한 파일을 s3에 zip형식으로 upload 하기 때문입니다. ec2는 해당 zip 파일을 사용해 deploy를 진행합니다.
tag는 건너뛰도록 하겠습니다. 다음으로 이동합니다.
role 이름을 입력합니다. 다음으로 이동합니다.
role이 생성되었습니다.
2. ELB + EC2
이번에는 server를 구동할 ec2를 생성하고 elb로 연결해보겠습니다.
2-1) create ec2
EC2로 이동해 Lanunch Instacne를 클릭합니다.
Amazon Linux를 선택합니다.
t2 micro를 선택합니다.
다른 설정은 default로 두고 IAM role에서 앞서 생성한 S3ReadOnlyAccess role을 선택합니다.
저장소 용량은 default를 사용하겠습니다. 다음으로 이동합니다.
Name tag를 추가하겠습니다. 이후 codedeploy에서 deploy할 ec2 instance를 선택할때 name tag로 instance를 구분할 수 있습니다.
security group은 default 값인 ssh에 추가적으로 8080 port를 열도록 하겠습니다. 이번 실습에선 따로 apache나 nginx와 같은 web server는 두지 않을 것이므로 ec2 instance와 직접 http 통신을 하도록 하겠습니다.
리뷰 후 ec2 luanch 버튼을 눌러 ec2 instance 생성을 완료합니다.
instance 생성이 완료되었습니다.
이제 생성한 instance의 setting을 좀 해줘야합니다. ec2 인스턴스에 접속하도록 하겠습니다. 저는 window를 사용하고 있으므로 putty를 사용해 아래와 같이 ec2 instance에 접속했습니다.
2-2) download jdk 1.8
Amazon Linux AMI로 생성한 ec2 instance의 default jdk version은 1.7입니다. 이를 jdk 1.8로 변경하도록 하겠습니다.
순서대로 아래의 명령어를 입력합니다.
## 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로 변경된 것을 확인할 수 있습니다.
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
2-5) make ami
이제 기본적인 ec2 instance setting은 완료했습니다. 앞서 우리는 elb를 사용하기로 했으므로 최소 2개의 ec2 instance가 필요합니다. 따라서 앞서 setting을 완료한 ec2 instance를 AMI로 만들어 사용하겠습니다.
instance에서 우클릭 후 create image를 선택합니다.
name과 description을 입력후 이미지를 생성합니다.
ami 생성이 완료되었습니다.
2-6) create ec2 instance by custom ami
이제 이 ami를 사용해 새로운 ec2 instance를 launch 하면 앞서 진행한 download jdk1.8 & codedeploy agent를 또 수행하지 않아도 됩니다. 인스턴스를 하나더 생성해보도록 하겠습니다.
앞서 생성한 ami를 선택해 instance를 생성합니다.
모든 instance의 setting은 위에서 생성한 instance와 반드시 동일하게 진행합니다. 특히 role에서 S3ReadOnlyAccess를 반드시 선택합니다.
이제 instance가 2개가 되었습니다.
이때 custom ami를 사용해 launch한 ec2 instance에 접속해보면 아래와 같이 jdk가 1.8로 변경되어있으머 codedeply agent가 이미 실행되고 있는 것을 확인할 수 있습니다.
2-7) integrate with elb
이제 생성한 2개의 instance를 elb에 연결해보도록 하겠습니다. elb는 client의 traffic을 2개의 ec2 instance에 분배합니다.
Load Balncers 탭으로 이동해 Create Load Balancer를 클릭합니다.
Application Load Balancer를 선택합니다.
name을 입력하고, Listners에서 HTTP port를 8080으로 변경합니다. 앞서 말씀드렸다 싶이 이번 실습에서는 ec2 server에 따로 apache나 nginx와 같은 web server를 두지 않으므로 8080 port로 health check를 하도록 하겠습니다.
availability zone은 아래와 같이 전체 선택을 하도록 하겠습니다. 다음으로 이동합니다.
load balancer에 https가 등록되지 않았다는 경고구문이 나타나지만, 이번실습에서는 다루지 않겠습니다. 다음으로 이동합니다.
security group에서 8080 port를 열도록 하겠습니다.
다음으로 target group을 생성해야 합니다. target group의 name을 입력합니다. port는 8080으로 변경하도록 하겠습니다.
advanced setting을 열어 아래와 같이 값을 변경하도록 하겠습니다. default 값을 사용하면, codedeply 실행시 너무많은 시간이 소요됩니다. 다음으로 이동합니다.
앞서 생성한 2개의 ec2 instance를 선택하고 add to registered 버튼을 눌러 target group에 등록합니다.
리뷰후 생성합니다.
elb 생성이 완료되었습니다. listener에는 8080이 등록된 것을 확인할 수 있습니다.
target group도 생성되었으며 2개의 ec2 instance가 등록되어있습니다.
기본적인 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 ]
추천서적
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
'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 |