
이번에는 Github Action과 AWS S3, CodeDeploy를 연동해보자.
먼저 IAM에 들어가서 좌측 역할을 클릭한다. 그럼 다음과 같은 화면이 나오는데 역할 만들기를 클릭한다.

AWS 서비스에 EC2를 클릭한다.

권한 설정은 AmazonEC2RoleforAWSCodeDeploy를 선택한다.

태그는 원하는 이름으로 짓는다.

최종적으로 확인 후 만들어준다.

이제 만든 역할을 EC2에 등록해보자. 인스턴스에 들어가 해당 인스턴스에 마우스 오른쪽 버튼을 클릭해서 보안 → IAM 역할 수정을 클릭한다. (Windows 기준)

방금 생성한 역할을 선택하고 저장한다.

그리고 인스턴스 재부팅을 한다. 재부팅을 해야 역할이 정상적으로 동작한다고 한다.

EC2 서버에 접속한다. 처음 접속하는 것이기에 기본 Setting부터 한다.
먼저 자바8를 설치한다.
sudo apt install openjdk-8-jdk다음은 타임존을 변경할 것이다. 기본 시간은 UTC로 되어있다. 다음 명령어를 실행한다.
sudo rm /etc/localtimesudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime만약 정상적으로 수행되었다면 date 명령어를 입력하면 타임존이 KST로 변경되있을 것이다.
이제 CodeDeploy agent를 설치해보자. 이곳을 참고했다.
다음 3개의 명령어를 입력한다. Ubuntu Server 버전에 따라 다르다. (아래 명령어는 16.04 이상 기준)
sudo apt update
sudo apt install ruby-full
sudo apt install wget
다음 명령어를 입력한다.
cd /home/ubuntu다음 명령어는 wget https://bucket-name.s3.region-identifier.amazonaws.com/latest/install이다. bucket-name과 region-identifier는 여기를 참고했다. 본인이 Amazon S3에 만든 버킷 기준이다.
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/installinstall 파일에 해당 권한이 없으니 추가한다.
chmod +x ./install이제 CodeDeploy agent를 설치하자. (Ubuntu 14.04, 16.04, 18.04 기준)
sudo ./install auto정상적으로 실행되고 있는지 다음 명령어로 확인할 수 있다. 동작하고 있다면 running이란 단어를 볼 수 있다.
sudo service codedeploy-agent status우선 IAM으로 가서 역할을 만든다. 그리고 AWS 서비스 → CodeDeploy를 선택하면 아래 사용 사례 선택이 나온다. 그림처럼 CodeDeploy를 클릭한다.

CodeDeploy는 권한이 하나이다. 선택 없이 넘어가자.

태그는 매번 똑같다. 원하는 아름으로 하자.

이제 역할 이름을 만들고 역할을 만들어주자.

CodeDeploy → 애플리케이션에 들어가서 애플리케이션 생성을 하자.

애플리케이션 구성은 다음과 같이 한다.

애플리케이션을 생성하면 배포 그룹을 생성하라고 할 것이다. 한 번 생성해보자.

배포 그룹 이름과 서비스 역할을 입력한다. 서비스 역할은 위의 CodeDeploy를 위한 권한 생성에서 만든 codedeploy-role을 선택한다. (역할 이름이 다르면 다를 수 있다.)

배포 유형은 현재 위치이다. (만약 배포할 서비스가 2대 이상이면 블루/그린 선택)

환경 구성은 Amazon EC2 인스턴스를 선택한다.

마지막으로 배포 구성은 다음 그림과 같이 선택하고 로드 밸런서는 체크하지 않는다. (배포 구성은 한 번 배포할 때 몇 대의 서버에 배포할지를 결정한다.)

EC2 서버에 폴더(app) 하나 만들어 준다.
/home/ubuntu/app appspec.yml 파일을 만들어 준다. 위치는 다음 그림과 같다.

appspec.yml 파일을 작성하자.
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/app/
overwrite: yes
source/를 지정하면 전체 파일destinationoverwrite # appspec.yml 파일 복사
- name: Copy appspec.yml
run: cp appspec.yml ./deploy
# ...
- name: CodeDeploy
run: aws deploy create-deployment --application-name springboot-with-githubaction --deployment-group-name springboot-with-githubaction-group --s3-location bucket=springboot-with-githubaction,key=springboor-with-githubaction.zip,bundleType=zip
appspec.yml도 S3에 보내야 하기 때문에 ./deploy 위치에 복사해준다.Amazon S3로부터 deploy하기 위해 작성된 명령어다. 여기를 참고했다.--application-name: CodeDeploy에서 만든 애플리케이션 이름이다.--deployment-group-name: 애플리케이션 만든 후 생성한 배포 그룹 이름이다.--s3-location: Amazon S3에 업로드 된 정보를 입력bucket: springboot-with-githubactionkey: springboor-with-githubaction.zipbundleType: zip정상적으로 동작했다면 CodeDeploy → 배포에서 성공을 확인할 수 있다.

처음에 CodeDeploy에 실패했다. "왜 실패했을까?" 생각했지만, 아래 문구만 나오고 이유를 정확히 알 수 없었다.

그러나 EC2 서버에서 CodeDeploy Agent Log를 확인할 수 있다고 한다. Log 위치는 /var/log/aws/codedeploy-agent/이다. 여기서 Log를 확인할 수 있다. (Github Action yml 파일에 오타가 있었다.)
Github Action을 사용한 Spring boot & gradle CI/CD 구축 - 3
스프링 부트와 AWS로 혼자 구현하는 웹 서비스(이동욱 님)
deploy 과정에서 252 에러뜨는 이유 아시나요ㅠㅠㅠ