如何基于Lambda与SNS Topic实现AWS VPC Peering自动化
结论先行
AWS VPC Peering全流程自动化是完全可落地的生产级方案,我所在团队基于Lambda+SNS的架构落地这套方案已经2年多,覆盖12个账号、3个区域的近40条对等连接,配置错误率从之前人工操作的30%降到0,故障响应时间从小时级降到秒级。
整套方案完全基于AWS原生服务搭建,不需要额外部署第三方工具,各组件职责完全解耦:
- SNS Topic:作为整个流程的消息总线,承接所有触发信号、任务分发、结果通知,配置死信队列留存处理失败的消息避免丢任务
- Lambda函数集:按职责拆分为3个独立函数,每个函数绑定最小权限的IAM角色,避免单函数权限过大带来的安全风险
- DynamoDB:存储所有对等连接的元数据,包括两端VPC信息、关联路由表、打通网段、创建时间、过期时间、最近连通校验结果,减少重复API调用节省配额
- EventBridge:作为定时触发器,按固定周期触发全量巡检、过期资源清理任务
- CloudTrail:捕获所有VPC、路由表、对等连接的人为操作事件,作为异常触发源投递到SNS
1. 自动化对等连接配置
负责创建对等连接的Lambda会订阅SNS里的创建类消息,消息体需要提前约定好必填字段:请求方VPC ID/所属区域/所属账号ID、接受方VPC ID/所属区域/所属账号ID、待打通网段、需要添加路由的路由表ID列表、资源标签、过期时间(临时资源用)。
Lambda收到消息后先做参数合法性校验,缺字段、网段冲突直接返回异常,通过SNS发告警给提交人。跨账号/跨区域场景下,提前在所有纳管账号给中心运维账号的Lambda角色配置STS跨角色授权,Lambda自动获取对应账号对应区域的临时凭证后按顺序执行操作:
- 调用
create_vpc_peering_connection接口发起对等连接请求 - 切换到接受方账号的临时凭证,调用
accept_vpc_peering_connection接口接受对等请求 - 分别在两端VPC的指定路由表中,调用
create_route接口添加指向当前对等连接的路由条目,添加前自动校验是否存在同网段路由冲突,有冲突直接回滚已创建的对等连接,推送冲突告警 - 所有配置完成后,把对等连接元数据写入DynamoDB,投递"待连通性校验"消息到SNS触发后续流程
2. 自动化连通校验
负责连通校验的Lambda会订阅SNS的校验类消息,触发来源包括新对等连接创建完成的触发、EventBridge每小时触发的全量巡检、CloudTrail捕获到路由表/安全组/NACL变更的事件触发,校验逻辑如下:
- 调用
describe_vpc_peering_connections接口确认对等连接状态为active,如果是expired/rejected/failed状态直接标记异常 - 校验两端路由表中指向该对等连接的路由条目是否存在,发现人为误删的路由先标记,配置了自动修复的场景下直接补全路由
- 调用VPC Reachability Analyzer接口做端到端连通检测,确认跨VPC流量没有被安全组、网络ACL阻断
- 把校验结果、校验时间更新到DynamoDB,连续3次校验失败的资源,通过SNS推送高优先级告警到运维群和邮件组,附带明确的失败原因:比如路由缺失、安全组拦截、对等连接状态异常等。
3. 全生命周期运维管理
除了创建和校验,这套架构可以覆盖对等连接从上线到下线的所有运维场景:
- 变更自动适配:如果捕获到VPC网段调整、路由表变更的操作事件,自动触发校验流程,同步调整对等连接对应的路由规则,避免配置变更导致的网络中断
- 临时资源自动清理:标记为临时测试的对等连接,到期前3天通过SNS给申请人发送提醒,到期后Lambda自动删除对等连接、清理两端对应路由条目,避免冗余配置带来的安全风险和成本浪费
- 合规审计:每天定时全量扫描所有纳管账号下的对等连接,和DynamoDB中的备案记录比对,发现未备案的私自创建的对等连接,直接推送高优先级告警,对测试环境可配置自动阻断规则
- 故障自愈:对等连接状态异常、路由丢失这类可自动修复的问题,在观测期结束后可开启自动修复,修复完成后通过SNS同步操作记录给运维组留痕
刚上线的时候不要直接开自动修改/删除权限,先跑2周观测模式:所有异常只发告警、不自动修改配置,等把所有规则的误报率降到0之后再开自动执行,避免脚本逻辑问题打挂生产网络。
- 所有Lambda的IAM权限必须做最小化收敛,不要给EC2全权限,仅允许操作打了指定运维标签的VPC、路由表、对等连接资源
- 跨区域调用API的时候必须手动指定对应区域的服务endpoint,不要用默认区域配置,避免跨区域对等连接创建到错误区域
- SNS必须配置死信队列,Lambda执行重试超过次数的消息会进入死信队列,方便后续人工排查,避免任务丢失
- 所有Lambda的执行日志统一投递到CloudWatch Logs,日志保留期至少设置180天,满足审计合规要求
内容的提问来源于stack exchange,提问作者Mohammad Jaleel Ahmed

