[AWS CI/CD] 클라우드 환경에서 CI/CD 파이프라인 구성해보기

3 분 소요

개발 스택

  • GitHub
    • git을 기반으로 개발자들의 협업을 위해 분산 버전 관리를 지원해주는 서비스
  • AWS CodePipeline
    • 소프트웨어를 빌드하고, 테스트하고, 배포하는 일련의 과정을 하나로 통합하고 소스 코드의 변경점을 감지하여 자동으로 배포하는 서비스
  • AWS CodeBuild
    • 소스 코드를 컴파일, 빌드하고 테스트를 실행하여 CI 서비스
      • 비슷한 도구로 Jenkins, Bamboo, Travis CI 등이 있다.
  • AWS Elastic Container Registry(ECR)
    • 컨테이너 이미지를 저장하는 원격 레지스트리
  • AWS Elastic Container Service(ECS)
    • 컨테이너화된 애플리케이션을 손쉽게 배포, 관리할 수 있도록 지원하는 완전 관리형 컨테이너 오케스트레이션 도구

Github

https://github.com/KimGyeongLock/ktb-practice

  • 빈 Repository를 생성

AWS Codepipeline

URL: AWS Codepipeline

  • Pipeline 생성

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2024-08-05_%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB_11 46 35

Untitled

Execution mode

  • Superseded: 이전 실행이 최근 실행으로 대체됨
  • Queued: 한 번에 하나씩 실행되며, 대기열에 등록됨
  • Parallel: 대기없이 동시에 모든 파이프라인을 실행함

Service Role

  • 생성하는 Codepipeline이 갖게되는 권한에 대해 정의된 IAM Role

  • 어떤 곳에서 코드를 가져올 것인지 Github에 App 설치

    • Repository와 Branch를 설정

Untitled 1

Untitled 2

Trigger Type

  • No Filter: 별도의 필터 없이 HEAD의 변경점을 기준으로 시작
  • Specify Filter: 다양한 조건으로 파이프라인이 시작될 수 있도록 지정 가능
  • Do not detect changes: 자동으로 파이프라인 시작을 하지 않음

Event Type

  • Push 혹은 PR을 기준으로 파이프라인 시작 가능

Filter Type

  • 필터를 적용할 타입을 Branch와 Tag 중에서 고를 수 있음

Branches

  • 파이프라인이 시작되는 Branch의 조건을 지정할 수 있음

Untitled 3

  • Build에 사용할 도구를 선택
    • CodeBuild와 Jenkins를 제공

Untitled 4

AWS CodeBuild

  • Create Project로 신규 CodeBuild 생성

    Provisiong Model

    • On Demand: 새로운 요청이 있을 때 마다 필요한 리소스를 구성하여 빌드
    • Reserved capcity: 빌드에 사용할 리소스를 사전에 정의하여 운영

    Environment Image

    • 빌드 환경의 이미지를 지정할 수 있다.

    Compute

    • 컴퓨팅 리소스를 어디에서 사용할 것인지 선택할 수 있다.
  • CodeBuild 에서 사용된 IAM Role 생성
  • Buildspec 설정

Untitled 5

AWS Codepipeline

Untitled 6

  • Deploy는 초기 구성에는 설정하지 않고 Skip

Untitled 7

Untitled 8

에러가 나는게 정상

깃허브에서 코드가 최신화되는 것을 감지되는 것까지 끝

레포에 아무것도 없기 때문에 에러가 나는 것

Untitled 9

실행 파일을 넣으면 자동으로 변함

진행중 이 안 바뀔수도 있는데 신경쓰지 않아도 됨 → 끝

Untitled 10

배포하기 위해 컨테이너 만들기

컨테이너 이미지 생성 docker build . –tag test-image
컨테이너 생성 docker run -d -p 3000:3000 test-image

Amazon Elastic Container Registry

Untitled 11

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2024-08-05_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_2 05 17

Untitled 12

AWS CodeBuild

  • buildspec.yml 수정

Untitled 13

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2024-08-02_%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB_11 41 14

REGION = ap-northeast-2 변경 (서울)

노란 부분 + /repo

github push → 자동으로 빌드

  • CodeBuild Project의 IAM 수정

빌드 명령 삽입 → buildspec 파일 사용

Untitled 14

ECR 권한 설정

빌드 프로젝트 -> 코드빌드 -> 서비스 열할 이동 -> 권한 정책(권한 추가[정책 연결]) -> 검색(AmazonEC2ContainerRegistryPowerUser) 후 추가

https://us-east-1.console.aws.amazon.com/iam/home?region=us-east-1#/roles/details/ktb-build-1?section=permissions

Untitled 15

설정 다 하였으면 변경사항 릴리스

파이프라인 목차 -> 파이프라인 -> 변경사항 릴리즈(Release change) 하면 된다고 하십니다

Untitled 16

막고 있는 이 친구는 실행 중지 해주기

Untitled

빌드 성공 확인

Untitled 17

ECR 가서 image 잘 생성 되었는지 확인

Untitled 18

깃허브에서 수정이되면 CI가 됨

AWS Elastic Container Service(ECS)

ECS 구성해서 자동으로 배포되도록 함

Untitled 19

Untitled 20

Infrastructure

  • 컨테이너를 구성할 인프라 풀을 지정한다.
    • AWS Fargate
    • Amazon EC2 instances

서비스 생성

Untitled 21

Compute options

  • 인프라 풀을 구성할 전략을 지정한다.
    • Capacity Provider Strategy
    • Launch Type

테스크 정의

Untitled 22

Untitled 23

현재는 init 페이지 밖에 없어서 최소 사이즈로 진행

본인 프로젝트시 사양에 맞춰서 진행

Container

Untitled 24

Container Detail

  • Name: buildspec.yml에서 post_build에서 입력한 name과 같게 설정(레포 이름으로 설정되어 있음)
  • Image URI: ECR URI를 입력

Port Mapping

  • 현재 애플리케이션이 3000으로 실행되므로 3000으로 설정

Untitled 25

다시 돌아와서

Untitled 26

Application Type

  • 컨테이너를 띄울 애플리케이션 종류를 지정
    • Service: 웹 애플리케이션과 같이 오랜 시간 컴퓨팅을 쓰는 종류의

애플리케이션

  • Task: 일회성으로 실행되는 애플리케이션

Task Definition

  • 서비스 내에서 실행될 컨테이너 스펙을 정의함
  • 첫 생성 시에는 정의된 Task Definition이 없으므로, go to Task Definition을 통해 생성

Load balancing 설정

  • 서비스를 외부에 노출시키기 위해 로드밸런서 생성

Untitled 27

Untitled 28

Untitled 29

  • 기본 Security Group으로는 외부에서의 접근이 허용되지 않기 때문에, 추가가 필요하다.
  • 현재 만든 웹서비스의 경우 별도 인증서는 없으므로 HTTP(80)만 오픈

Untitled 31

인바운드 규칙 편집

Untitled 32

Untitled 33

Untitled 30

d1e28074-bf43-4a78-af81-1f1195d760f3

누락 부분

AWS Codepipeline

  • Codepipeline 생성 단계에서 Skip했던 Depoly Stage 추가

pipeline → 편집 → 맨밑 스테이지 추가 → Deploy 추가

Untitled 34

Untitled 35

Deploy 에러

  • 첫번째 문제

post_build 에서 “name”: “repo” 로 설정한다.

repo 는 ECR에서 만든 repository의 이름과 동일

Untitled 36

  • 두번째 문제

Untitled 37

테스크 정의 → 새 개정 생성

이름 ktb-container 가 아니라 repo ECR repository랑 동일시

Untitled 38

클러스터에서 새 서비스 생성

Untitled 39

ktb-definition의 개정을 최신 것으로 넣어준다.

Untitled 40

다시 pipeline → deploy 수정 → 편집 → deploy 스테이지 편집 → 서비스를 새 것으로 변경해준다.

Untitled 41

다시 변경 사항 릴리스를 하고 새로 생긴 서비스 → 구성 및 네트워킹 → DNS 이름을 확인

http://ktb-alb2-1224584052.ap-northeast-2.elb.amazonaws.com/

Untitled 42

Untitled 43

Deploy까지 잘 수행되면 CI/CD 파이프라인 구성 완료

카테고리:

업데이트: