IT STUDY LOG

Sprint - 서버 배포 파이프라인 본문

devops bootcamp 4/pair/team log

Sprint - 서버 배포 파이프라인

roheerumi 2023. 4. 24. 15:14

#학습 목표

  • 서버 배포 자동화 파이프라인을 구축하는 실습을 진행

 

#해결 과제

💡 AWS 개발자 도구 서비스를 이용해서 배포 자동화 파이프라인을 구축해야 함

  1. CodePipeline을 이용해서 각 단계를 연결하는 파이프라인을 구축
  2. Source 단계에서 소스 코드가 저장된 GitHub 리포지토리를 연결
  3. Deploy 단계에서 CodeDeploy 서비스를 이용하여 EC2 인스턴스에 변경 사항을 실시간으로 반영

💡나중에 변경 사항을 GitHub 리포지토리에 반영했을 경우, 배포 과정이 자동으로 진행되어야 함

💡배포 과정에서 오류가 생길 경우, log 파일을 참조하여 문제점을 확인할 수 있어야 함

 

#실습 자료

레파지토리 

 

#과제 항목별 진행 상황

✏️ EC2 인스턴스 생성 후 개발 환경 구성

Step 1 : 패키지 매니저가 관리하는 패키지의 정보를 최신 상태로 업데이트

$ sudo apt update

 

Step 2 : NVM GitHub 설치 

# nvm 설치
$ sudo curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 15916  100 15916    0     0   145k      0 --:--:-- --:--:-- --:--:--  146k
=> Downloading nvm from git to '/home/ubuntu/.nvm'
=> Cloning into '/home/ubuntu/.nvm'...
remote: Enumerating objects: 359, done.
remote: Counting objects: 100% (359/359), done.
remote: Compressing objects: 100% (305/305), done.
remote: Total 359 (delta 40), reused 168 (delta 28), pack-reused 0
Receiving objects: 100% (359/359), 219.46 KiB | 8.44 MiB/s, done.
Resolving deltas: 100% (40/40), done.
* (HEAD detached at FETCH_HEAD)
  master
=> Compressing and cleaning up git repository

=> Appending nvm source string to /home/ubuntu/.bashrc
=> Appending bash_completion source string to /home/ubuntu/.bashrc
=> Close and reopen your terminal to start using nvm or run the following to use it now:

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"  # This loads nvm bash_completion

# 환경변수 등록
$ 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"  # This loads nvm bash_completion

# 정상적으로 설치되었는지 nvm 버전 확인
$ nvm --version
0.39.3

Step 3node.js 설치

$ nvm install node

Step 4 npm 정상 작동을 위해 npm 설치

$ sudo apt install npm

Step 5 : 프로젝트 최상위 경로에 appspec.yml 파일 작성

# appspec.yml

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/sprint-practice-deploy-for04

hooks:
  ApplicationStop:
    - location: scripts/stop.sh
      runas: root
  AfterInstall:
    - location: scripts/initialize.sh
      runas: root
  ApplicationStart:
    - location: scripts/start.sh
      runas: root

Step 6 : 프로젝트 최상위 경로에 scripts 디렉토리 생성 후 스크립트 파일 작성

1. scripts/initialize.sh

#!/bin/bash
cd /home/ubuntu/sprint-practice-deploy-for04/server
npm install
npm install pm2@latest -g
sudo apt-get update
sudo apt-get install authbind
sudo touch /etc/authbind/byport/80
sudo chown ubuntu /etc/authbind/byport/80
sudo chmod 755 /etc/authbind/byport/80

2. scripts/start.sh

#!/bin/bash
cd /home/ubuntu/sprint-practice-deploy-for04/server
authbind --deep pm2 start app.js

3. scripts/stop.sh

#!/bin/bash
cd /home/ubuntu/sprint-practice-deploy-for04/server
pm2 stop app.js 2> /dev/null || true
pm2 delete app.js 2> /dev/null || true

 

✏️ EC2 인스턴스에 태그와 역할 부여

Step 1 : EC2 인스턴스에 태그 부여

 

Step 2 : EC2 인스턴스에 역할 생성 및 부여

1. EC2 인스턴스 > 작업 > 보안 > IAM 역할 수정

2-1. IAM 역할 수정 > 새 IAM 역할 생성

2-2. 신뢰할 수 있는 엔터티 선택 : AWS 서비스, EC2 선택

2-3. 권한 추가 : S3, SSM, CodeDeploy를 검색해서 AmazonS3FullAccess, AmazonSSMFullAccess, AWSCodeDeployRole 각각 권한 정책에 추가

2-4. 역할 이름 지정, 검토 및 생성

3-1. IAM 콘솔에서 역할 > 생성한 EC2Role 클릭

3-2. 해당 역할의 신뢰 관계 > 신뢰 정책 편집

3-3. Service 를 배열 형태로 변경한 후에 "codedeploy.ap-northeast-2.amazonaws.com" 추가

 

4-1. EC 인스턴스 대시보드 > 해당 EC2 인스턴스 선택 > IAM 역할 수정해서 생성한 EC2Role 적용

4-2. EC2의 보안그룹을 확인한 후에 만약 보안 그룹의 인바운드 규칙에 HTTP(80), HTTPS(443) 포트가 추가되어있지 않다면 추가

 

✏️ EC2를 활용한 파이프라인 구축 Hands-on

Step 1 : CodeDeploy에서 배포 애플리케이션 설정

1-1. CodeDeploy 콘솔로 접속해서 배포 > 애플리케이션 > 애플리케이션 생성

1-2. 애플리케이션 구성 설정

2-1. CodeDeploy에서 생성한 애플리케이션에 배포 그룹 생성

2-2. 배포 그룹 이름을 지정하고, 서비스 역할에서 생성했던 EC2Role 지정

2-3. 애플리케이션 배포 방법 선택, EC2 인스턴스, 태그 그룹 

2-4. 로드밸런싱 활성화 체크 해제 후 배포 그룹 생성

 

 

Step 2 : CodePipeline에서 새 파이프라인 생성

1. 파이프라인 설정 선택  : 이름 지정 후 다음

2-1. 소스 스테이지 추가 : GitHub에 연결

2-2. 소스 스테이지 추가 : GitHub 레포지토리 설정

2-3. 소스 스테이지 추가 : 소스 스테이지 연결

3. 빌드 스테이지 추가 : 서버는 빌드가 필요 없으므로 빌드 스테이지 건너뛰기

4-1. 배포 스테이지 추가 : 배포 설정

4-2. 배포 스테이지 추가 : 리전, 애플레키에션 이름, 배포 그룹 설정 후 다음

4-3. 배포 스테이지 추가 : 파이프라인 생성

 

✏️ EC2에 정상적으로 자동화 적용되었는지 확인

Step 1 : Git에 add, commit, push

$ git add .
$ git commit -m "add : files"
$ git push

Step 2 : CodeDeploy에서 정상적으로 배포 되었는지 확인

Step 3 : EC2 서버에 정상적으로 접속 확인

Step 4 : EC2 서버 기동 로그 확인

$ tail -F  /opt/codedeploy-agent/deployment-root/deployment-logs 
[2023-04-24 04:48:46.618] [d-DDV8J6W3N][stdout]
[2023-04-24 04:48:46.618] [d-DDV8J6W3N][stdout]85 packages are looking for funding
[2023-04-24 04:48:46.618] [d-DDV8J6W3N][stdout]  run `npm fund` for details
[2023-04-24 04:48:46.623] [d-DDV8J6W3N][stdout]
[2023-04-24 04:48:46.623] [d-DDV8J6W3N][stdout]1 moderate severity vulnerability
[2023-04-24 04:48:46.623] [d-DDV8J6W3N][stdout]
#... 중략 ...#
[2023-04-24 04:49:09.677] [d-DDV8J6W3N][stdout][PM2] Spawning PM2 daemon with pm2_home=/root/.pm2
[2023-04-24 04:49:10.116] [d-DDV8J6W3N][stdout][PM2] PM2 Successfully daemonized
[2023-04-24 04:49:10.156] [d-DDV8J6W3N][stdout][PM2] Starting /home/ubuntu/sprint-practice-deploy-for04/server/app.js in fork_mode (1 instance)
[2023-04-24 04:49:10.177] [d-DDV8J6W3N][stdout][PM2] Done.
[2023-04-24 04:49:10.221] [d-DDV8J6W3N][stdout]┌────┬────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
[2023-04-24 04:49:10.221] [d-DDV8J6W3N][stdout]│ id │ name   │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
[2023-04-24 04:49:10.221] [d-DDV8J6W3N][stdout]├────┼────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
[2023-04-24 04:49:10.221] [d-DDV8J6W3N][stdout]│ 0  │ app    │ default     │ 1.0.0   │ fork    │ 8363     │ 0s     │ 0    │ online    │ 0%       │ 16.8mb   │ root     │ disabled │
[2023-04-24 04:49:10.221] [d-DDV8J6W3N][stdout]└────┴────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

 

# References

CodeDeploy Agent

- CodeDeploy 에이전트는 인스턴스에 설치 및 구성한 경우 인스턴스를 CodeDeploy 배포에서 사용할 수 있게 해주는 소프트웨어 패키지

- CodeDeploy 에이전트는 인스턴스에 개정 및 로그 파일을 보관하며 CodeDeploy 에이전트는 이러한 아티팩트를 정리해 디스크 공간을 절약

  • 애플리케이션 수정 버전 배포 로그
  • CodeDeploy 로그: Amazon Linux, Ubuntu Server 및 RHEL 인스턴스의 경우 CodeDeploy 에이전트가 /var/log/aws/codedeploy-agent 폴더의 로그 파일을 교체
  • 개정, 배포 기록 및 배포 스크립트를 저장하는 기본 디렉토리 : Amazon Linux, Ubuntu Server 및 RHEL의 경우 '/opt/codedeploy-agent/deployment-root'

 

CodeDeploy Agent 구성 파일 위치

  • Amazon Linux, Ubuntu Server 및 Red Hat Enterprise Linux(RHEL) 인스턴스의 경우 : /etc/codedeploy-agent/conf/codedeployagent.yml 
  • Windows Server 인스턴스의 경우 : C:\ProgramData\Amazon\CodeDeploy\conf.yml 

 

CodeDeploy agent 서비스 기동 여부 확인

$ sudo service codedeploy-agent status

 

CodeDeploy 에이전트 설치 방법

https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/codedeploy-agent-operations-install.html

 

CodeDeploy 에이전트 설치 - AWS CodeDeploy

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

CodeDeploy

CodeDeploy 배포 그룹 생성 시 로드 밸런서를 활성화 한다면

- CodeDeploy 배포 시, 로드 밸런서는 준비되지 않았거나, 현재 배포 중이거나, 더 이상 환경의 일부로 필요하지 않은 인스턴스로 인터넷 트래픽이 라우팅되지 않도록 해줌

 

 

Comments