单EC2实例+Traefik架构接入AWS WAF及ALB部署问题咨询
问题1:方案可行性
完全可行!这个架构是AWS环境中给单实例微服务添加WAF防护的标准合理方案:
- AWS WAF仅支持与ALB、CloudFront、API Gateway集成,所以通过ALB接入WAF是必须的,你的流量路径「WebBrowser -> Internet -> WAF -> ALB -> EC2(Traefik)」完全合规且能正常运行。
- Traefik可以继续在EC2上承担反向代理、Let's Encrypt证书管理的职责,ALB只需负责将经过WAF过滤后的流量转发到EC2即可。你可以选择让ALB做SSL终止(把证书托管在ALB上),或者保留Traefik的SSL处理逻辑(ALB直接转发HTTPS流量到EC2的443端口),两种方式都能稳定工作。
问题2:实践经验分享
我在类似场景下有过部署经验,给你几个关键实操建议:
- SSL策略选择:如果服务对性能要求不高,推荐让ALB做SSL终止——这样WAF可以直接检查解密后的HTTP请求内容,规则配置更灵活;同时Traefik可以改为处理内部HTTP流量,减少EC2上的SSL开销。如果要保留Traefik的Let's Encrypt证书,只需配置ALB转发HTTPS到EC2的443端口,并确保ALB的安全组允许443出站到EC2。
- 安全组收紧:
- ALB的安全组只开放80/443端口给
0.0.0.0/0(互联网); - EC2的安全组只允许ALB的安全组访问80/443端口,禁止直接从互联网访问EC2,最大程度降低攻击面。
- ALB的安全组只开放80/443端口给
- WAF规则配置:先启用AWS托管的核心规则集(Core Rule Set),覆盖常见的SQL注入、XSS、路径遍历等攻击;再根据你的微服务特性添加自定义规则,比如限制特定路径的请求频率(Rate-Based规则)、允许/拒绝特定IP段。
- 监控与调试:通过CloudWatch监控WAF的拦截指标(比如
AllowedRequests、BlockedRequests)和ALB的请求指标(比如TargetResponseTime),如果出现流量异常,可以开启WAF日志功能排查具体被拦截的请求细节。 - Terraform关联配置:记得用
aws_wafv2_web_acl_association资源将WAF Web ACL与ALB关联,确保所有经过ALB的流量都经过WAF过滤。
问题3:ALB多可用区子网要求的解决办法
AWS ALB强制要求部署在至少两个不同可用区的子网,这是为了保证ALB本身的高可用性——即使单个AZ故障,ALB仍能在其他AZ提供服务。针对你只有一台EC2的情况,解决方案如下:
- 创建两个不同AZ的子网:即使其中一个AZ没有EC2实例,也要创建对应的子网(可以是私有子网,无额外成本)。在Terraform中可以这样配置:
resource "aws_subnet" "alb_subnet_az1" { vpc_id = aws_vpc.main.id cidr_block = "10.0.1.0/24" availability_zone = "us-east-1a" map_public_ip_on_launch = false } resource "aws_subnet" "alb_subnet_az2" { vpc_id = aws_vpc.main.id cidr_block = "10.0.2.0/24" availability_zone = "us-east-1b" map_public_ip_on_launch = false } - 配置ALB使用这两个子网:在
aws_lb资源中指定这两个子网:resource "aws_lb" "main" { name = "my-alb" internal = false load_balancer_type = "application" subnets = [aws_subnet.alb_subnet_az1.id, aws_subnet.alb_subnet_az2.id] security_groups = [aws_security_group.alb_sg.id] } - 目标组仅注册你的EC2实例:在
aws_lb_target_group中,只将你现有的EC2实例注册进去,目标组会自动识别实例所在的AZ,只有对应AZ的ALB节点会转发流量到实例;另一个AZ的ALB节点因为没有可用目标,会返回503错误,但DNS会优先解析到有可用目标的AZ节点,不会影响正常用户访问。 - 可选:预留扩展空间:如果你担心未来单个AZ故障导致服务不可用,可以后续在另一个AZ再部署一台EC2实例,现在先满足ALB的多AZ要求即可。
内容的提问来源于stack exchange,提问作者Thomas Seehofchen
相关产品推荐
相关产品推荐

