Excalidraw 支持 Serverless 函数拓扑的深度实践
在今天的云原生开发中,一个让人头疼的问题是:系统明明部署成功了,但没人说得清函数之间到底是怎么调用的。
我们见过太多这样的场景——新成员入职,面对一堆 Lambda 函数和事件源只能靠猜;线上出问题时,排查路径像解谜游戏;架构评审会上,PPT 里的静态框图早已和实际部署脱节。Serverless 架构虽然带来了极致弹性与低成本,却也把调用关系变得越来越“隐形”。
就在这时,Excalidraw 悄然完成了一次关键进化:它不再只是一个画手绘风格草图的白板工具,而是通过插件机制与数据集成能力,开始支持 Serverless 函数拓扑的可视化建模。更准确地说,它正在成为连接代码、架构与团队认知之间的“视觉翻译器”。
为什么是 Excalidraw?
你可能会问,画个架构图而已,Draw.io 不行吗?Figma 呢?甚至 PPT 都能搞定。
但如果你真正维护过大型 Serverless 应用,就会明白几个核心痛点:
- 图表更新滞后于代码变更
- 团队协作时版本混乱
- 抽象的函数依赖难以直观表达
- 运维、开发、产品对同一系统的理解不一致
而 Excalidraw 的特别之处在于,它既保留了“随手涂鸦”的亲和力,又具备足够的技术深度去承载真实工程数据。它的手绘风格降低了正式感带来的压迫性,让非技术人员也能轻松参与讨论;同时其开放的数据模型和插件系统,使得自动化生成、元数据绑定、外部系统集成成为可能。
换句话说,它既是白板,也是 API。
如何让函数“长”成一张图?
想象这样一个流程:你刚提交了一段 Terraform 配置,定义了一个新的 S3 触发 Lambda,并将其接入 SQS 队列。CI 流水线运行完毕后,不仅完成了部署,还自动生成了一张可交互的拓扑图,发布到团队 Wiki 上。
这张图不是截图,而是可以直接点击节点查看函数配置、追踪调用链、甚至跳转到源码仓库的动态视图。而这正是 Excalidraw 结合 IaC 工具链所能实现的能力。
整个过程可以拆解为四个阶段:
- 从基础设施代码中提取结构信息
- 将函数与事件映射为图的节点与边
- 生成符合 Excalidraw 数据格式的元素集合
- 自动布局并注入编辑器进行展示或导出
比如,我们可以写一个简单的解析脚本,从 terraform.tfstate 文件中抓取关键资源:
# 伪代码:从 Terraform 状态文件提取函数与触发关系
def parse_terraform_state(tfstate_path):
functions = {}
triggers = []
for resource in state["resources"]:
if resource["type"] == "aws_lambda_function":
name = resource["instances"][0]["attributes"]["function_name"]
arn = resource["instances"][0]["attributes"]["arn"]
functions[arn] = name
elif resource["type"] == "aws_lambda_permission":
function_arn = resource["instances"][0]["attributes"]["function_arn"]
principal = resource["instances"][0]["attributes"]["principal"]
if "apigateway" in principal:
triggers.append(("API Gateway", None, function_arn))
elif "s3.amazonaws.com" in principal:
bucket = source_arn.split(":")[-1].split("/")[0]
triggers.append((f"S3:{bucket}", None, function_arn))
这段逻辑并不复杂,但它完成了从“声明式配置”到“可视化语义”的第一步转换。接下来,这些数据就可以被送入一个生成器,转化为 Excalidraw 可识别的元素对象。
// 创建表示函数的矩形节点
function createFunctionNode(name: string, x: number, y: number): ExcalidrawElement {
return {
type: "rectangle",
id: `fn-${name}`,
x,
y,
width: 120,
height: 60,
strokeColor: "#1e88e5",
backgroundColor: "#bbdefb",
label: {
text: name,
fontSize: 16,
textAlign: "center",
verticalAlign: "middle"
},
// ...其他样式属性
};
}
// 创建调用箭头
function createCallEdge(fromId: string, toId: string): ExcalidrawElement {
return {
type: "arrow",
id: `edge-${fromId}-to-${toId}`,
fromId,
toId,
strokeColor: "#000",
endArrowhead: "arrow",
points: [[0, 0], [80, 40]]
};
}
这些元素最终会被组合成一个完整的场景 JSON,直接导入 Excalidraw 编辑器。更重要的是,每个图形都可以附加自定义元数据,例如函数内存大小、超时时间、权限角色等,形成一种“富文档”体验。
自动化才是终极答案
手动画图永远追不上变化的速度。真正的价值来自于将这个过程嵌入 CI/CD 流水线。
设想一下你的 GitHub Action 工作流:
on: [push]
jobs:
generate-diagram:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: terraform init && terraform plan -out=tfplan
- run: python extract_functions.py tfplan > functions.json
- run: node generate-excalidraw.js functions.json > diagram.excalidraw
- uses: actions/upload-artifact@v3
with:
name: architecture-diagram
path: diagram.excalidraw
每次代码合并后,系统都会自动生成最新的 .excalidraw 文件,并可通过预览链接分享给团队。结合 Excalidraw 的实时协作功能,多人还能在同一画布上标注优化建议,真正实现“架构共写”。
这不仅仅是省去了画图的时间,更重要的是建立了 架构一致性保障机制 —— 文档不再是事后的补充,而是部署结果的一部分。
复杂系统的可视化策略
当然,随着函数数量增长,一张图很容易变成“毛线团”。当拓扑包含几十甚至上百个节点时,如何保持可读性?
这里有几个经过验证的设计思路:
分层展示:主图 + 子图
不要试图在一个画布里塞下所有细节。采用分层方式:
- 主视图只显示高层模块(如用户服务、订单处理、通知中心)
- 每个模块对应一个子图链接,点击即可展开详细函数拓扑
- 使用颜色编码区分环境(开发/测试/生产)或业务域
动态过滤与高亮
借助插件能力,允许用户按标签筛选函数(如 team:billing, lang:nodejs),或根据性能数据高亮慢调用路径。结合 AWS X-Ray 输出,甚至可以在图上叠加平均延迟热力图。
AI 辅助初稿生成
最新趋势是引入自然语言驱动的生成方式。输入一句话:“用户上传图片后触发压缩函数,完成后发送邮件通知”,AI 就能推测出至少三个函数节点及两条边的关系,快速产出草图供人工调整。
这种方式极大降低了入门门槛,尤其适合需求初期快速建模。
实战中的注意事项
在真实项目中落地这套方案时,有几个容易踩坑的地方值得提醒:
敏感信息脱敏
生成对外共享的图表时,务必移除 ARN、账号 ID、VPC 配置等敏感字段。可以在导出前添加清洗步骤,替换为占位符或哈希值。
控制图形密度
超过 30 个节点的图建议启用自动分组或折叠功能。也可以使用 DAG 布局算法(如 Sugiyama)进行层级排列,避免交叉连线过多。
统一命名规范
确保函数命名具有语义性,比如 payment-webhook-processor 比 lambda-function-7 更容易被理解和关联。
版本化管理图表文件
将 .excalidraw 文件纳入 Git 管理,配合 git diff 工具追踪架构演变。你会发现,有时候看图的历史比看代码历史更能反映系统演进脉络。
它不只是“画图”,而是一种思维方式
当我们说 Excalidraw 支持 Serverless 函数拓扑时,其实是在谈论一种新的工程实践范式:可视化即文档,架构即代码,沟通即协作。
这种模式带来的改变是深远的:
- 新人入职时,不再需要听三小时口头讲解,而是打开一张交互式拓扑图,自己探索调用路径;
- 故障复盘时,可以直接在图上标记异常节点,附上日志片段和时间戳;
- 架构评审会变成一场“可视化编程”——大家一边拖动节点,一边讨论是否要拆分某个函数或引入消息队列。
更进一步,随着 AI 理解能力的提升,未来可能出现这样的工作流:
输入:“构建一个用户注册系统,包括邮箱验证、欢迎短信、初始化档案”
输出:完整的函数拓扑图 + Terraform 脚本 + API 文档草稿
那时,Excalidraw 将不再只是工具,而是人类意图与机器执行之间的中间语言。
最后一点思考
技术工具的价值,往往不在于它有多强大,而在于它能否降低认知摩擦。
Excalidraw 之所以能在众多绘图工具中脱颖而出,正是因为它用最朴素的方式解决了最本质的问题:如何让复杂的系统变得可感知、可讨论、可传承。
而在 Serverless 时代,当代码运行在看不见的容器里,当调用发生在毫秒级的事件流中,我们需要的不只是监控指标和日志,更需要一张“活的地图”——既能反映现状,又能引导设计,还能承载团队共识。
Excalidraw 正在成为这张地图的绘制引擎。而你我,都是上面行走的旅人。
1012

被折叠的 条评论
为什么被折叠?



