AWS Lambda中能否使用Diagrams/Graphviz生成AWS架构图?
Lambda环境运行Diagrams库生成AWS架构图的解决方案
该需求完全可以实现,你遇到的问题均为环境配置、Graphviz插件加载类问题,按照以下步骤操作即可解决:
解决路径权限限制问题
- 编译Graphviz时,需使用和你Lambda运行时版本一致的操作系统镜像编译(如使用Amazon Linux 2运行时就用Amazon Linux 2 EC2编译,使用Amazon Linux 2023运行时就用对应版本EC2编译),避免glibc版本不兼容
- 编译完成后将Graphviz生成的
bin、lib、share三个目录完整打包到你的Lambda代码包或者Lambda层中,推荐使用Lambda层管理二进制依赖 - 在Lambda函数代码的最开头,配置以下环境变量:
import os # 替换为你实际存放Graphviz二进制的目录,用层的话就是/opt/bin、/opt/lib GRAPHVIZ_BIN_PATH = "/opt/bin" GRAPHVIZ_LIB_PATH = "/opt/lib" os.environ["PATH"] = f"{GRAPHVIZ_BIN_PATH}:{os.environ.get('PATH', '')}" os.environ["LD_LIBRARY_PATH"] = f"{GRAPHVIZ_LIB_PATH}:{os.environ.get('LD_LIBRARY_PATH', '')}" # 指定dot可执行文件路径 os.environ["GRAPHVIZ_DOT"] = f"{GRAPHVIZ_BIN_PATH}/dot" # 指定Graphviz运行时临时文件写入路径为Lambda可写的/tmp目录 os.environ["GV_FILE_PATH"] = "/tmp"
解决PNG格式不识别问题
你遇到的报错本质是Graphviz运行时未加载到png格式对应的插件,不是缺少gd库,需要做以下配置:
- 编译Graphviz时要完整编译gd、libpng相关插件,确保编译输出的
lib/graphviz目录下存在libgdplugin.so等格式插件文件 - 新增环境变量指定Graphviz插件加载目录:
# 替换为你实际存放graphviz插件的目录,用层的话就是/opt/lib/graphviz os.environ["GVBINDIR"] = f"{GRAPHVIZ_LIB_PATH}/graphviz" - 在每次Lambda冷启动时,先执行一次
dot -c命令生成插件配置缓存到/tmp目录:os.system(f"{GRAPHVIZ_BIN_PATH}/dot -c")
Diagrams库使用示例
完成上述配置后即可正常调用Diagrams生成PNG格式的架构图,生成的文件需存放到/tmp目录:
from diagrams import Diagram from diagrams.aws.compute import EC2 from diagrams.aws.storage import S3 with Diagram("Sample AWS Architecture", show=False, filename="/tmp/aws_arch", outformat="png"): EC2("Web Server") >> S3("Static Storage")
内容的提问来源于stack exchange,提问作者Thauany Moedano
相关产品推荐
相关产品推荐

