본문 바로가기
Back-End/DevOps

[Deploy | AWS Pipeline] 배포 자동화, 파이프라인

by 달의 조각 2022. 10. 6.

배포 자동화

 

  배포 자동화란, 개발자가 신규 코드를 개발하고, 애플리케이션을 빌드 후 원격 저장소에 코드를 업로드 한 뒤, 이를 배포하는 전 과정을 자동화 한 것을 말한다. 이를 통해 시간을 절약할 수 있고, 새 기능이 잘 작동하는지 테스트할 수 있으며, 실제 환경에 배포했을 때 애플리케이션의 동작을 모니터링 할 수 있기에 안정적인 배포로 이어진다.

 

파이프라인(Pipeline)

소스 코드의 관리부터 배포 과정까지를 연결하는 구조를 말한다. 코드 변경이 발생할 때마다 빌드, 테스트 및 배포 단계를 순차적으로 자동화한다. 아래는 대표적인 단계로, 더 세분화하거나 간소화할 수 있다.

  1. Source: 원격 저장소에서 관리되는 코드에 변경이 있을 때, 이를 감지하고 다음 단계로 전달한다.
  2. Build: Source에서 전달받은 코드를 컴파일, 빌드, 테스트하여 가공한다. 이를 다음 단계로 전달한다.
  3. Deploy: Build 단계에서 전달받은 결과물을 실제 서비스에 반영한다.

 


 

AWS Pipeline

 

Spring Boot 👉 GitHub 👉 AWS CodeBuild 👉 AWS CodeDeploy 👉 Amazon EC2

CodePipeline을 이용해서 각 단계를 연결하는 파이프라인을 구축한다.

https://aws.amazon.com/ko/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 인스턴스 역할 부여

  1. EC2 인스턴스 → 태그 → Key-Value
    • 공용으로 할당된 cohort 태그, 개인 소유 리소스 식별을 위한 Name 태그 (인스턴스 이름에 적용)
  2. 보안 권한 추가
    1. 보안 → IAM 역할 → 권한 추가 → 정책 연결
    2. `AmazonS3FullAccess`, `AmazonEC2RoleforAWSCodeDeploy`, `AWSCodeDeployRole`, `AmazonSSMFullAccess 선택` → 정책 연결
    3. 초록색 안내 확인 후 하단의 권한 확인
    4. 신뢰 관계 (해당 역할을 취할 수 있는 서비스나 사용자 명시! access 정책 부여로 역할을 생성해 주었지만, 명시함으로써 역할이 확실히 완성된다.) `codedeploy.ap-northeast-2.amazonaws.com` 추가

 

EC2를 활용한 파이프라인 구축

  1. 로컬 환경의 `be-sprint-deployment/DeployServer` 경로에 `appspec.yml` 파일 추가
    • 배포 자동화를 돕는 CodeDeploy-Agent가 인식하는 파일
  2. `buildspec.yml` 파일 추가
    • 배포 자동화에서 빌드를 담당하는 `CodeBuild-Agent`가 인식하는 파일
  3. `scripts` 디렉터리를 생성하고 `initialize.sh`, `server_clear.sh`, `server_start.sh`, `server_stop.sh` 파일 4개 생성
    • `appspec.yml` 파일이 구성하고 있는 배포 수명 주기에 따라 실행
  4. 저장 후 `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 기본값
  • 빌드 스테이지 공급자: 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 :(실행한 포트번호)

 

댓글