ClamAV(防病毒)在 AWS ECS 上的 REST 应用
Source: Dev.to
摘要
本项目提供了一个基于 AWS CDK 的解决方案,用于使用 ClamAV 对 S3 对象进行自动病毒扫描。通过在 AWS ECS Fargate 上将 ClamAV 守护进程(clamd)以容器化的 REST API 形式运行,避免了 Lambda 实现中常见的 15‑30 秒冷启动延迟,实现了几乎即时的扫描结果。
架构采用混合方式:
- ECS Fargate 托管持久化的 ClamAV 守护进程服务。
- Lambda 函数 处理 S3 事件,调用 ClamAV REST API,并将结果发布到 SNS 主题。
使用 AWS CDK 的基础设施即代码
核心基础设施
- VPC – 多可用区,包含公共子网、私有隔离子网和带出站的私有子网。
- ECS Fargate 集群 – 运行 ClamAV REST API 容器(可选使用 Fargate Spot 以降低成本)。
- 网络负载均衡器 (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 bucket 与 key 的 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。
安装与部署
# 克隆仓库
git clone https://github.com/vumdao/cdk-clamav-rest-api-on-aws-ecs.git
cd cdk-clamav-rest-api-on-aws-ecs
# 安装依赖
pnpm install
# 部署堆栈
pnpm run deploy
构建并推送 Docker 镜像到 ECR
在 CDK 部署过程中会自动构建并推送镜像,但也可以手动完成:
# 进入 Dockerfile 所在目录
cd src/lib/constructs/s3-serverless-clamscan/clamd-api
# 构建 Docker 镜像
docker build -t simflexcloud/clamav-api .
# 认证 Docker 到你的 ECR 注册表(替换 <account-id> 与 <region>)
aws ecr get-login-password --region <region> | \
docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com
# 为 ECR 打标签
docker tag simflexcloud/clamav-api:latest \
<account-id>.dkr.ecr.<region>.amazonaws.com/simflexcloud/clamav-api:latest
# 推送镜像到 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通知。
你可以订阅 SQS 队列、Lambda 函数或电子邮件端点到这些 SNS 主题,以观察消息。
销毁堆栈
当演示不再需要时,销毁所有资源:
pnpm run destroy
结论
通过将 ClamAV 扫描卸载到运行在 ECS Fargate 上的持久化守护进程,本方案消除了基于 Lambda 的扫描器的冷启动惩罚,同时保留了无服务器工作流的可扩展性和运维简便性。将 AWS 托管服务(ECS Fargate、Lambda、S3、SNS、SQS)与开源 ClamAV 引擎相结合,提供了一个面向生产、成本效益高的病毒扫描流水线。