본문 바로가기

AWS

AWS CodeDeploy와 Gtithub 이용해 배포하기

서론

Github Repository에 빌드한 파일이나 그 외 서버로 배포하고 싶은 파일들이 있는 경우 CodeDeploy를 이용해 EC2 Instance로 자동배포를 하기위한 글이다.

간단히 정리하자면

  • CodeDeploy를 통해 무엇인가를 배포할 것임.
  • 배포할 내용을 Github Repository에서 가져올 것임.
  • EC2 Instance에 배포할 것임.
  • CI는 안되니까 깃헙 푸쉬 후 Commit ID를 직접 복붙해야함.

몇가지 설정해줘야할 사항들이 있고, 이는 Github RepoistoryS3 를 이용하는 경우가 서로 다르다.

며칠 간 삽질을 하면서 인터넷과 블로그에 간혹 잘못 설명된 글이나 헷갈리게 설명된 부분들을 본 것 같아서 정리해본다. 삽질을 하면서 발견한 새로운 내용도 있기 때문에 작동은 하지만 잘못설명된 부분이 있을 수도 있으니 혹시 있다면 알려주세용...ㅎㅎ

해야하는 작업

크게 해야할 작업들은 아래와 같다.

  1. IAM Role 생성
    EC2 Instance가 배포과정에서 사용할 IAM Role이 하나 필요하다.
    CodeDeploy가 배포과정에서 사용할 IAM Role이 하나 필요하다.
    간혹 IAM User와 aws cli 설정을 하는 글들이 있었는데, 필요없다.
  2. EC2 Instance를 만들고 codedeploy-agent를 설치한다.
  3. Github Repoistory에 appspec.yml 이라는 deploy작업 관련 설정 파일을 커밋,푸쉬한다.
  4. CodeDeploy 앱을 만들고, 배포그룹을 만들고, 아까 해준 Commit에 대한 ID를 이용해 배포를 생성한다.

EC2 Instance를 위한 IAM Role 생성

trusted entity(신뢰할 수 있는 개체)

EC2 를 골라주고, 아무런 Policy를 선택하지 않은 채 Name만 적절히 설정해준 뒤 Role을 생성하자. (S3 를 이용할 경우라면 Policy를 골라주어야하는데 Github을 이용하면 아무 Policy도 필요없다. 형식적으로 Role만 설정해주면 된다. 굳이 왜 이렇게 하는 지 모르겠습니다. 아시는 분 계시면 알려주세요!)

CodeDeploy를 위한 IAM Role 생성

이번엔 신뢰할 수 있는 개체로 CodeDeploy를 선택하고 use case에 CodeDeploy를 선택해준다. 그 뒤 Policy는 AWSCodeDeployRole 를 하나 선택해준다. CodeDeploy 배포 과정이 수행할 수 있는 Role을 설정해주는 것 같은데 다른 작업은 필요없으니 그냥 AWSCodeDeployRole만 선택해주는 것이다.

EC2 Instance 생성, 설정

평소처럼 EC2 Instance(Ubuntu 18.04)를 생성해주고, 아까 EC2를 위해 생성했던 빈 IAM Role을 설정해준다. 나중에 Instance의 이름으로 CodeDeploy에서 Instance를 찾아낼 것이므로 Instance의 이름도 설정해주는 것이 좋다.

sudo apt update
sudo apt install ruby
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto

를 통해 codedeploy-agent에 필요한 rubycodedeploy-agent를 설치해준다.

codedeploy-agent는 CodeDeploy 앱이 배포 명령을 내리는 것을 수신하고 작업을 수행하는 역할을 하는 프로그램인듯하다. 이 친구가 없으면 CodeDeploy 가 EC2와 작업을 하지 못한다.

sudo service codedeploy-agent start && sudo service codedeploy-agent status 를 통해 codedeploy-agent를 실행시켜주고 Active한 상태인지 확인해본다.

github repository 설정 및 appspec.yml 작성

#/appspec.yml
# version은 0.0을 적어준다.
version: 0.0
# 선택한 ec2 가 window server가 아니라면 linux를 적어준다.
os: linux
files:
# source는 프로젝트 기준, destination은 instance 기준으로 입력해주고, 
# source가 destination안에 복사됨
  - source: /
    destination: /home/ubuntu/build
hooks:
# 주의 할 점은 빈칸 yml파일 특성상 빈칸 개수를 중시해야하고 Tab을 쓰면 안된다는점
# AfterInstall앞은 2칸이다.
  AfterInstall:
# location은 프로젝트 기준으로 위치를 작성해준다!
    - location: /start.sh
# runas를 입력해주지 않으면 간혹 permission error가 날 수도
      runas: root

그리고 /start.sh로 앱이 배포되며 Install 단계를 거친 뒤 수행할 sh 명령을 작성해주자. 배포 관련 사이클은 codedeploy hook 관련해 검색해보면 찾을 수 있다.

pwd>/home/ubuntu/locationstart.sh는 이렇게 간단하게 한 줄만 적어주자. 파일명은 자기 편할 대로 적어주되 hooks의 location과는 일치해야함.

현재 배포 작업을 수행 중인 위치를 /home/ubuntu/location 이라는 파일에 출력해주는 간단한 shell script이다.

간단하게 프로젝트의 구조를 찍어봤다. 최상위에 appspec.ymlstart.sh가 위치해있다.

커밋푸쉬해주자.

CodeDeploy 설정하고 배포하기

EC2 에 배포할 계획이므로 사진과 같이 애플리케이션을 생성해준다.

아까 생성한 CodeDeploy를 위한 IAM Role을 선택해준다.

배포 방법은 간편하게 테스트 배포해보기만 할 용도이므로 현재위치(블루/그린X) 환경은 EC2 Instance, 아까 설정한 Instance의 이름을 통해 Instance를 필터해낸다.

밑에 1개의 인스턴스를 찾았다는 내용이 떠야함.

배포설정은 간편하게 AllAtOnce로 하고 인스턴스도 어차피 한 개이므로 로드밸런서도 비활성화해준다.

배포생성을 해주자.

자신의 github과 연결 후 github repositorycommit id를 입력해준다.

배포 생성에서 다른 설정을 건드릴 것은 딱히 없다.

배포 진행 후

배포가 성공되었다면 사진처럼 location이라는 파일과 build라는 디렉토리가 생성되었을 것이다.

locationpwd 명령어의 output이었으므로, appspechooks/opt/codedeploy-agent 위치를 기준으로 수행된 다는 것을 알 수 있고,

build 디렉토리는 Github에 올렸던 Repository와 동일한 내용을 갖고 있어야한다.

그럼 배포 끝!

각종 에러에 관해

log 보는 법

text로 된 난잡한 로그를 까보는 것은 다소 적대감이 들지만, CodeDeploy를 이용한다면 안고가야할 문제...

/var/log/aws/codedeploy-agent/codedeploy-agent.log를 이용해 로그를 볼 수 있는데, Succeed가 나오면 성공이고, Failed가 나오면 보통 오류가 난 것이다.

Access Denied는 주로 EC2 가 Role을 부여받지 못했을 때 생기고 S3 를 이용할 경우, Role을 부여받았다 하더라다고 그 Role 의 세부 Policy 내용에 S3에 대한 권한이 없다면 Access Denied가 뜬다.

he CodeDeploy agent did not find an AppSpec file within the unpacked revision directory at revision-relative path \\\"appspec.yml

로그를 까봤더니 와 같이 appspec.yml을 찾을 수 없다는 문구가 나온다면 자신이 최상위 경로에 appspec.yml을 위치시킨 게 맞는지, 오타를 낸 것은 아닌지, appspec.yaml로 작성한 것은 아닌지 확인해보자.

source가 제대로 정의 되지 않았다는 내용 의외로 source 자체보단 yml 형식 관련한 문제일 수 있는데, 들여쓰기가 처음 되는 곳이 source라 여기서 에러가 난 것. 들여쓰기가 탭으로 된 건 아닌지, 몇칸 들여써졌는지 확인해보자.

마치며

별 거 아닌 작업일 수 있지만, 며칠간 여러 한국 블로그, aws reference, 외국 블로그 등등 여기저기 들쑤시며 삽질을 한 뒤 정리한 내용이다. travisCI를 처음 이용할 때에는 뭔가 페이지도 예쁘고 동작하는 것도 꽤나 잘 확인이 되어서 쉬웠는데, CodeDeploy는 좀 칙칙하기도했고( 배포하는 데 뭘 어떻게 예쁘게하겠냐;;) 삽질을 좀 많이해서 쉽지 않았다.

특히나 배포 할 수 있는 옵션은 많고 자료가 AWS Ofiicial 외엔 그리 많지 않았어서 더 어려웠던 것 같다. 사실 간단히 쭉 따라만 해도 되기는 하는데, 각종 글마다 다르게 소개된 옵션들이 왜 그런지 파헤치는 성격이다보니 좀 오래걸렸다. S3 저장소를 이용하는 것도 혼자서는 작업해봤는데, 나중에 시간이 되면 정리해봐야겠다. 그 다음에서야 CodePipeline이용해서 제대로 CI/CD 이용할 수 있겠지. 어서 CI/CD를 제대로 구축해볼 수 있길!