티스토리 뷰

안녕하세요, AWS 기반 CICD 환경 구축 스터디 내용을 기록했습니다.

 

AWS는 개발자가 애플리케이션을 쉽게 빌드, 테스트, 배포할 수 있도록 다양한 DevOps 서비스를 제공합니다. 그 중에서도 CodePipeline, CodeBuild, CodeDeployCI/CD(지속적 통합/지속적 배포) 파이프라인을 구축하는 데 핵심적인 역할을 하는 서비스들입니다. 

 

CICD ?
 CI + CD
 Continuous Integration + Continuous Delivery
 지속적 통합 + 지속적 배포
 지속적 통합: 개발자가 코드를 변경할 때마다 자동으로 코드를 통합, 빌드, 테스트하는 과정
 지속적 배포: 통합 & 테스트가 완료된 코드를 자동으로 배포환경에 배포하는 과정

 

1. AWS CodePipeline (지속적 배포 파이프라인 서비스)

  • 역할: 소프트웨어 릴리스 프로세스를 자동화하고 시각화하는 완전 관리형 지속적 배포 서비스입니다. 소스 코드 변경이 발생하면 자동으로 빌드, 테스트, 배포 단계를 거쳐 애플리케이션을 릴리스하는 과정을 하나의 파이프라인으로 구성해줍니다.
  • 주요 기능:
    • 자동화: 소스 코드 리포지토리(예: GitHub, AWS CodeCommit)에 푸시되는 변경 사항을 감지하여 자동으로 파이프라인을 시작합니다.
    • 통합: CodeBuild, CodeDeploy를 비롯한 AWS 서비스는 물론, Jenkins, TeamCity 등 다양한 서드파티 서비스와도 쉽게 통합할 수 있습니다.
    • 시각화: 파이프라인의 각 단계(소스, 빌드, 테스트, 배포)의 진행 상황을 한눈에 볼 수 있도록 시각적인 대시보드를 제공합니다.
    • 유연성: 다양한 실행 환경(예: 개발, 스테이징, 운영)에 맞는 여러 개의 파이프라인을 구축할 수 있습니다.

 

2. AWS CodeBuild (완전 관리형 빌드 서비스)

  • 역할: 소스 코드를 컴파일하고, 단위 테스트를 실행하며, 애플리케이션을 패키징하는 등의 빌드 작업을 수행하는 완전 관리형 빌드 서비스입니다. 서버를 따로 프로비저닝하거나 관리할 필요가 없습니다.
  • 주요 기능:
    • 온디맨드 빌드: 필요한 만큼의 컴퓨팅 자원을 사용하여 빌드 작업을 처리하고, 작업이 끝나면 자동으로 종료되므로 사용한 만큼만 비용을 지불합니다.
    • 다양한 언어 지원: Java, Python, Node.js, Ruby, Go, Docker 등 다양한 프로그래밍 언어 및 환경을 지원합니다.
    • 동시 빌드: 여러 빌드 작업을 동시에 실행하여 빌드 시간을 단축할 수 있습니다.
    • 커스터마이징: buildspec.yml이라는 빌드 사양 파일을 통해 빌드 단계(예: 빌드 전, 빌드 중, 빌드 후)를 세밀하게 제어할 수 있습니다.

 

3. AWS CodeDeploy (자동화된 배포 서비스)

  • 역할: 애플리케이션을 Amazon EC2, AWS Fargate, AWS Lambda, 온프레미스 서버 등 다양한 컴퓨팅 서비스에 자동으로 배포하는 서비스입니다. 배포 중에 발생하는 다운타임을 최소화하고 롤백 기능을 제공하여 안정적인 배포를 보장합니다.
  • 주요 기능:
    • 다양한 배포 전략:
      • 인플레이스(In-place): 기존 인스턴스에 새 버전의 애플리케이션을 덮어쓰는 방식입니다.
      • 블루/그린(Blue/Green): 현재 운영 중인 환경(Blue)과 동일한 새로운 환경(Green)을 생성하여 배포하고, 테스트 완료 후 트래픽을 전환하는 방식입니다. 다운타임 없이 배포가 가능합니다.
      • 카나리(Canary): 전체 트래픽 중 일부(예: 10%)를 새로운 버전에 먼저 보내고, 문제가 없으면 점진적으로 트래픽을 늘려가는 방식입니다.
    • 자동 롤백: 배포 실패 시 이전 버전으로 자동으로 되돌리는 기능을 제공합니다.
    • appspec.yml 파일: 배포 과정(예: 파일 복사, 스크립트 실행)을 정의하는 설정 파일입니다.
    • 오류 모니터링: 배포 중 발생하는 오류를 모니터링하고 로그를 제공하여 문제 해결을 돕습니다.

 

3가지 서비스의 관계 요약

이 세 서비스는 하나의 CI/CD 파이프라인을 구성하며, 일반적으로 다음과 같은 순서로 연동됩니다.

  1. CodeCommit/GitHub (소스): 개발자가 소스 코드를 리포지토리에 푸시합니다.
  2. CodePipeline (오케스트레이션): 코드 변경을 감지하여 파이프라인을 시작하고 다음 단계인 빌드 단계로 코드를 전달합니다.
  3. CodeBuild (빌드): CodePipeline으로부터 받은 소스 코드를 컴파일하고 테스트하여 배포 가능한 아티팩트(예: ZIP 파일, Docker 이미지)를 생성합니다.
  4. CodeDeploy (배포): CodeBuild가 생성한 아티팩트를 받아 지정된 컴퓨팅 환경(EC2, Fargate 등)에 자동으로 배포합니다.
  5. CodePipeline (마무리): 배포가 성공했는지 확인하고, 전체 파이프라인의 완료 상태를 보고합니다.

이러한 서비스 조합을 통해 개발팀은 수동 작업 없이도 소스 코드 변경 사항을 프로덕션 환경에 신속하고 안정적으로 배포할 수 있습니다.

 

 

CodeCommit/GitHub 환경 구축

- AWS, Github, VS Code 등을 설치합니다

- Github Repo 생성 : https://github.com/hayleyshim/test-website-repo

 

GitHub - hayleyshim/test-website-repo

Contribute to hayleyshim/test-website-repo development by creating an account on GitHub.

github.com

 

 

 

CodeBuild

Build Spec 

- 빌드를 하기 위한 구성 파일

- Github Repo 생성 : https://github.com/hayleyshim/test-angular-repo

 

 

 

 

 

Angular Unit Test

version: 0.2
phases:
  install:
    runtime-versions:
      nodejs: 20
    commands:
      - npm install -g @angular/cli@17
  pre_build:
    commands:
      - npm install
  build:
    commands:
      - ng test --no-watch --no-progress --browsers=ChromeHeadlessCI
artifacts:
  base-directory: dist/my-angular-project
  files:
    - '**/*'
cache:
  paths:
    - node_modules/**/*

 

 

CodeDeploy

Error)

Deployment d-14RU64PPD failed. Error code: HEALTH_CONSTRAINTS; Error message: The overall deployment failed because too many individual instances failed deployment, too few healthy instances are available for deployment, or some instances in your deployment group are experiencing problems

 

The overall deployment failed because too many individual instances failed deployment, too few healthy instances are available for deployment, or some instances in your deployment group are experiencing problems.

 

appspec.yml, buildspec.yml, deploy되는 저장소 확인!!

 

appspec.yml

version: 0.0
os: linux
files:
  - source: dist/my-angular-project
    destination: /var/www/my-angular-project
permissions:
  - object: /var/www/my-angular-project
    pattern: '**'
    mode: '0755'
    owner: root
    group: root
    type:
      - file
      - directory
hooks:
  ApplicationStart:
    - location: deploy-scripts/application-start-hook.sh
      timeout: 300

 

buildspec.yml

version: 0.2
phases:
  install:
    runtime-versions:
      nodejs: 20
    commands:
      - npm install -g @angular/cli@17
  pre_build:
    commands:
      - npm install
  build:
    commands:
      - ng build -c production
artifacts:
  # base-directory: dist/my-angular-project
  files:
    - 'dist/my-angular-project/**/*'
    - appspec.yml
    - 'deploy-scripts/**/*'
cache:
  paths:
    - node_modules/**/*

 

 

# CodeDeploy 배포 스크립트 로그 파일 경로

cat /opt/codedeploy-agent/deployment-root/e5d089f7-6f45-4df1-a1fb-88bad36f8633/d-HL6OV2QPD//logs/scripts.log 

2025-08-22 08:18:27 LifecycleEvent - ApplicationStart

 

 

이 로그는 스크립트가 실행되기 시작했지만, 아무런 출력 없이 바로 종료되었다는 것을 의미합니다.

  • LifecycleEvent - ApplicationStart 메시지는 CodeDeploy가 application-start-hook.sh 스크립트를 실행하기 시작했다는 뜻입니다.
  • 하지만 그 이후에 아무런 메시지가 없는 것은 스크립트가 실행된 직후에 오류를 내고 종료되었음을 보여줍니다.

이런 상황은 스크립트에 실행 권한이 없거나, 스크립트 파일이 잘못된 형식일 때 주로 발생합니다.

 

 

'IT > Devops' 카테고리의 다른 글

[devops] DevOps Engineering  (0) 2023.10.28
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/09   »
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
글 보관함