인프라
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 를 생성한다.
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 구축을 완료했다.