본문 바로가기
Java/Spring

[deploy] Github Action / S3 / CodeDeploy / EC2

by java개발자 2021. 5. 14.

1년 전의 블로그들을 보더라도 Travis를 사용해서 Build를 했지만

이젠 github action(2019년)이 나와서 Travis조차도 필요없게 되었다.

아마 곧? 지금도? S3가 필요없을지도 모르겠다.

점점 CI/CD가 간소화된다.

 

개요:

1. Github main branch에 소스코드를 push하면, 자동으로 감지하여

Github Action에서

- 빌드하고,

- 빌드결과인 jar와 관련된 파일(appspec.yml, deploy.sh)을 zip으로 압축한 다음에,

- S3로 파일을 업로드 하고,

- CodeDeploy기능을 실행한다.(= 업로드 된 파일을 EC2로 전송, 임의 공간에 압축 해제, appspec.yml의 내용을 실행)

(소스코드ROOT/.github/workflows/main.yml에 관련된 내용이 정의되어야 한다.)

2. appspec.yml에는 deploy.sh을 실행하라고 정의해 놓는다.

3. deploy.sh에는 jar를 실제 실행하는 shell script를 포함한다.

 

할일:

1. github 계정 생성, github에 소스 push

2. AWS S3 버킷 생성 및 기본 세팅

3. AWS 사용자 추가해서 accessKey, secretAccessKey, bucketName 준비(나중에 github action -> S3로 zip 파일 올릴때 사용함.)

- accessKey, secretAccessKey을 target repository > settings > secrets 에 저장하고, main.yml에서 변수로 사용함.

4. EC2 생성 및 ssh로 접속해서 서버 기본 세팅

5. IAM에서 EC2-CodeDeploy관련 역할을 생성해서 EC2에 연결 -> EC2 재시작

6. EC2 서버에 Code Deploy Agent 설치

- wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install

- chmod +x ./install

- sudo ./install auto

- sudo service codedeploy-agent status

- ruby 때문에 설치 안되면: sudo apt-get install ruby

7. IAM에서 CodeDeploy관련 역할 생성해서 CodeDeploy에 연결(애플리케이션 생성 -> 배포그룹 생성 -> 배포 생성)

- 배포 생성은 수동으로 CodeDeploy기능을 실행하는 것이다.(그래서 실제로는 사용하지 않고, github action에서 명령어로 실행할 예정)

- 배포 생성할 때, 소스코드 위치를 지정할 수 있다. S3 또는 github

- S3로 하면 (github action에서 build해준 zip파일만 EC2에 가져와서 appspec.yml을 실행하면 되지만)

- github로 하면, S3를 거치지 않아도 되지만, EC2에서 빌드를 해야 할 듯...(아마도~ 해보진 않았다.)

- S3로 지정하고, 배포 생성하면, S3에 있는 zip파일을 EC2 서버로 가져온다.(CodeDeploy의 임시 공간에 압축 해제하고, appspec.yml(deploy.sh)를 읽어서 실행한다. 그래서 zip을 만들때, appspec.yml, deploy.sh이 root에 있어야 한다.)

 

CodeDeploy

배포 생성을 수동으로 몇 번 하였는데 에러가 발생했다.항상 아래와 같은 에러가 나와서 원인을 알 수 없다.

The overall deployment failed because too many individual instances failed deployment, too few healthy instances are available for deployment, or some instances in your deployment group are experiencing problems.

그래서 EC2 서버의 로그파일을 확인해야 한다.

/var/log/aws/codedeploy-agent/codedeploy-agent.log

에러 원인(로그 내용)

1. InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Missing credentials - please check if this instance was started with an IAM instance profile

원인: CodeDeploy에 역할을 연결하기 전에 Agent를 먼저 실행하면 그렇다더라...

해결: Agent 재실행

sudo service codedeploy-agent restart

2. IAM 역할이 설정되지 않은 경우(EC2, CodeDeploy 모두 되어야 한다.)

3. appspec.yml을 찾지 못한 경우... zip파일 ROOT에 함께 압축해야 한다.

4. deploy.sh을 찾지 못한 경우... zip파일 ROOT에 함께 압축해야 한다.