git action AWS Ec2 배포하기 3

Git Action Ec2 Codedeploy 자동배포 하기 3.

AWS의 설정을 모두 마치고 git에서 git action을 통해 자동배포를 진행해보도록 한다.
자동 배포를 진행하기위해 진행해야 하는 과정은 다음과 같다.

  1. git action workflow 작성
  2. appspec.yml 작성
  3. .sh 스크립트 작성

3가지의 과정을 하나씩 진행해보자.

git action workflow 작성하기

git action이란?

github의 저장소를 기반으로 하여 작성한 스크립트를 이용하여 작업을 진행해주는 서비스이다.
git workflow는 저장소에서 일어나는 특성 이벤트시 구동될 스크립트를 작성해주고 git이 이벤트를 감지하여 테스트, 배포 등의 작업을 진행한다.
작업의 환경은 window, mac, linux 환경에서 구동 할 수 있으며 다양한 스크립트의 샘플이 존재하고 있다.

git action workflow작성하기

먼저 작업을 진행하던 레파지토리로 들어간다. 이후 상단의 action 탭을 클릭하면 다음과 같은 화면이 보여진다.

이후 node.js 워크플로우를 클릭하여 샘플 스크립트를 받는다. 샘플 스크립트의 형태는 다음과 같다.


해당 스크립트를 이용하여 작업을 진행하기 위해 우측 상단의 커밋실행을 누르고 로컬 작업 환경으로 레파지토리를 pull로 업데이트를 해준다.

그러면 우리의 로컬 작업 폴더에 다음과 같은 폴더와 파일이 추가된다. 폴더구조는 다음과 같다.


node.js.yml파일을 수정하여 자동배포를 위한 과정을 작성해주면 된다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# node.js.yml
name: Build & Deploy
env:
PROJECT_NAME: Nestjs-app
on:
push:
branches:
- main

jobs:
build:
runs-on: ubuntu-18.04
steps:
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2

- uses: actions/checkout@v2
- name: Use Node.js
uses: actions/setup-node@v1
with:
node-version: '14.x'

- name: delete package-lock.json
run: rm package-lock.json

- name: Install Dependencies
run: npm install

- name: Build
run: npm run build

- name: Create env file
run: |
mkdir secret
cd secret
touch .env.development
cat << EOF >> .env.development
${{ secrets.ENV }}
EOF
cd ../

- name: Make tar file
run: tar -cpvzf ./$GITHUB_SHA.tgz *
shell: bash


- name: Upload to S3
run: |
aws s3 cp \
--region ap-northeast-2 \
./$GITHUB_SHA.tgz s3://nestjs-s3-test/$PROJECT_NAME/$GITHUB_SHA.tgz

- name: Code Deploy
run: aws deploy create-deployment --application-name Nesjs-App --file-exists-behavior OVERWRITE --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name Nestjs-group --s3-location bucket=nestjs-s3-test,bundleType=tgz,key=$PROJECT_NAME/$GITHUB_SHA.tgz

전체적인 내용은 이렇게 생겼다. 부분적으로 이해를 해보자면

1
2
3
4
on:
push:
branches:
- main

on 태그는 어떤 이벤트가 일어날때 밑에 작성한 스크립트를 실행할지 정하는 것이다. 여기서는 main브랜치에 push가 될때 작업을 실행하기로 지정해두었다.

1
2
3
jobs:
build:
runs-on: ubuntu-18.04

git action 작업을 우분투 환경에서 실행한다는 의미이며 윈도우나 맥 또다른 리눅스 OS를 사용하여 작업해도 된다. 하지만 Ec2인스턴스에 배포할 예정이기 때문에 리눅스 환경에서 작업하는 것을 추천한다.

1
2
3
4
5
6
7
steps:
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2

steps는 밑으로 나열된 작업들을 순차적으로 실행한다는 의미이다. 먼저 aws에 사용자 인증을 위해 인증 절차를 진행해준다. secrets. 으로 작성된 부분은 git 레파지토리 세팅 탭에서 작성할수 있으며 비밀키 갑을 불러와 과정을 진행한다. 자세한 내용은 생략하도록 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- uses: actions/checkout@v2
- name: Use Node.js
uses: actions/setup-node@v1
with:
node-version: '14.x'

- name: delete package-lock.json
run: rm package-lock.json

- name: Install Dependencies
run: npm install

- name: Build
run: npm run build

- name: Create env file
run: |
mkdir secret
cd secret
touch .env.development
cat << EOF >> .env.development
${{ secrets.ENV }}
EOF
cd ../

nodejs기반 프로젝트를 빌드하기위해 nodejs 환경에서 다음의 작업을 진행한다라고 명시해준 후 pakage-lock.json파일을 지워준다. 이유는 애초에 깃에 올리지 않아도 되지만 올려진 상태에서 리눅스에서 npm install을 할 경우 윈도우 작업 환경과 충돌하는 패키지가 있을 수 있기 때문에 지우고 다시 npm install을 통해 생성해준다.
이후 빌드 과정을 거친 후 env파일을 생성해준다.
폴더를 만들고 진행하는 이유는 gitignore에 걸려서 s3에 같이 업로드가 안되길래 새로운 폴더를 통해 작성하고 ec2환경에서 다시 복사해오는 방식을 선택했다… 더 좋은 방법이 있겠지만 해당 방법을 택했다…

1
2
3
4
5
6
7
8
9
10
11
12
13
- name: Make tar file
run: tar -cpvzf ./$GITHUB_SHA.tgz *
shell: bash


- name: Upload to S3
run: |
aws s3 cp \
--region ap-northeast-2 \
./$GITHUB_SHA.tgz s3://nestjs-s3-test/$PROJECT_NAME/$GITHUB_SHA.tgz

- name: Code Deploy
run: aws deploy create-deployment --application-name Nesjs-App --file-exists-behavior OVERWRITE --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name Nestjs-group --s3-location bucket=nestjs-s3-test,bundleType=tgz,key=$PROJECT_NAME/$GITHUB_SHA.tgz

프로젝트 폴더내용을 압축하여 S3버킷에 업로드하는 과정 이후 codedeploy가 해당 파일을 읽고 실행할 수 있도록해주는 내용이다. 조금 디테일하게 보자면

  • ‘./$GITHUB_SHA.tgz s3://버킷이름/$PROJECT_NAME/$GITHUB_SHA.tgz’
  • ‘–application-name 애플리케이션 이름’
  • ‘–deployment-group-name 배포그룹이름’
  • ‘–s3-location bucket=버킷이름,bundleType=tgz,key=$PROJECT_NAME/$GITHUB_SHA.tgz’ <- 압축한 파일 이름과 경로

appspec.yml 작성

해당 파일은 Codedeploy배포시 ec2인스턴스 내에서 실행 하게 될 스크립트를 정의하는 파일이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# appspec.yml
version: 0.0
os: linux

files:
- source: /
destination: /home/ec2-user/nest-app
permissions:
- object: /home/ec2-user
pattern: '**'
owner: root
group: root
hooks:
BeforeInstall:
- location: scripts/before_deploy.sh
runas: root
AfterInstall:
- location: scripts/after_deploy.sh
runas: root

내용의 구성은 스크립트가 실행될 디렉토리를 적고 해당 위치에서 실행될 스크립트 파일의 이름을 지정한다.
BeforeInstall은 프로젝트가 실행되기 이전의 작업을 지정해놓은 파일이고 AfterInstall은 프로젝트 앱을 실행할 스크립트의 파일이다.

1
2
3
4
5
6
7
8
9
# scripts/before_deploy.sh
#!/bin/bash
REPOSITORY=/home/ec2-user
cd $REPOSITORY


pm2 kill

sudo rm -rf nest-app

많은 내용을 포함하여 작성해도 되지만 여기서는 간단하게 작업을 진행했다.

  1. pm2로 실행되고 있는 프로세스를 모두 종료한다. 하나의 인스턴스에 여러개의 노드를 사용하는 프로세스가 있다면 한번에 종료시키는 명령어는 문제가 될 수 있기때문에 주의가 필요하다.
  2. 기존의 프로젝트 폴더를 삭제해준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# scripts/after_deploy.sh
#!/bin/bash
REPOSITORY=/home/ec2-user/nest-app
cd $REPOSITORY

# nvm 환경변수 등록
export NVM_DIR="/home/ec2-user/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

cd secret
sudo mv .env.development ../
cd ../
rm -rf secret

npm start
  1. workflow에서 생성한 env파일을 프로젝트의 루트 디렉토리로 옮겨 와주는 작업을 한다.
  2. 이후 start 스크립트를 실행하여 프로젝트를 구동 시킨다.

nvm 환경변수 등록은 npm 명령어가 인스턴스에 직접 접속했을때는 실행되는데 배포과정에서는 실행되지 않는 문제가 있어서 환경변수를 등록하고 사용하는 과정이다.


모든 스크립트 파일을 작성했으니 다음과정에서 배포가 되는지 테스트를 진행해보도록 한다.

Author

han Ju Ryeon

Posted on

2021-09-09

Updated on

2021-12-05

Licensed under

댓글