티스토리 뷰

이전 글에서 웹 서비스 운영을 위해 백엔드 소스를 직접 EC2로 git clone 하여 실행하는 방식을 사용하였습니다. 하지만 소스가 변경될 때마다 EC2에 접속해서 계속 git pull 받고 재실행 해야하는 번거로움이 있었습니다. 따라서 이번에는 AWS Code Series를 통해 자동으로 백엔드 소스를 배포하고 실행하는 방법을 살펴보겠습니다.

 

1. EC2 인스턴스 역할 생성하기

CodePipeline을 사용할 때 CodeCommit의 소스 아티팩트나 CodeBuild의 결과 아티팩트를 S3에 저장하게 됩니다. 따라서 해당 아티팩트를 사용하여 배포 과정을 진행해야 하므로 EC2에서 S3에 접근할 수 있는 역할을 생성하여 부여해야 합니다.

 

"IAM > 역할 > 역할 만들기"를 클릭하여 아래와 같이 EC2 역할을 생성합니다.

 

EC2 서비스 선택
AmazonEC2RoleforAWSCodeDeploy 정책 추가 (내용은 S3 접근에 대한 것임)
역할 이름 지정

 

2. EC2 인스턴스 역할 변경하기

백엔드 소스가 배포되어 실행되고 있는 EC2를 선택하고 "작업 > 보안 > IAM 역할 수정"을 찾아 위에서 생성한 역할로 변경합니다.

 

 

3. EC2에 codedeploy-agent 설치하기

ssh 방식으로 EC2에 접속하여 아래 명령을 통해 ruby와 codedeploy-agent를 설치합니다.

 

$ ssh -i pem경로 사용자이름@ec2의_퍼블릭_IPv4_주소_또는_도메인

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

 

4. appspec.yml 파일 작성하기

CodeDeploy에서 사용하는 파일은 appspec.yml 파일입니다. 백엔드 프로젝트의 최상위 디렉토리 밑에 appspec.yml 파일을 생성합니다.

 

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ec2-user/build

permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

hooks:
  BeforeInstall:
    - location: /scripts/initialize.sh
      runas: ec2-user

  ApplicationStart:
    - location: /scripts/start.sh
      runas: ec2-user

 

permissions 설정이 없는 경우 codedeploy로 전달된 파일의 사용자/그룹은 모두 root입니다. 현재 EC2의 기본 사용자가 ec2-user이기 때문에 배포 파일들도 모두 ec2-user에게 권한이 있도록 변경하기 위해 permissions 설정을 사용합니다.

 

CodeDeploy의 Hook을 통해 소스를 EC2에 배포한 이후에 실행하고 실행 결과를 확인하는 스크립트를 실행할 수 있습니다.

https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html

 

AppSpec 'hooks' 섹션 - AWS CodeDeploy

배포의 Start, DownloadBundle, Install, BlockTraffic, AllowTraffic 및 End 이벤트는 스크립팅할 수 없기 때문에 이 다이어그램에서 회색으로 표시됩니다. 그러나 AppSpec 파일의 'files' 섹션을 편집하여 Install 이벤

docs.aws.amazon.com

 

백엔드 프로젝트의 최상위 폴더 아래에 scripts 라는 디렉토리를 생성하고 initialize.sh, start.sh 스크립트를 작성합니다.

 

initialize.sh 파일 내용은 아래와 같습니다. 기존에 build 디렉토리 내용이 있는 경우 해당 디렉토리를 삭제하는 명령을 실행합니다.

if [ -d "/home/ec2-user/build"]; then rm -Rf "/home/ec2-user/build"; fi

 

프로젝트 파일이 모두 옮겨진 뒤, ApplicationStart hook을 통해 start.sh 파일이 실행됩니다. 내용은 다음과 같습니다.

 

# nvm에 대한 환경변수를 설정
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ]&& \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

cd /home/ec2-user/build

# 원래 node 프로세스 종료
sudo kill -9 `ps -ef | grep 'node server' | awk '{print $2}'`
nohup npm start > /home/ec2-user/logs 2>&1 &

 

먼저 nvm을 설치 및 실행하고 백엔드 프로젝트가 옮겨진 build 디렉토리로 이동합니다.

 

그리고 현재 node server 텍스트를 포함하고 있는 프로세스를 찾아 실행을 종료시킵니다. ps -ef  는 현재 실행 중인 프로세스를 표시합니다. grep 'node server'  는 node server 라는 문자열이 포함된 라인(행)을 출력합니다. awk '{print $2}' 는 표준출력으로 부터 2번째 필드를 출력합니다. 이때 출력되는 2번째 필드가 PID 입니다. 위 명령어들을 `(백틱) 문자로 감싸고 있는 경우 먼저 실행되므로 ``내 명령을 통해 PID를 찾아 종료한다는 의미입니다.

 

이후 백그라운드에서 npm start 명령을 실행하고 로그와 에러에 대한 내용을 /home/ec2-user/logs 파일에 적어줍니다. nohup 키워드는 터미널이 종료되어도 중단없이 실행하겠다는 뜻이고 & 는 백그라운드에서 실행하겠다는 의미입니다. 즉 codedeploy가 node를 실행한 뒤 터미널을 종료하고 배포를 완료해야하기 때문에 node는 백그라운드에서 중단없이 실행하는 방식을 사용하게 됩니다.

 

5. CodeDeploy가 사용할 역할 생성하기

CodeDeploy에서 사용할 역할을 생성합니다. CodeDeploy 서비스를 선택하면 정책이 하나밖에 나오지 않습니다. 해당 정책을 선택하고 새로운 역할을 생성합니다.

 

CodeDeploy 선택
AWSCodeDeployRole 정책 선택
역할 이름 지정

 

6. CodeDeploy 애플리케이션 및 배포 그룹 생성하기

배포에 대한 내용을 구성하기 위해 "CodeDeploy > 애플리케이션"으로 이동하여 새로운 애플리케이션을 생성합니다.

 

 

위에서 생성한 애플리케이션 내에 배포 그룹을 생성합니다. 서비스 역할 선택 시 위(5번)에서 생성한 CodeDeploy가 사용할 역할로 생성한 서비스 역할을 지정해줍니다.

 

 

7. CodePipeline 생성하기

이제 CodeCommit으로 수정된 소스가 push 되는 경우, CodePipeline을 통해 자동으로 CodeDeploy가 동작하도록 설정해보겠습니다.

 

파이프라인 설정, 아티팩트가 저장될 버킷 지정
소스 설정, 백엔드 프로젝트 리포지토리와 브랜치 선택
node + express 의 경우 별도의 빌드가 필요하지 않기 때문에 건너뛰기
배포 설정

 

해당 파이프라인이 정상적으로 동작하는 경우, ssh로 EC2에 접속하여 아래 명령을 실행하면 node가 9090 포트로 실행중인 것을 확인할 수 있습니다.

 

$ netstat -lntp | grep 9090

 

브라우저에서 http://CloudFront_배포_도메인_이름/index.html 로 접속하면 기존에 정상적으로 작동하던 웹 서비스를 확인할 수 있습니다.

 


지금까지의 내용을 구조화하여 살펴보면 다음과 같습니다.

 

 

참고

- kill, ps, grep, awk: https://basketdeveloper.tistory.com/49

- nohup: https://joonyon.tistory.com/98

- CodeDeploy: https://senticoding.tistory.com/91?category=790444 

- CodePipeline: https://jojoldu.tistory.com/283

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함