인프라

Grafana, Loki를 ECS 환경에서 사용하여 모니터링, 로깅, 경보 시스템 구축하기 - (4) CI/CD 구축하기 (AWS CodePipeline)

김도리개발자 2023. 12. 14. 14:22

앞의 글에서 인프라 구축, Grafana 설정까지 완료하였으니 CI/CD 구축을 해보자

이전에는 Github Actions 를 사용했었는데 비용 문제 등으로 인해 AWS CodePipeline 으로 넘어갔다.

 

추후 Terraform 코드로 작성할테지만 UI 로 설정해보자

 

Pipeline 은 Github Actions의 Job 처럼 생성하는 사람 마음대로 구성할 수 있다.

Source -> Build -> Deploy 순으로 실행되도록 파이프라인을 구성했다.

0️⃣ CodePipeline

파이프라인 생성 버튼을 클릭한다.

1️⃣ Source

Github 의 특정 Repository 의 branch 와 연결하는 단계이다.

해당 Repository 에 특정 branch 에 commit/push 되면 트리거가 걸려 이 Code Pipeline 이 실행되도록 설정된다.

2️⃣ Build

  • build project 를 생성한다.

도커 이미지 빌드 권한 플래그 활성화에 체크해야한다.
buildspec은 스프링부트에 있는 buildspec.yml 파일의 경로로 지정해준다.
프로젝트 이름에서 생성한 빌드 프로젝트를 선택하여 Build 작업에 연결해준다.

3️⃣ Deploy

ECS 에 배포하는 경우 간단하게 Deploy 를 구축할 수 있다.

  • 작업 공급자 ECS 로 선택하면 생성했던 클러스터 > 서비스 순으로 선택할 수 있다.
  • 배포해야할 클러스터 > 서비스를 선택한다.

4️⃣ Spring Boot API Server 코드 추가

  • ECR 에 접근하기 위한 로그인을 한다.
  • 이미지에 추가할 태그값을 뽑는다.
  • Spring Boot API Server 의 이미지를 빌드하여 태그를 지정한다.
  • 이미지를 ECR Repo 에 push 한다.
version: 0.2

env:
  variables:
    ENV: "(환경)"
    PROJECT: "(프로젝트 이름)"

phases:
  pre_build:
    commands:
      - path="/$PROJECT/backend/$ENV/"
      - ECR_REPO=$(aws ssm get-parameters --region ap-northeast-2 --names $path"ecr-url" --query Parameters[0].Value | sed 's/"//g')
      - echo Logging in to Amazon ECR...
      - aws --version
      - echo $AWS_DEFAULT_REGION
      - aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin "$(aws sts get-caller-identity --query Account --output text).dkr.ecr.ap-northeast-2.amazonaws.com"
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build --build-arg BUILD_ENV=$ENV -t $ECR_REPO:latest .
      - docker tag $ECR_REPO:latest $ECR_REPO:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - docker push $ECR_REPO:latest
      - docker push $ECR_REPO:$IMAGE_TAG
      - printf '[{"name":"backend-container","imageUri":"%s"}]' $ECR_REPO:$IMAGE_TAG > imagedefinitions.json

artifacts:
  files: imagedefinitions.json
  • buildspec.yml
FROM openjdk:17-jdk-slim as builder

COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY gradle.properties .
COPY src src
RUN chmod +x ./gradlew
RUN ./gradlew bootJar

FROM openjdk:17-jdk-slim

ARG BUILD_ENV
ENV PROFILE="-Dspring.profiles.active=${BUILD_ENV}"

WORKDIR /app

COPY --from=builder build/libs/*.jar app.jar

EXPOSE 8080
ENTRYPOINT java $PROFILE -jar app.jar
  • Dockerfile

 

이렇게 CI/CD 구축을 완료했다.