关于 terraform-diagrams
terraform-diagrams 是面向处理 Terraform 基础设施代码的技能,可解析 .tf 文件并生成云架构图。它将资源、模块及其依赖关系转换为 Eraser DSL,并调用 Eraser API 渲染。
主要功能
- 01解析资源、模块和数据源
- 02提取资源依赖与连接
- 03生成 Eraser DSL
- 04调用 Eraser API 渲染架构图
- 05按云提供商组织资源
适用场景
- 01把 Terraform 配置转换为架构图
- 02查看模块与资源之间的依赖
- 03呈现跨云提供商的基础设施
- 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 专用图表:
- 解析 Terraform 文件:识别资源、模块、数据源和变量
- 提取关系:映射依赖项、资源连接和模块层级
- 生成 Eraser DSL:根据 Terraform 资源创建 Eraser DSL 代码
- 调用 Eraser API:使用
/api/render/elements,并将diagramType设为"cloud-architecture-diagram"
说明
当用户提供 Terraform 代码时:
-
解析 Terraform
- 识别所有
resource块(AWS、Azure、GCP 等) - 提取
module块及其配置 - 记录
data源及其依赖项 - 识别
variable和output定义
- 识别所有
-
映射关系
- 跟踪资源依赖关系(例如:
subnet_id = aws_subnet.public.id) - 按提供商对资源分组(AWS、Azure、GCP)
- 识别作为其他资源容器的 VPC/VNet
- 记录安全组、IAM 角色和网络规则
- 跟踪资源依赖关系(例如:
-
生成 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 - 关键:标签格式规则
-
发起 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 }' - 如果你是 Claude(Anthropic),使用:
-
分析期间跟踪来源
在分析 Terraform 文件和资源以生成图表时,跟踪以下信息:
- 内部文件:记录读取的每个 Terraform 文件路径,以及提取的资源(例如,
infra/main.tf- VPC 和子网定义,infra/rds.tf- 数据库配置) - 外部参考资料:记录查阅的文档、示例或 URL(例如,Terraform AWS 提供商文档、AWS 架构最佳实践)
- 注释:记录每个来源对图表的贡献
- 内部文件:记录读取的每个 Terraform 文件路径,以及提取的资源(例如,
-
处理响应
关键:最简输出格式
响应必须始终包含以下部分,并使用清晰的标题:
-
图表预览:使用标题显示
## Diagram 使用 API 响应中的实际
imageUrl。 -
编辑器链接:使用标题显示
## Open in Eraser [Edit this diagram in the Eraser editor]({createEraserFileUrl})使用 API 响应中的实际 URL。
-
来源部分:简要列出分析的文件/资源(如适用)
## Sources - `path/to/file` - What was extracted -
图表代码部分:在带有
eraser语言标记的代码块中提供 Eraser DSL## Diagram Code ```eraser {DSL code here} -
了解更多链接:
你可以访问 https://docs.eraser.io/docs/using-ai-agent-integrations 进一步了解 Eraser
其他内容规则:
- 如果用户只要求生成图表,除以上 5 项外,不得包含任何内容
- 如果用户明确要求更多内容(例如“解释架构”“提出改进建议”),可以添加相应内容
- 不要添加未被要求的部分,例如概述、安全注意事项、测试等
默认输出应当简短。图表本身足以说明问题。
-
-
处理多个提供商
- 如果 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
}
预期行为
-
解析 Terraform:
- AWS:VPC、子网、EC2 实例
- Azure:资源组、VNet(多云服务商设置)
- 模块:依赖 VPC 的数据库模块
-
生成展示多云服务商和模块结构的 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 专属要求:将模块显示为容器,按云服务商分组,并包含资源依赖关系。
-
调用
/api/render/elements,并传入diagramType: "cloud-architecture-diagram"
结果
用户将收到一张展示以下内容的图表:
- VPC 作为容器
- 公有子网嵌套在 VPC 内
- 子网中的 EC2 实例
- 正确的 AWS 样式