이전 포스팅(https://cotmulgyu.blogspot.com/2020/07/blog-post.html)에서 github의 webhooks 를 통해 push가 되면 젠킨스에서 빌드하고 특정 명령어를 실행해서 배포할 수 있음을 확인하였다.
이번에는 CI/CD 서버에서 빌드 후 실제 배포 서버(aws)에 빌드된 파일을 보내고 배포서버에서 바로 배포까지 할 수 있도록 해본다!
- aws 인스턴스 생성과정은 생략
1_프로젝트 설정
프로젝트에 다음과 같이 생성 예정!
배포에 사용할 start.sh 파일을 생성한다.(http://m.yes24.com/Goods/Detail/83849117 해당 책 참고)
REPOSITORY=/home/ec2-user/project/todolist PROJECT_NAME=to-do-list echo "> Build 파일복사" cp $REPOSITORY/zip/*.jar $REPOSITORY/ echo "> 현재 구동중인 애플리케이션 pid 확인" CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar) echo "현재 구동중인 애플리케이션 pid: $CURRENT_PID" if [ -z "$CURRENT_PID" ]; then echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." else echo "> kill -15 $CURRENT_PID" kill -15 $CURRENT_PID sleep 5 fi echo "> 새 애플리케이션 배포" JAR_NAME=$(ls -tr $REPOSITORY/*.jar | tail -n 1) echo "> JAR Name: $JAR_NAME" echo "> $JAR_NAME 실행" nohup java -jar \ -Dspring.config.location=classpath:/application.yml,/home/ec2-user/project/properties/application-oauth.properties \ -Dspring.profiles.active=real \ $JAR_NAME > $REPOSITORY/nohup.out 2>&1 &
- AWS CodeDeploy에서 사용할 appspec.yml 파일을 생성한다.
version: 0.0 os: linux files: - source: / destination: /home/ec2-user/project/todolist/zip # S3에서 이동시킬 경로 overwrite: yes permissions: # 권한설정이 없으면 root로 설정되므로 다음의 설정 필요 - object: / pattern: "**" owner: ec2-user group: ec2-user hooks: ApplicationStart: - location: start.sh # 애플리케이션 실행 runas: ec2-user
2_AWS 설정
http://m.yes24.com/Goods/Detail/83849117 해당 책을 참고하면 자세하게 설명되어있다...
IAM
- Identity and Access Management(IAM)는 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스. IAM을 사용하여 리소스를 사용하도록 인증(로그인) 및 권한 부여(권한 있음)된 대상을 제어함
- IAM > 사용자 추가
- 엑세스유형: 프로그래밍 방식 엑세스
- 권한 설정: 기존정책 직접 연결 > AmazonS3FullAccess , AWSCodeDeployFullAccess 체크
- 엑세스키와 비밀 엑세스 키는 잘 관리하도록한다..
S3 버킷
- AWS의 S3 서비스는 일종의 파일 서버임 (파일들을 저장하고, 접근 권한을 관리, 검색을 지원)
- S3 > 버킷 만들기
- 다른 건 기본설정..
- 퍼블릭 엑세스 차단 : 모든퍼블릭 엑세스 차단 체크
CodeDeploy
AWS CodeDeploy는 Amazon EC2 인스턴스 및 온프레미스에서 실행 중인 인스턴스를 비롯하여 모든 인스턴스에 대한 코드 배포를 자동화하는 서비스
IAM > 역할만들기
- 역할은 EC2에서 사용할 것임
- 신뢰할 수 있는 유형의 개체 선택 : AWS 서비스
- 이 역할을 사용할 서비스 선택 : EC2
- 정책 : AmazonEC2RoleforAWSCodeDeploy 체크
EC 인스턴스로 이동 > 인스턴스 우클릭 > 인스턴스 설정 > IAM 역할 연결/바꾸기 > 아까 역할 추가후 재부팅 (보안-IAM 연결 수정)
CodeDeploy 에이전트 설치
CodeDeploy의 요청을 받을 수 있도록 EC2에 에이전트를 설치한다.
EC2에서 다음 명령어 입력
aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap- northeat-2
chmod -x ./install
sudo ./install auto
CodeDeploy 권한 생성
- CodeDeploy가 EC2에 접근하려면 권한이 필요하다.
- IAM > 역할 생성
- 서비스 : AWS 서비스 > CodeDeploy
- 사용사례 선택 : CodeDeploy
- 권한 : AWSCodeDeployRole
CodeDeploy 생성
CodeDeploy > 애플리케이션 생성
컴퓨팅 플랫폼 : EC2/온프레미스
배포그룹 생성
- 서비스역할: CodeDeploy IAM 역할 선택
- 배포유형 : 현재 위치
- 환경 구성 : Amazon EC2 인스턴스
- 배포 구성 : CodeDeployDefault.AllAtOnce
- 로드 밸런서 : 로드 밸런싱 활성화 해제
http://m.yes24.com/Goods/Detail/83849117 해당 책을 참고하면 자세하게 설명되어있다...
IAM
- Identity and Access Management(IAM)는 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스. IAM을 사용하여 리소스를 사용하도록 인증(로그인) 및 권한 부여(권한 있음)된 대상을 제어함
- IAM > 사용자 추가
- 엑세스유형: 프로그래밍 방식 엑세스
- 권한 설정: 기존정책 직접 연결 > AmazonS3FullAccess , AWSCodeDeployFullAccess 체크
- 엑세스키와 비밀 엑세스 키는 잘 관리하도록한다..
S3 버킷
- AWS의 S3 서비스는 일종의 파일 서버임 (파일들을 저장하고, 접근 권한을 관리, 검색을 지원)
- S3 > 버킷 만들기
- 다른 건 기본설정..
- 퍼블릭 엑세스 차단 : 모든퍼블릭 엑세스 차단 체크
CodeDeploy
AWS CodeDeploy는 Amazon EC2 인스턴스 및 온프레미스에서 실행 중인 인스턴스를 비롯하여 모든 인스턴스에 대한 코드 배포를 자동화하는 서비스
IAM > 역할만들기
- 역할은 EC2에서 사용할 것임
- 신뢰할 수 있는 유형의 개체 선택 : AWS 서비스
- 이 역할을 사용할 서비스 선택 : EC2
- 정책 : AmazonEC2RoleforAWSCodeDeploy 체크
EC 인스턴스로 이동 > 인스턴스 우클릭 > 인스턴스 설정 > IAM 역할 연결/바꾸기 > 아까 역할 추가후 재부팅 (보안-IAM 연결 수정)
CodeDeploy 에이전트 설치
CodeDeploy의 요청을 받을 수 있도록 EC2에 에이전트를 설치한다.
EC2에서 다음 명령어 입력
aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap- northeat-2 chmod -x ./install sudo ./install auto
CodeDeploy 권한 생성
- CodeDeploy가 EC2에 접근하려면 권한이 필요하다.
- IAM > 역할 생성
- 서비스 : AWS 서비스 > CodeDeploy
- 사용사례 선택 : CodeDeploy
- 권한 : AWSCodeDeployRole
CodeDeploy 생성
CodeDeploy > 애플리케이션 생성
컴퓨팅 플랫폼 : EC2/온프레미스
배포그룹 생성
- 서비스역할: CodeDeploy IAM 역할 선택
- 배포유형 : 현재 위치
- 환경 구성 : Amazon EC2 인스턴스
- 배포 구성 : CodeDeployDefault.AllAtOnce
- 로드 밸런서 : 로드 밸런싱 활성화 해제
3_젠킨스 설정
젠킨스 - Jenkins 관리 - 플러그인 관리 - 다음 플러그인 설치 (AWS CodeDeploy Plugin for Jenkins)
이전에 설정한 Build-Execute Shell 부분에 자신의 프로젝트에 맞는 빌드명령어를 실행한다. (build, bootJar 등)
Build-Execute Shell 부분에 AWS CodeDeploy에서 사용할 파일(appspec.yml, start.sh)과 빌드된 jar를 포함하여 복사시킨다.
여기있는 파일들을 aws S3 Bucket으로 이동시킴 (zip)
CodeDeploy 말고 다른플러그인으로 S3 업로드만도 가능한데 그러면 여기서 미리 압축이 필요하다.
빌드 후 조치 추가 - Deploy an application to AWS CodeDeploy
AWS CodeDeploy Application Name : AWS CodeDeploy 에서 만든 어플리케이션 이름
AWS CodeDeploy Deployment Group : 설정한 그룹 이름
AWS CodeDeploy Deployment Config : 설정한 CodeDeploy 배포 구성
S3 Bucket : AWS S3 Bucket 이름
S3 Prefix : 버킷에 생성될 디렉토리
Subdirectory : 젠킨스 서버에서 포함될 파일이 저장될 디렉토리
Include Files : 포함될 파일
Use Access/Secret keys : AWS 에서 생성한 IAM 정보
젠킨스 빌드 후 AWS S3 버킷을 확인해보면 다음과 같이 설정한 디렉토리 밑에 zip 파일이 생기는 것을 확인할 수 있음
AWS CodeDeploy 에서 아까 생성한 애플리케이션을 들어가보면 다음과 같이 배포 이력을 볼 수 있음
- 배포 실패 시 /var/log/aws/codedeploy-agent 경로에서 로그확인 가능!!
appspec.yml 에 명시된 경로에 s3 zip파일이 풀려있는 것을 확인할 수 있다.
start.sh에 의해 jar가 복사되고 애플리케이션 로그를 볼 수 있는 nohup.out 파일이 생성된 것을 확인할 수 있음