AWS ECS에서 REST 애플리케이션으로 ClamAV (Anti-Virus)
Source: Dev.to
요약
이 프로젝트는 ClamAV를 사용하여 S3 객체를 자동으로 바이러스 스캔하는 AWS CDK 솔루션을 제공합니다. ClamAV 데몬(clamd)을 컨테이너화된 REST API 형태로 AWS ECS Fargate에서 실행함으로써 Lambda 기반 구현에서 흔히 발생하는 15‑30 초의 콜드 스타트 지연을 없애고 거의 즉시 스캔 결과를 제공합니다.
아키텍처는 하이브리드 방식을 사용합니다:
- ECS Fargate는 지속적인 ClamAV 데몬 서비스를 호스팅합니다.
- Lambda 함수는 S3 이벤트를 처리하고 ClamAV REST API를 호출한 뒤 결과를 SNS 토픽에 게시합니다.
AWS CDK를 활용한 인프라스트럭처 코드
핵심 인프라스트럭처
- VPC – 퍼블릭, 프라이빗‑격리, 프라이빗‑이그레스 서브넷을 포함한 멀티 AZ 구성.
- ECS Fargate 클러스터 – ClamAV REST API 컨테이너를 실행합니다(비용 절감을 위해 Fargate Spot 옵션 사용 가능).
- Network Load Balancer (NLB) – 내부 로드밸런서로, 트래픽을 ClamAV API 컨테이너로 라우팅합니다.
- S3 게이트웨이 엔드포인트 – NAT 게이트웨이 없이 프라이빗 서브넷에서 S3에 접근할 수 있게 합니다.
애플리케이션 구성요소
ECS Fargate에서 ClamAV REST API
- 컨테이너 스택 –
python:3.14-bookworm기반에clamav,clamav-daemon,nginx,uwsgi,Flask,supervisor가 포함됩니다. - API 엔드포인트
GET /– 상태 확인(응답OK).POST /scan_file– S3 버킷과 키를 포함한 JSON 페이로드를 받아 사전 로드된 데몬으로 스캔을 수행하고 결과를 반환합니다.
결과 알림 시스템
- SNS 토픽
clamav-clean-topic– 정상 파일에 대한 알림.clamav-infected-topic– 감염 파일에 대한 알림.
- 메시지 형식
{
"input_bucket": "bucket-name",
"input_key": "path/to/file.pdf",
"status": "CLEAN" | "INFECTED",
"message": "Scanning bucket-name/path/to/file.pdf\n"
}
- SQS 데드레터 큐 – 스캔 실패 작업을 캡처하여 재시도하거나 수동 검토에 활용합니다.
사전 요구사항
- 적절한 권한을 가진 AWS 계정.
- AWS CDK CLI 설치 (
npm install -g aws-cdk). - Node.js 16+ 및 pnpm 패키지 매니저.
- Docker (컨테이너 이미지 빌드용).
- 자격 증명이 설정된 AWS CLI.
설치 및 배포
# Clone the repository
git clone https://github.com/vumdao/cdk-clamav-rest-api-on-aws-ecs.git
cd cdk-clamav-rest-api-on-aws-ecs
# Install dependencies
pnpm install
# Deploy the stack
pnpm run deploy
Docker 이미지 ECR에 빌드 및 푸시
CDK 배포 시 이미지가 자동으로 빌드되고 푸시되지만, 수동으로 수행할 수도 있습니다:
# Navigate to the Dockerfile directory
cd src/lib/constructs/s3-serverless-clamscan/clamd-api
# Build the Docker image
docker build -t simflexcloud/clamav-api .
# Authenticate Docker to your ECR registry (replace <account-id> and <region>)
aws ecr get-login-password --region <region> | \
docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com
# Tag the image for ECR
docker tag simflexcloud/clamav-api:latest \
<account-id>.dkr.ecr.<region>.amazonaws.com/simflexcloud/clamav-api:latest
# Push the image to ECR
docker push <account-id>.dkr.ecr.<region>.amazonaws.com/simflexcloud/clamav-api:latest
예상 CDK 출력
✅ S3ClamAvStack
Outputs:
S3ClamAvStack.EcsClusterProviderclamav-apiEndpoint = nlb-xxxx.elb..amazonaws.com:5000
솔루션 테스트
- 정상 파일을 모니터링 중인 S3 버킷에 업로드하고
clamav-clean-topic에 메시지가 나타나는지 확인합니다. - EICAR 테스트 바이러스(무해한 테스트 문자열)를 업로드하고
clamav-infected-topic에INFECTED알림이 전송되는지 확인합니다.
SNS 토픽에 SQS 큐, Lambda 함수 또는 이메일 엔드포인트를 구독하여 메시지를 관찰할 수 있습니다.
스택 정리
데모가 더 이상 필요 없을 경우, 모든 리소스를 삭제합니다:
pnpm run destroy
결론
ClamAV 스캔을 지속적인 데몬으로 ECS Fargate에 오프로드함으로써, Lambda 기반 스캐너에서 발생하는 콜드 스타트 패널티를 제거하면서도 서버리스 워크플로우의 확장성과 운영 단순성을 유지할 수 있습니다. AWS 관리형 서비스(ECS Fargate, Lambda, S3, SNS, SQS)와 오픈소스 ClamAV 엔진의 결합은 프로덕션 수준의 비용 효율적인 바이러스 스캔 파이프라인을 제공합니다.