이번 시간에는 AWS Batch를 활용해 Spring Boot 기반 배치 작업을 등록‧실행하는 방법을 살펴보겠습니다.
AWS Batch는 배치 서버를 자동으로 관리하며, CPU 최적화·메모리 최적화 등 컴퓨팅 리소스의 유형을 필요에 따라 동적으로 프로비저닝해 주는 완전관리형(Managed) 서비스입니다.
실제 AWS Well-Architected 진단 tool 개발 프로젝트를 수행하면서 AWS SDK for Java로 AWS Cloud 자원 정보를 저장하는 배치를 구현한 경험을 바탕으로, AWS Batch를 어떻게 활용할 수 있는지 살펴보겠습니다.
아래 그림은 블로그에서 구현할 아키텍쳐 구성도 입니다.

아래 그림 처럼 AWS 계정 정보를 조회해 Root 계정 설정 정보를 저장하는 SpringBoot Batch를 구현했습니다.
이제 이 배치를 빌드하여 JAR 파일로 만든 뒤, 다음 순서로 진행해 보겠습니다.
- JAR 기반 Docker Image 생성
- AWS ECR Repository 생성 및 생헝한 Docker Image 를 ECR에 Push
- AWS Batch 구성

1. Docker Image 생성
아래와 같이 소스코드를 빌드 한 Jar 파일에 Dockerfile 을 넣습니다.

Dockerfile 내용은 아래 와 같습니다.
아래 내용에서 중요한 부분은 app 이라는 user가 해당 배치를 실행한다는 점입니다.
추후에 AWS Batch 구성 시 해당 정보가 필요합니다.
# 1. Use Amazon Corretto 17 (Alpine) as the base image
FROM amazoncorretto:17-alpine
# 2. Set working directory
WORKDIR /app
# 3. Copy the Spring Boot fat JAR into the container
COPY wellarchi-batch-0.0.1-SNAPSHOT.jar /app/wellarchi-batch.jar
# 4. Create 'app' group and user, and adjust ownership
RUN addgroup -S appgroup \
&& adduser -S -G appgroup app \
&& chown app:appgroup /app/wellarchi-batch.jar
# 5. Switch to non-root 'app' user
USER app
# 6. For one-off batch jobs, no port exposure or memory settings needed
# 7. Run the JAR file as 'app' user
ENTRYPOINT ["java", "-jar", "/app/wellarchi-batch.jar"]
docker를 설치 후에 아래 명령어로 cmd 창에서 image를 생성하면 됩니다.
docker build -t wellarchi-batch:0.0.1 .

2. ECR Repository 생성 및 Docker Image 를 ECR에 Push
이제 Docker Image 를 ECR에 Push하기 전에, 먼저 Push할 ECR 리포지토리를 생성해 보겠습니다.
아래와 같이 ‘리포지토리 생성’ 버튼을 클릭하세요.

리포지토리 이름을 ‘main/well-archi-batch’로 지정하고 KMS 암호화를 선택했습니다.

리포지토리를 생성하면 아래와 같이 URI 주소가 생성됩니다. 아래 주소를 이용하여 로컬에서 생성한 Docker Image를 해당 리포지토리에 Push 해보도록 하겠습니다.

아래와 같이 명령어를 실행하면 Docker Image가 Repository 에 Push 됩니다.
# 1) ECR에 로그인
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 533616270150.dkr.ecr.ap-northeast-2.amazonaws.com
# 2) 로컬 이미지를 ECR 경로로 태깅
docker tag wellarchi-batch:0.0.1 533616270150.dkr.ecr.ap-northeast-2.amazonaws.com/main/well-archi-batch:0.0.1
# 3) 이미지 푸시
docker push 533616270150.dkr.ecr.ap-northeast-2.amazonaws.com/main/well-archi-batch:0.0.1


Docker Image가 Repository에 Push 된 것을 볼 수 있습니다.
첫 번째 화면에서 0.0.1 태그를 클릭하면 이미지 URI가 생성되며, 이 URI를 통해 AWS Batch에서 해당 이미지를 불러올 수 있습니다.


3. AWS Batch 작업 생성
AWS Batch 구성 과정은 크게
3-1 작업 정의 생성
3-2 컴퓨팅 환경 생성
3-3 작업 대기열 생성
3-4 작업 실행
등 4단계로 이루어집니다. 하나 하나 차례로 살펴보겠습니다.
3-1 작업 정의 생성
작업 정의를 통하여 위에서 생성한 Image를 Container 로 배포하여 작업할 수 있는 템플릿을 만들 수 있습니다.

Severless Container 실행 서비스인 Fargate를 선택합니다.
작업 정의명은 well-archi-batch-jobdef 으로 명명하였습니다.

해당 AWS Batch는 퍼블릭 IP 할당은 비활성화 하였습니다.
또한, 해당 작업이 실행될 때 ECR에서 이미지를 가져오고 CloudWatch에 Batch 실행 로그를 저장해야 하므로,
관련 권한을 부여하기 위해 ‘실행 역할 생성’ 버튼을 클릭합니다.

Default 설정 셋팅 그대로 설정하여 Role을 생성합니다.


Role 생성 완료 후 이 Batch는 IAM 루트 사용자의 설정(예: MFA 활성화 여부, 비밀번호 규칙 등)을 검사하므로, 관련 정책인 rootuser-read-policy도 추가했습니다.

다시 작업 정의 생성 화면으로 돌아와서 위에서 생성한 Role을 맵핑합니다.

그리고 Docker Image로 컨테이너를 생성하기 위하여 앞에서 진행한 ECR 로 Push한 'Image의 URI 주소'를 넣습니다.

위에서 추가한 rootuser-read-policy 를 작업 역할 구성에 넣어야 배치 실행 시 Root User 조회가 가능하기 때문에 위에서 생성한 Role을 맵핑해 줍니다.

DockerFile에서 정의한 사용자 명 app을 아래에 넣어줍니다.

로그 드라이버는 awslogs를 선택하여 CloudWatch를 통하여 로그를 볼 수 있도록 설정합니다.

3-2 컴퓨팅 환경 생성
배치를 실행을 위한 컴퓨팅 환경을 구성합니다.
컴퓨터 환경 이름은 waf-computing-env-v01로 설정하였습니다.
최대 vCPU는 구성하는 배치 크기를 고려하여 설정합니다.


컴퓨팅 자원이 실행될 네트워크를 구성합니다. 해당 AWS Batch를 실행을 위해 별도로 VPC와 Subnet을 생성하였고 Subnet은 Private Subnet으로 구성하였습니다.
보안그룹은 별도로 생성하여 아래와 같이 맵핑하였습니다.
Inbound Rule 은 설정하지 않았고 Outbound Rule은 ECR에 Image를 가지고 오거나 API 호출을 위해서 0.0.0.0/0, 443 포트로 설정하였습니다.

3-3 작업 대기열 생성
아래 생성 버튼을 클릭 후 두번째 그림의 연결된 컴퓨팅 환경란에 위에서 생성한 컴퓨팅 환경을 맵핑하면 됩니다.


3-4 작업 실행
Batch 실행을 위한 준비는 모두 끝났습니다. 이제 Batch를 실행해 보도록 하겠습니다.
작업 콘솔에 들어가서 새작업 제출 버튼을 클릭합니다.

위의 과정했던 작업 정의, 작업대기열을 맵핑합니다. 계속 다음을 누르고 배치를 실행합니다.
배치 실행이 완료 되면 해당 Job 결과 로깅 탭에 아래 배치가 성공적으로 실행되었다는 것을 볼 수 있습니다.
권한 문제나 Batch 코드에 이상이 있으면 아래 로그를 참고하여 Batch를 수정합니다.

감사합니다.