ClamAV(防病毒)在 AWS ECS 上的 REST 应用

发布: (2025年12月9日 GMT+8 23:50)
5 min read
原文: Dev.to

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,并安装 clamavclamav-daemonnginxuwsgiFlasksupervisor
  • 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

测试解决方案

  1. 上传一个干净文件 到受监控的 S3 桶,验证 clamav-clean-topic 上出现消息。
  2. 上传 EICAR 测试病毒(无害的测试字符串),确认 clamav-infected-topic 收到 INFECTED 通知。

你可以订阅 SQS 队列、Lambda 函数或电子邮件端点到这些 SNS 主题,以观察消息。

销毁堆栈

当演示不再需要时,销毁所有资源:

pnpm run destroy

结论

通过将 ClamAV 扫描卸载到运行在 ECS Fargate 上的持久化守护进程,本方案消除了基于 Lambda 的扫描器的冷启动惩罚,同时保留了无服务器工作流的可扩展性和运维简便性。将 AWS 托管服务(ECS Fargate、Lambda、S3、SNS、SQS)与开源 ClamAV 引擎相结合,提供了一个面向生产、成本效益高的病毒扫描流水线。

Back to Blog

相关文章

阅读更多 »