
기존까지 배치 작업은 Jenkins를 통해서 구동하였다.
Jenkins를 이용하니 아래와 같은 문제점이 있었다.
따라서 기존 Jenkins에서 구동되던 Spring Batch를 AWS Batch로 이관하는 작업을 진행했다.
(AWS Batch Image)
AWS Batch는 완전 관리형 배치 처리 서비스이다.
EC2, Spot, Fargate 등 컴퓨팅 서비스가 사용되며 사용된 컴퓨팅 리소스에 대해서만 비용이 부과된다.
구성요소로는 작업, 작업정의, 작업 대기열, 컴퓨팅 환경이 있는데 자세한 내용은 아래에서 설명하겠다.
구현하고자 한 내용은 다음과 같다.
# 런타임 이미지
FROM {사용되는 JDK 버전}
# 컨테이너 빌드 디렉토리
WORKDIR /app
# 빌드파일 복사
COPY build/libs/*.jar app.jar
# 타임존 UST -> KST
ENV TZ Asia/Seoul
# 배치 실행 명령
CMD ["java", "-jar", "-Dspring.profiles.active={ENV}", "-DskipTests=true", "app.jar", "--spring.batch.job.enabled=true"]
여기서 유의할 점은 2가지가 있다.
코드에서 ZoneDateTime 을 사용하지 않았다면 Dockefile에서 타임존을 설정하여야한다.
따로 설정을 하지 않을 경우 배치 작업은 KST로 시작되나 인스턴스 안에서 배치 코드는 UTC로 시간을 인식해서 DB에 정상적으로 데이터가 적재되지 않을 수 있다.
배치 실행 명령어는 2가지로 정의할 수 있다.
파이프라인 내용은 아래와 같다.
//bitbucket-pipelines.yml
image: {사용되는 JDK 버전}
pipelines:
branches:
{브랜치 명}: // 트리거가 되는 브랜치
- step:
name: Build and Deploy
services:
- docker
caches:
- docker
script:
- echo "Updating packages and installing dependencies"
- apt-get update && apt-get install -y unzip curl
- echo "Installing Gradle"
- apt-get install -y gradle
- echo "Installing AWS CLI"
- curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
- unzip awscliv2.zip
- ./aws/install
- echo "Setting executable permissions for gradlew"
- chmod +x ./gradlew
- echo "Building the application with Gradle"
- ./gradlew clean bootJar
- echo "Building Docker image"
- docker build -t {Repository 이름} .
- echo "Tagging Docker image"
- docker tag {Repository 이름}:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/{Repository 이름}:latest
- echo "Logging in to Amazon ECR"
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
- echo "Pushing Docker image to Amazon ECR"
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/{Repository 이름}:latest
- echo "Success"
{브랜치 명}으로 Push가 되면 위 파이프라인이 실행된다.
내용은 필요 패키지 다운로드 → Gradle Build → Docker Build → Image push 이다.
유의할 사항으로는 환경변수 값들을 미리 Repository에서 선언해야 하며 ECR을 미리 생성해야한다.
배치가 실행될 컴퓨팅 환경을 구성해야한다.



하나의 배치 프로젝트에 여러개의 Job이 같은 시간에 실행될 경우 Queue를 통해 우선순위를 정한다.

작업을 실행하는 방법, IAM Role이나 리소스 등을 결정한다.




작업정의를 바탕으로 작업이 실행되나 특정 작업별로 다른 설정값을 줘야할 경우에 내용을 추가할 수 있다.

Amazon EventBridge -> 일정에서 배치 스케쥴링을 설정한다.




Batch 실패 → CloudWatch → EventBridge → SNS → Chatbot → Slack
와 같은 워크플로로 구현했다.

CloudWatch / EventBridge

배치 실패 시 작동해야하므로 이벤트 패턴이 있는 규칙으로 선택한다.


배치 실패 시 이벤트가 발생하도록 설정하였다.

위에서 생성한 SNS 주제를 선택한다.
Chatbot

Slack을 대상으로 클라이언트를 구성한다.

