배포 자동화
배포 자동화란, 개발자가 신규 코드를 개발하고, 애플리케이션을 빌드 후 원격 저장소에 코드를 업로드 한 뒤, 이를 배포하는 전 과정을 자동화 한 것을 말한다. 이를 통해 시간을 절약할 수 있고, 새 기능이 잘 작동하는지 테스트할 수 있으며, 실제 환경에 배포했을 때 애플리케이션의 동작을 모니터링 할 수 있기에 안정적인 배포로 이어진다.
파이프라인(Pipeline)
소스 코드의 관리부터 배포 과정까지를 연결하는 구조를 말한다. 코드 변경이 발생할 때마다 빌드, 테스트 및 배포 단계를 순차적으로 자동화한다. 아래는 대표적인 단계로, 더 세분화하거나 간소화할 수 있다.
- Source: 원격 저장소에서 관리되는 코드에 변경이 있을 때, 이를 감지하고 다음 단계로 전달한다.
- Build: Source에서 전달받은 코드를 컴파일, 빌드, 테스트하여 가공한다. 이를 다음 단계로 전달한다.
- Deploy: Build 단계에서 전달받은 결과물을 실제 서비스에 반영한다.
AWS Pipeline
Spring Boot 👉 GitHub 👉 AWS CodeBuild 👉 AWS CodeDeploy 👉 Amazon EC2
CodePipeline을 이용해서 각 단계를 연결하는 파이프라인을 구축한다.
- Source 단계: 소스 코드가 저장된 GitHub 리포지토리를 연결
- Build 단계: CodeBuild 서비스를 이용하여 EC2 인스턴스로 빌드된 파일을 전달
- Deploy 단계: CodeDeploy 서비스를 이용하여 EC2 인스턴스에 변경 사항을 실시간으로 반영
오류가 발생하면 아래 경로에서 로그 파일을 확인할 수 있다.
cd /opt/codedeploy-agent/deployment-root/deployment-logs
더보기
개발 환경 구축
1. Java 설치
$ sudo apt update
$ sudo apt install openjdk-11-jre-headless
$ java -version
2. AWS CLI 설치
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ sudo apt install unzip
$ unzip awscliv2.zip
$ sudo ./aws/install
$ aws --version
# aws-cli/2.8.1 Python/3.9.11 Linux/5.13.0-1029-aws exe/x86_64.ubuntu.20 prompt/off
3. CodeDeploy Agent 설치
$ sudo apt update
$ sudo apt install ruby-full
$ sudo apt install wget
$ cd /home/ubuntu
$ sudo wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
$ sudo chmod +x ./install
$ sudo ./install auto > /tmp/logfile
$ sudo service codedeploy-agent status
# active(runnung)
EC2 인스턴스 역할 부여
- EC2 인스턴스 → 태그 → Key-Value
- 공용으로 할당된 cohort 태그, 개인 소유 리소스 식별을 위한 Name 태그 (인스턴스 이름에 적용)
- 보안 권한 추가
- 보안 → IAM 역할 → 권한 추가 → 정책 연결
- `AmazonS3FullAccess`, `AmazonEC2RoleforAWSCodeDeploy`, `AWSCodeDeployRole`, `AmazonSSMFullAccess 선택` → 정책 연결
- 초록색 안내 확인 후 하단의 권한 확인
- 신뢰 관계 (해당 역할을 취할 수 있는 서비스나 사용자 명시! access 정책 부여로 역할을 생성해 주었지만, 명시함으로써 역할이 확실히 완성된다.) `codedeploy.ap-northeast-2.amazonaws.com` 추가
EC2를 활용한 파이프라인 구축
- 로컬 환경의 `be-sprint-deployment/DeployServer` 경로에 `appspec.yml` 파일 추가
- 배포 자동화를 돕는 CodeDeploy-Agent가 인식하는 파일
- `buildspec.yml` 파일 추가
- 배포 자동화에서 빌드를 담당하는 `CodeBuild-Agent`가 인식하는 파일
- `scripts` 디렉터리를 생성하고 `initialize.sh`, `server_clear.sh`, `server_start.sh`, `server_stop.sh` 파일 4개 생성
- `appspec.yml` 파일이 구성하고 있는 배포 수명 주기에 따라 실행
- 저장 후 `commit`, `push`
1. AWS CodeDeploy → 애플리케이션 → 애플리케이션 생성
- 애플리케이션 이름: be-90-yujung-Jang
- 컴퓨팅 플랫폼: EC2/온프레미스
2. 배포 그룹 → 배포 그룹 생성
- 배포 그룹 이름: be-90-yujung-Jang-group
- 서비스 역할: IAM-ROLE_be-91-yujung-Jang
- 환경 구성: Amazon EC2 인스턴스
- 태그: Name 태그 + be-90-yujung-Jang
- 로드 밸런싱 활성화 체크 해제
- 생성! → 에러 화면이 보일 수 있으나 괜찮음
3. 이렇게 AWS CodeDeploy 세팅이 끝났다.
CodePipeline → 파이프라인 생성
- 이름: `be-90-yujung-Jang`
- 소스 스테이지: GitHub(버전 2)
- [GitHub에 연결] 버튼 → 연결 이름: be-sprint-deployment → [새 앱 설치] 버튼 → 내 GitHub 계정 클릭
→ 로그인 후 화면에서 'Only Select repositories' 선택 → 소스 코드로 이용할 레포지토리(be-sprint-deployment) 선택 → [Save] → 연결 - 리포지토리 이름: be-sprint-deployment
- 브랜치 이름: main
- 출력 아티팩트 형식: CodePipeline 기본값
- [GitHub에 연결] 버튼 → 연결 이름: be-sprint-deployment → [새 앱 설치] 버튼 → 내 GitHub 계정 클릭
- 빌드 스테이지 공급자: AWS CodeBuild → [프로젝트 생성]
- 프로젝트 이름: be-90-yujung-Jang
- 운영체제: Amazon Linux 2
- 런타임: Standart
- 이미지: aws/codebuild/amazonlinux2-x86_64-standart:3.0
- Buildspec: DeployServer/buildspec.yml
- [CodePipeline으로 계속]
- 배포 스테이지 공급자: AWS CodeDeploy
리전: 아시아 태평양(서울)
애플리케이션 이름: be-90-yujung-Jang
배포 그룹: be-90-yujung-Jang-group - 파이프라인 생성!
👇 deploy 스테이지에서 실패가 발생했을 때, CodeDeploy-Agent가 EC2 인스턴스에 저장한 로그 파일 조회하기
cd /opt/codedeploy-agent/deployment-root/deployment-logs
ls
로그 파일이 존재한다면 (sudo) nano로 열어 보기
→ lifecycle을 돌면서 sh 파일을 실행시킨 로그를 확인할 수 있다
→ stderr: standard error
stdout: standard output (linux의 standard stream에 대해서 검색 후 학습)
nano가 아니라 linux의 tail, head, grep과 같은 터미널 명령어를 이용하여 내용을 확인할 수도 있다
프로세스가 실행 중인지 확인
sudo lsof -i :(실행한 포트번호)
'Back-End > DevOps' 카테고리의 다른 글
운영 전략 (0) | 2022.10.11 |
---|---|
[Deploy] Github Actions를 통한 배포 자동화 (0) | 2022.10.07 |
[Cloud] Docker - CLI (0) | 2022.10.05 |
[Cloud] Docker - 컨테이너(Container) (0) | 2022.10.05 |
[Cloud] AWS - 서버 & 클라이언트 배포, 데이터베이스 연결 (0) | 2022.10.03 |
댓글