본문 바로가기

AWS

AWS CodeDeploy와 S3 이용해서 배포하기

서론

CI 툴을 이용해서나 빌드를 마친 파일이나 간단하게 테스트 해볼 파일을 S3CodeDeploy를 이용해 EC2 Instance로 자동배포하기 위한 글이다.

간단히 정리하자면

  • CodeDeploy를 통해 S3에 있는 데이터를 배포할 것이다.
  • 배포할 목적지는 EC2 Instance
  • CI는 안되니까 배포하고 싶은 파일을 .zip으로 압축하여 S3 Bucket에 업로드 해야함.

해야하는 작업

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

  1. IAM Role 생성
    EC2 Instance가 배포과정에서 사용할 IAM Role이 하나 필요하다. 자세한 내용은 아래서 언급.
    CodeDeploy가 배포과정에서 사용할 IAM Role이 하나 필요하다.
    IAM Useraws cli는 필요 없음!
  2. EC2 Instance를 만들고 codedeply-agent를 설치한다.
  3. appspec.yml을 최상위경로에 두는 프로젝트를 .zip으로 압축한다.이후 S3에 업로드한다.
  4. CodeDeploy 앱을 만들고, 배포그룹을 만들고, 아까 업로드한 S3 버킷 내의 file을 이용해 배포를 생성한다.

EC2 Instance를 위한 IAM Role 생성

trusted entity(신뢰할 수 있는 개체)로 EC2 를 골라주고 Role의 Policy는 AmazonEC2RoleforAWSCodeDeploy 를 선택해준다. Role의 이름은 편한 대로 설정.


나의 삽질 부분

: Github Repository를 이용할 때는 아무 Policy도 설정안했잖아요?

→ 맞다 하지만 이번엔 Github Repo가 아닌 S3에서 빌드된(혹은 아무거나 배포하고싶은)파일을 서버에 배포하는 것이기 때문에 S3에 대한 접근이 가능하다는 Policy를 부여해주어야한다.

사진과 같이 Role의 이름은 AWSCodeDeploy를 위한 EC2의 Role이라고 하지만, 정작 내용은 S3 에 대한 내용. 따라서 꼭 EC2RoleforAWSCodeDeploy가 아니라 S3ReadOnly 등의 Policy를 부여해도 CodeDeploy가 잘 작동한다. 하지만 S3 Read에 관한 Role을 부여하지 않는다면 Access Denied!와 함께 CodeDeploy가 잘 작동하지 못한다.


CodeDeploy를 위한 IAM Role 생성

trusted entity(신뢰할 수 있는 개체)CodeDeploy로 선택. Use case(사용 사례)EC2에 배포할 것이므로 CodeDeploy를 선택해준다. 이후 Role은 어차피 AWSCodeDeployRole을 선택(어차피 이거밖에 안 뜰 것임).

이 Role의 이름은 deploy-s3-role이라고 설정했다.

EC2 Instance 생성, 설정

EC2 를 생성하고, codedeploy-agent를 설치하는 부분까지는 Github Repository를 이용했을 때와 동일하다(appspec.yml 설정이전 까지는 동일하다는 말).

평소처럼 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한 상태인지 확인해본다.

appspec.yml 작성 및 S3에 .zip 업로드

appspec.yml은 Github Repo를 이용했을 때와 동일하다.

#/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이다.

이제 위와 같은 구조로 tutorial.zip 이라는 압축파일을 만들어준다.

그럼 이제 S3 버킷을 만들어보자.

사실 아무 설정할 필요가 없어서 언급을 딱히 안 해도 되지만 웬만하면 S3를 이용할 떄 모든 퍼블릭 액세스 차단을 체크한 채로 사용하는 것이 보안상 좋다.

버킷이 생성되면 아까 만든 .zip file을 업로드 해주자. 업로드 시에도 권한도 딱히 건드릴 게 없는데, 읽기에만 체크가 되어있으면 된다.

이렇게 난 codedeploy-tutorial-007이라는 버킷에 tutorial.zip 이라는 zip file을 업로드 했다.

CodeDeploy 설정하고 배포하기

애플리케이션 생성은 그냥 간단히 EC2/온프레 로 설정해주기만 하면 되고

배포 그룹에서의 Role도 아까 CodeDeploy를 위한 Role에서 생성한 Role을 부여해주면된다. 전체적으로 Github Repo를 이용할 때와 같음. 간단한 테스트를 하므로 로드밸런싱을 비활성화!

이제 진짜 배포 생성을 해줄 것인데, Github Repo를 이용할 때와 다른 점은 바로 이 곳!

개정 위치 밑에 나온 안내에 따라 s3 속 파일의 위치를 적어준다.

배포가 잘 되었다면 위의 사진들처럼 성공표시가 떠야하고 우리가 배포하려던 파일들이 정상적으로 위치해있어야한다.

그럼 배포 끝!

각종 에러 및 로그 보는 법에 관해

이 부분은 Github Repo를 이용하는 곳에 모두 적어두었으니 CodeDeploy와 Github 이용해 배포하기를 참고하자.

마치며

사실 Github Repo랑 거의 동일한 작업들로 이루어져 금방할 수 있었지만, 대체 왜 S3 관련 Policy를 Role에 부여해도 작동하는지, Github Repo를 이용할 땐 왜 빈 Policy를 부여해도 작동하는지 생각하고 분석해보느라 오래걸렸다. 뇌피셜이긴 하지만 아마 내가 위에서 언급한 대로 EC2RoleforAWSCodeDeploy라는 Policy의 이름은 전반적으로 CodeDeploy를 이용할 때 필요한 Policy같지만, 사실 S3를 이용해 배포할 때에만 필요한 것이라는 게 맞는 사실인 것 같다. 대체 왜 Policy 이름을 저렇게 했는지.... Ec2RoleforAWSCodeDeployWithS3이런식으로 해줘야 맞는 거 아닌가싶다.

CI 과정없이 Deploy 자동화하는 작업이라서 꽤나 불편해보일 수 있는데, 어서 CI작업까지 연결시켜서 정말 간편하게 자동 빌드, 배포 할 수 있기를~~