如何用Python动态生成AWS VPC拓扑图
解决方案
可以通过整合VPC数据读取逻辑,再遍历数据动态生成拓扑组件的方式实现需求,以下是具体实现方案:
修改后的完整代码
import json from diagrams import Diagram, Cluster, Edge from diagrams.aws.organization import OrganizationsAccount from diagrams.aws.network import PrivateSubnet # 定义拓扑全局属性(根据实际需求调整) graph_attr = { "fontsize": "12", "bgcolor": "white" } def get_vpc_data(): """从JSON文件加载所有VPC的ID和CIDR块信息""" with open('vpc_payload.json', 'r') as f: data = json.load(f) return [{"vpc_id": item["VpcId"], "cidr": item["CidrBlock"]} for item in data] def companynetcluster(): vpc_list = get_vpc_data() with Diagram(filename="images/net", show=False, direction="LR", graph_attr=graph_attr): with Cluster("impinjnet", graph_attr={"margin": "40", "fontsize": "18"}): companynet = OrganizationsAccount("Company-Net") # 遍历VPC列表,动态生成每个VPC的Cluster和子网节点 for vpc in vpc_list: with Cluster(vpc["vpc_id"], graph_attr={"margin": "40", "fontsize": "18"}): PrivateSubnet(vpc["cidr"]) # 可选:添加Company-Net到所有VPC子网的关联连线 for vpc in vpc_list: companynet >> Edge() >> PrivateSubnet(vpc["cidr"]) if __name__ == "__main__": companynetcluster()
关键细节说明
- 整合数据读取:用
get_vpc_data()函数一次性读取所有VPC的ID和CIDR信息,避免重复打开文件,提升代码效率和可维护性。 - 动态生成Cluster:遍历
vpc_list,为每个VPC创建以其ID命名的Cluster,完全替代硬编码的Cluster块。 - 自动绑定CIDR:在每个Cluster内直接创建
PrivateSubnet并传入对应CIDR值,无需手动命名变量(如果后续不需要对子网节点做额外操作,变量名不是必需的)。 - 扩展支持:如果需要对生成的子网节点进行后续操作(比如连接其他AWS资源),可以将节点存入列表:
subnet_nodes = [] for vpc in vpc_list: with Cluster(vpc["vpc_id"], graph_attr={"margin": "40", "fontsize": "18"}): subnet = PrivateSubnet(vpc["cidr"]) subnet_nodes.append(subnet) # 后续可通过subnet_nodes列表操作所有子网节点
内容的提问来源于stack exchange,提问作者R. Barrett
相关产品推荐
相关产品推荐

