IT STUDY LOG
Sprint - 서버 배포 파이프라인 본문
#학습 목표
- 서버 배포 자동화 파이프라인을 구축하는 실습을 진행
#해결 과제
💡 AWS 개발자 도구 서비스를 이용해서 배포 자동화 파이프라인을 구축해야 함
- CodePipeline을 이용해서 각 단계를 연결하는 파이프라인을 구축
- Source 단계에서 소스 코드가 저장된 GitHub 리포지토리를 연결
- 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 3 : node.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 에이전트 설치 방법
CodeDeploy
CodeDeploy 배포 그룹 생성 시 로드 밸런서를 활성화 한다면
- CodeDeploy 배포 시, 로드 밸런서는 준비되지 않았거나, 현재 배포 중이거나, 더 이상 환경의 일부로 필요하지 않은 인스턴스로 인터넷 트래픽이 라우팅되지 않도록 해줌
'devops bootcamp 4 > pair/team log' 카테고리의 다른 글
Sprint - 도메인 주도 설계 실습 (0) | 2023.05.04 |
---|---|
Sprint - 환경 변수 설정 (0) | 2023.04.24 |
Sprint - 클라이언트 배포 파이프라인 (0) | 2023.04.24 |
Sprint - 환경 변수 분리 (0) | 2023.04.21 |
Sprint - 빌드 및 테스트 자동화 (1) | 2023.04.20 |