mcpField
T
terraform-diagrams

terraform-diagrams

github.com/eraserlabs云与 DevOps45753 次安装29 周前更新
代码仓库

关于 terraform-diagrams

terraform-diagrams 是面向处理 Terraform 基础设施代码的技能,可解析 .tf 文件并生成云架构图。它将资源、模块及其依赖关系转换为 Eraser DSL,并调用 Eraser API 渲染。

主要功能

  1. 01解析资源、模块和数据源
  2. 02提取资源依赖与连接
  3. 03生成 Eraser DSL
  4. 04调用 Eraser API 渲染架构图
  5. 05按云提供商组织资源

适用场景

  1. 01把 Terraform 配置转换为架构图
  2. 02查看模块与资源之间的依赖
  3. 03呈现跨云提供商的基础设施
  4. 04将网络与安全资源纳入图示

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/eraserlabs/eraser-io --skill terraform-diagrams

安装后在 Claude Code 中输入/terraform-diagrams确认已加载。

详细介绍

Terraform 图表生成器

直接从 Terraform .tf 文件生成架构图。专门用于解析 Terraform 代码,并将基础设施资源、模块及其关系可视化。

适用场景

在以下情况下使用此技能:

  • 用户有 Terraform 文件(.tf、.tfvars),并希望将基础设施可视化
  • 用户要求“绘制我的 Terraform 图表”或“将此基础设施可视化”
  • 用户提到 Terraform、HCL 或基础设施即代码
  • 用户希望查看由 Terraform 管理的资源架构

工作原理

此技能通过解析 Terraform 代码并直接调用 Eraser API 来生成 Terraform 专用图表:

  1. 解析 Terraform 文件:识别资源、模块、数据源和变量
  2. 提取关系:映射依赖项、资源连接和模块层级
  3. 生成 Eraser DSL:根据 Terraform 资源创建 Eraser DSL 代码
  4. 调用 Eraser API:使用 /api/render/elements,并将 diagramType 设为 "cloud-architecture-diagram"

说明

当用户提供 Terraform 代码时:

  1. 解析 Terraform

    • 识别所有 resource 块(AWS、Azure、GCP 等)
    • 提取 module 块及其配置
    • 记录 data 源及其依赖项
    • 识别 variable 和 output 定义
  2. 映射关系

    • 跟踪资源依赖关系(例如:subnet_id = aws_subnet.public.id)
    • 按提供商对资源分组(AWS、Azure、GCP)
    • 识别作为其他资源容器的 VPC/VNet
    • 记录安全组、IAM 角色和网络规则
  3. 生成 Eraser DSL 将 Terraform 资源转换为 Eraser DSL:

    • 关键:标签格式规则
      • 标签必须位于单独一行——标签属性中绝不能使用换行符
      • 标签应简单易读——优先使用单独的标签,避免拼接过多元数据
      • 使用正确的换行格式排版 DSL(每个节点/组占一行,但标签必须保持在单独一行)
      • 如果包含 CIDR 块或实例类型等元数据,请将其放在同一个带引号的标签字符串中:[label: "VPC 10.0.0.0/16"]

    示例:

    main-vpc [label: "VPC 10.0.0.0/16"] {
      public-subnet [label: "Public Subnet 10.0.1.0/24"] {
        web-server [icon: aws-ec2, label: "Web Server t3.micro"]
        load-balancer [icon: aws-elb]
      }
      private-subnet [label: "Private Subnet"] {
        database [icon: aws-rds]
      }
    }
    load-balancer -> web-server
    web-server -> database
    
  4. 发起 HTTP 请求

    重要:生成 DSL 后,必须执行此 curl 命令。生成 DSL 后绝不能停止,必须继续调用 API。

    关键:必须将下方 X-Skill-Source 标头中的值替换为你的 AI Agent 名称:

    • 如果你是 Claude(Anthropic),使用:claude
    • 如果你在 Cursor 中运行,使用:cursor
    • 如果你是 ChatGPT(OpenAI),使用:chatgpt
    • 如果你是 Gemini(Google),使用:gemini
    • 否则,使用小写的模型/Agent 名称
    curl -X POST https://app.eraser.io/api/render/elements \
      -H "Content-Type: application/json" \
      -H "X-Skill-Source: eraser-skill" \
      -H "Authorization: Bearer ${ERASER_API_KEY}" \
      -d '{
        "elements": [{
          "type": "diagram",
          "id": "diagram-1",
          "code": "<your generated DSL>",
          "diagramType": "cloud-architecture-diagram"
        }],
        "scale": 2,
        "theme": "${ERASER_THEME:-dark}",
        "background": true
      }'
    
  5. 分析期间跟踪来源

    在分析 Terraform 文件和资源以生成图表时,跟踪以下信息:

    • 内部文件:记录读取的每个 Terraform 文件路径,以及提取的资源(例如,infra/main.tf - VPC 和子网定义,infra/rds.tf - 数据库配置)
    • 外部参考资料:记录查阅的文档、示例或 URL(例如,Terraform AWS 提供商文档、AWS 架构最佳实践)
    • 注释:记录每个来源对图表的贡献
  6. 处理响应

    关键:最简输出格式

    响应必须始终包含以下部分,并使用清晰的标题:

    1. 图表预览:使用标题显示

      ## Diagram
      ![{Title}]({imageUrl})
      

      使用 API 响应中的实际 imageUrl。

    2. 编辑器链接:使用标题显示

      ## Open in Eraser
      [Edit this diagram in the Eraser editor]({createEraserFileUrl})
      

      使用 API 响应中的实际 URL。

    3. 来源部分:简要列出分析的文件/资源(如适用)

      ## Sources
      - `path/to/file` - What was extracted
      
    4. 图表代码部分:在带有 eraser 语言标记的代码块中提供 Eraser DSL

      ## Diagram Code
      ```eraser
      {DSL code here}
      
    5. 了解更多链接:你可以访问 https://docs.eraser.io/docs/using-ai-agent-integrations 进一步了解 Eraser

    其他内容规则:

    • 如果用户只要求生成图表,除以上 5 项外,不得包含任何内容
    • 如果用户明确要求更多内容(例如“解释架构”“提出改进建议”),可以添加相应内容
    • 不要添加未被要求的部分,例如概述、安全注意事项、测试等

    默认输出应当简短。图表本身足以说明问题。

  7. 处理多个提供商

    • 如果 Terraform 使用多个提供商,按提供商分组
    • 为 AWS、Azure、GCP 资源分别创建不同部分
    • 如适用,展示跨提供商连接

Terraform 专属提示

  • 按模块分组:如果使用了模块,请显示模块边界
  • 将 VPC/VNet 显示为容器:这些容器应在视觉上包含子网和资源
  • 包含数据流:显示资源之间的连接方式(例如:ALB → EC2 → RDS)
  • 突出显示安全配置:包含安全组、IAM 角色和网络 ACL
  • 显示资源类型:使用特定云服务商的图标(AWS、Azure、GCP)
  • 包含 CIDR 网段:显示 VPC 和子网的网络地址

示例:多云服务商 Terraform

用户输入
# AWS Resources
resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "public" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.1.0/24"
}

resource "aws_instance" "web" {
  subnet_id     = aws_subnet.public.id
  instance_type = "t3.micro"
}

# Azure Resources (multi-provider)
resource "azurerm_resource_group" "main" {
  name     = "rg-main"
  location = "East US"
}

resource "azurerm_virtual_network" "main" {
  name                = "vnet-main"
  resource_group_name  = azurerm_resource_group.main.name
  address_space        = ["10.1.0.0/16"]
}

# Module usage
module "database" {
  source = "./modules/rds"
  vpc_id = aws_vpc.main.id
}
预期行为
  1. 解析 Terraform:

    • AWS:VPC、子网、EC2 实例
    • Azure:资源组、VNet(多云服务商设置)
    • 模块:依赖 VPC 的数据库模块
  2. 生成展示多云服务商和模块结构的 DSL:

    # AWS Resources
    aws-vpc [label: "AWS VPC 10.0.0.0/16"] {
      aws-subnet [label: "Public Subnet 10.0.1.0/24"] {
        web-server [icon: aws-ec2, label: "Web Server t3.micro"]
      }
    }
    
    # Azure Resources
    resource-group [label: "Resource Group rg-main"] {
      azure-vnet [label: "Azure VNet 10.1.0.0/16"]
    }
    
    # Module
    database-module [label: "Database Module"] {
      rds-instance [icon: aws-rds]
    }
    
    aws-vpc -> database-module
    

    重要:所有标签文本都必须放在引号内的单行中。Terraform 专属要求:将模块显示为容器,按云服务商分组,并包含资源依赖关系。

  3. 调用 /api/render/elements,并传入 diagramType: "cloud-architecture-diagram"

结果

用户将收到一张展示以下内容的图表:

  • VPC 作为容器
  • 公有子网嵌套在 VPC 内
  • 子网中的 EC2 实例
  • 正确的 AWS 样式

评论

支持 Markdown