每日将所有AWS ALB关联至WAF的Lambda脚本实现及boto3客户端选用咨询
Python 3.8环境下ALB批量关联WAF实操指南
对应操作的boto3客户端选型
最容易踩的坑就是选错客户端:不少开发者一开始会以为关联操作要在elbv2客户端里完成,实际上WAF和ALB的绑定操作的权限和接口,全部归属WAF服务侧:
- 拉取环境内全量ALB资源列表:使用
elbv2客户端,调用对应的资源查询接口即可 - 执行ALB到WAF的关联操作:必须使用
wafv2客户端,不要用旧版waf(WAFClassic)客户端——旧版WAF的关联接口早已停止对新增ALB的操作支持,仅能用于多年前创建的WAF老资源运维
前置准备
- 提前确认你的目标WAF和所有待关联ALB处于同一个AWS区域:WAFv2的区域级WAF仅支持关联同区域内的ALB,全球范围(Global Scope)的WAF仅能关联CloudFront,无法对接ALB资源
- 给Lambda执行角色配置最小权限:包含
elasticloadbalancing:DescribeLoadBalancers(拉取ALB列表)、wafv2:AssociateWebACL(执行关联操作)、wafv2:GetWebACLForResource(可选,用于判断ALB当前的WAF关联状态)
脚本核心实现逻辑(适配Lambda Python 3.8内置boto3环境,无需额外安装依赖)
- 初始化
elbv2和wafv2两个客户端实例,注意指定和资源匹配的AWS区域 - 调用
elbv2.describe_load_balancers接口拉取全量负载均衡列表,筛选出类型为application的条目(即ALB),过滤掉NLB、GWLB等其他类型负载均衡,避免给不需要的资源错配WAF - 对每个筛选出的ALB,先调用
wafv2.get_web_acl_for_resource查询当前关联的WAF:如果已经关联到指定的目标WAF,直接跳过减少无效调用;如果关联了其他WAF或者未关联,就调用wafv2.associate_web_acl方法,传入目标WAF的ARN和ALB的ARN完成绑定 - 增加异常捕获逻辑:单台ALB的关联失败(比如资源已被团队销毁、临时权限不足)不中断整体脚本流程,把错误信息打印到CloudWatch日志即可
实操避坑:WAF相关接口有每分钟调用次数限制,增加状态判断跳过已绑定资源的逻辑,能大幅减少无效API调用,避免触发限流导致批量关联失败
常见踩坑提醒
- 不要把WAF的类型参数填错:对接ALB的WAF是
REGIONAL类型,关联操作如果错用Global类型的WAF ARN,会直接返回参数不匹配的错误 - 关联操作不需要修改ALB侧的任何配置,只要执行关联的账号对目标WAF和ALB资源有对应权限即可,操作是无侵入的
内容的提问来源于stack exchange,提问作者Achiral
相关产品推荐
相关产品推荐

