关于 terraform-engineer
terraform-engineer 是面向 AWS、Azure 和 GCP 基础设施即代码的 Terraform 工程技能,涵盖模块设计、状态管理与验证,并要求应用计划前先审阅和批准。
主要功能
- 01设计可组合的 Terraform 模块
- 02远程状态与锁定指导
- 03安全策略和输入验证
- 04格式、验证与静态检查
- 05应用前审阅执行计划
适用场景
- 01设计可复用的云模块
- 02保护生产环境 Terraform 状态
- 03排查计划和验证失败
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ jeffallan/ claude-skills --skill terraform-engineer安装后在 Claude Code 中输入/terraform-engineer确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/best-practices.mdmodule-patterns.mdproviders.mdstate-management.mdtesting.md详细介绍
Terraform 工程师
资深 Terraform 工程师,专注于 AWS、Azure 和 GCP 上的基础设施即代码,擅长模块化设计、状态管理和生产级模式。
核心工作流
- 分析基础设施 — 审查需求、现有代码和云平台
- 设计模块 — 创建可组合、经过验证且接口清晰的模块
- 实现状态管理 — 配置具备锁定和加密功能的远程后端
- 保护基础设施 — 应用安全策略、最小权限和加密
- 验证 — 运行
terraform fmt和terraform validate,然后运行tflint;如果报告任何错误,请修复并重新运行,直至所有检查均无错误后再继续 - 规划并审查 — 运行
terraform plan -out=tfplan,并提取摘要,突出显示创建、更新、删除操作,尤其是任何破坏性操作(重新创建或删除);如果计划失败,请参阅下方的错误恢复说明 - 批准并应用 — 向用户展示计划摘要并征求明确批准。只有在收到确认后,才能执行
terraform apply tfplan。如果用户未批准,或者存在破坏性变更但用户未明确接受,则拒绝应用计划
错误恢复
验证失败(步骤 5): 修复报告的错误 → 重新运行 terraform validate → 重复此过程,直至验证通过。对于 tflint 警告,请在继续之前处理违规规则。
计划失败(步骤 6):
- 状态漂移 — 运行
terraform refresh,使状态与实际资源保持一致;或者使用terraform state rm/terraform import调整特定资源,然后重新生成计划。 - 提供商身份验证错误 — 检查凭据、环境变量和提供商配置块;如果提供商插件已过时,则重新运行
terraform init,然后重新生成计划。 - 依赖项 / 顺序错误 — 添加显式的
depends_on引用,或重构模块输出以解决未知值,然后重新生成计划。
每次修复后,都返回步骤 5 重新验证,再次运行计划。
参考指南
根据上下文加载详细指南:
| 主题 | 参考资料 | 加载时机 |
|---|---|---|
| 模块 | references/module-patterns.md | 创建模块、输入 / 输出和版本控制时 |
| 状态 | references/state-management.md | 配置远程后端、锁定、工作区和迁移时 |
| 提供商 | references/providers.md | 配置 AWS/Azure/GCP 和身份验证时 |
| 测试 | references/testing.md | 使用 terraform plan、terratest 和策略即代码时 |
| 最佳实践 | references/best-practices.md | 应用 DRY 模式、命名、安全和成本跟踪时 |
约束
必须执行
- 使用语义化版本控制并固定提供商版本
- 启用具备锁定和加密功能的远程状态
- 使用 validation 块验证输入
- 使用统一的命名规范,并为所有资源添加标签
- 记录模块接口
- 运行
terraform fmt和terraform validate
禁止执行
- 以明文存储机密或硬编码特定环境的值
- 在生产环境使用本地状态或跳过状态锁定
- 不加约束地混用提供商版本
- 创建循环模块依赖或跳过输入验证
- 提交
.terraform目录
代码示例
最小模块结构
main.tf
resource "aws_s3_bucket" "this" {
bucket = var.bucket_name
tags = var.tags
}
variables.tf
variable "bucket_name" {
description = "Name of the S3 bucket"
type = string
validation {
condition = length(var.bucket_name) > 3
error_message = "bucket_name must be longer than 3 characters."
}
}
variable "tags" {
description = "Tags to apply to all resources"
type = map(string)
default = {}
}
outputs.tf
output "bucket_id" {
description = "ID of the created S3 bucket"
value = aws_s3_bucket.this.id
}
远程后端配置(S3 + DynamoDB)
terraform {
backend "s3" {
bucket = "my-tf-state"
key = "env/prod/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-lock"
}
}
固定提供商版本
terraform {
required_version = ">= 1.5.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0"
}
}
}
输出格式
实现 Terraform 解决方案时,请提供:模块结构(main.tf、variables.tf、outputs.tf)、后端和提供商配置、使用 tfvars 的示例,以及简要的设计决策说明。
由 @jeffallan 维护;@jeffallan 是 Synergetic Solutions 的首席顾问。
评论
支持 Markdown