基础设施即代码Skill writing-infrastructure-code

基础设施即代码技能涉及使用声明式和命令式工具自动化管理云资源,包括工具选择(如Terraform、Pulumi、AWS CDK)、状态管理、模块设计和部署流程。适用于多云、混合云和AWS环境,提升可重现性、协作和安全性。关键词:IaC, Terraform, Pulumi, AWS CDK, 云基础设施, 自动化部署, DevOps, 状态管理, 模块设计, 成本优化。

DevOps 0 次安装 0 次浏览 更新于 3/23/2026

名称:编写基础设施代码 描述:使用声明式和命令式IaC工具管理云基础设施。在配置云资源时使用(Terraform/OpenTofu用于多云,Pulumi用于以开发者为中心的工作流,AWS CDK用于AWS原生基础设施),设计可重用模块,实现状态管理模式,或建立基础设施部署工作流。

基础设施即代码

使用基于代码的自动化工具配置和管理云基础设施。此技能涵盖工具选择、状态管理、模块设计和操作模式,涉及Terraform/OpenTofu、Pulumi和AWS CDK。

何时使用

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

  • 配置云基础设施(计算、网络、数据库、存储)
  • 从手动基础设施迁移到基于代码的工作流
  • 设计可重用基础设施模块
  • 实现多云或混合云部署
  • 建立状态管理和漂移检测模式
  • 将基础设施配置集成到CI/CD流水线中
  • 评估IaC工具(Terraform vs Pulumi vs CDK)

常见请求:

  • “创建一个用于VPC配置的Terraform模块”
  • “为团队协作设置带锁的远程状态”
  • “比较Pulumi和Terraform适用于我们的用例”
  • “设计可组合的基础设施模块”
  • “为现有基础设施实现漂移检测”

核心概念

基础设施即代码基础

关键原则:

  1. 声明式 vs 命令式 - 描述期望状态(Terraform)或编程基础设施(Pulumi)
  2. 幂等性 - 相同输入产生相同输出,可安全重新运行
  3. 版本控制 - 基础设施变更在Git中跟踪
  4. 状态管理 - 跟踪实际基础设施状态
  5. 模块组合 - 可重用、版本化的基础设施组件

好处:

  • 可重现性(相同代码 = 相同基础设施)
  • 可审计性(Git历史显示所有变更)
  • 协作(基础设施变更的代码审查)
  • 自动化(CI/CD部署基础设施)
  • 灾难恢复(从代码重建)

工具选择框架

根据团队组成和云策略选择IaC工具:

Terraform/OpenTofu - 声明式、基于HCL

  • 多云和混合云部署
  • 运维/SRE团队偏好声明式方法
  • 最大提供商生态系统(AWS、GCP、Azure、3000+提供商)
  • 成熟模块注册表和社区

Pulumi - 命令式、基于编程语言

  • 以开发者为中心的团队熟悉TypeScript/Python/Go
  • 复杂逻辑需要编程构造(循环、条件、函数)
  • 使用熟悉测试框架进行本地单元测试
  • 强类型和IDE支持

AWS CDK - AWS原生、基于编程语言

  • 仅限AWS基础设施
  • 与AWS服务紧密集成
  • L1/L2/L3构造抽象
  • 底层使用CloudFormation

决策树:

需要多云?
├─ 是 → 团队组成?
│  ├─ 运维/SRE为主 → Terraform/OpenTofu
│  └─ 开发者为主 → Pulumi
└─ 否 → 仅限AWS?
   ├─ 是 → 语言偏好?
   │  ├─ HCL/声明式 → Terraform
   │  ├─ TypeScript/Python → AWS CDK
   │  └─ YAML/简单 → CloudFormation
   └─ 否 → 仅限GCP/Azure?
      └─ Terraform或Pulumi

状态管理架构

带锁的远程状态支持团队协作:

后端选择:

云提供商 推荐后端 锁定机制
AWS S3 + DynamoDB DynamoDB表
GCP Google云存储 原生
Azure Azure Blob存储 基于租约
多云 Terraform Cloud/企业版 内置
Pulumi Pulumi服务 内置

状态隔离策略:

  1. 目录分离(推荐大多数团队)

    • 每个环境单独目录(prod/staging/dev/
    • 完整状态文件隔离
    • 无跨环境污染风险
  2. 工作空间

    • 单一代码库,多个环境
    • 共享状态后端,环境命名空间
    • 风险:意外跨环境操作
  3. 分层架构

    • 网络、计算、数据层分开状态文件
    • 减少爆炸半径
    • 通过远程状态数据源进行跨层引用

关键状态管理规则:

  • 团队环境中始终使用远程状态
  • 启用状态文件静态加密
  • 启用状态存储版本化
  • 使用状态锁定防止并发修改
  • 永远不要将状态文件提交到Git
  • 将敏感输出标记为sensitive = true

模块设计模式

可组合模块结构:

模块/
├── vpc/              # 网络基础
├── 安全组/   # 可重用安全组模式
├── rds/              # 带备份、加密的数据库
├── ecs集群/      # 容器编排基础
├── ecs服务/      # 单个微服务
└── alb/              # 应用负载均衡器

模块版本控制:

  • 在生产中固定模块版本(version = "5.1.0"
  • 对内部模块使用语义版本控制
  • 在非生产环境中先测试模块更新
  • 维护模块发布的变更日志

模块设计原则:

  • 清晰输入契约(必需 vs 可选变量)
  • 文档化输出(消费者可引用的内容)
  • 尽可能提供合理默认值
  • 输入验证规则
  • 显示用法的示例目录

何时创建模块:

  • 资源组被重用3+次
  • 清晰边界和职责
  • 稳定接口契约
  • 团队有模块维护能力

何时保持单一:

  • 一次性基础设施
  • 快速原型阶段
  • 资源间高耦合
  • 小团队、简单基础设施

快速参考

Terraform/OpenTofu命令

# 初始化提供商和后端
terraform init

# 计划变更(预览)
terraform plan

# 应用变更
terraform apply

# 销毁基础设施
terraform destroy

# 格式化HCL文件
terraform fmt

# 验证语法
terraform validate

# 显示状态
terraform state list
terraform state show <资源>

# 导入现有资源
terraform import <资源.名称> <ID>

# 工作空间管理
terraform workspace list
terraform workspace new staging
terraform workspace select prod

Pulumi命令

# 初始化新项目
pulumi new aws-typescript

# 预览变更
pulumi preview

# 应用变更
pulumi up

# 销毁基础设施
pulumi destroy

# 显示栈输出
pulumi stack output

# 管理栈
pulumi stack ls
pulumi stack select prod

# 导入现有资源
pulumi import <类型> <名称> <ID>

# 导出/导入状态
pulumi stack export > state.json
pulumi stack import < state.json

AWS CDK命令

# 初始化新应用
cdk init app --language typescript

# 合成CloudFormation
cdk synth

# 预览变更
cdk diff

# 部署栈
cdk deploy

# 销毁栈
cdk destroy

# 引导账户/区域
cdk bootstrap

# 列出栈
cdk list

常见模式检查清单

基础设施配置:

  • [ ] 配置带锁的远程状态
  • [ ] 启用状态文件加密
  • [ ] 固定提供商版本
  • [ ] 固定模块版本(生产)
  • [ ] 变量有描述和类型
  • [ ] 敏感输出标记为敏感
  • [ ] 实现标签策略
  • [ ] 应用成本分配标签

模块开发:

  • [ ] 清晰README带用法示例
  • [ ] 文档化必需 vs 可选变量
  • [ ] 输出带描述文档化
  • [ ] 关键输入验证规则
  • [ ] 示例目录带工作代码
  • [ ] 模块行为测试(Terratest/CDK断言)
  • [ ] 版本跟踪变更日志
  • [ ] 遵循语义版本控制

操作准备:

  • [ ] 安排漂移检测
  • [ ] 计划/应用的CI/CD流水线
  • [ ] 状态备份策略
  • [ ] 文档化灾难恢复
  • [ ] 配置团队访问控制(IAM/RBAC)
  • [ ] 集成成本估算(Infracost)
  • [ ] 集成安全扫描(Checkov/tfsec)
  • [ ] 保持文档最新

详细文档

有关全面模式和实现细节:

工具特定模式:

  • references/terraform-patterns.md - Terraform/OpenTofu最佳实践、HCL模式
  • references/pulumi-patterns.md - Pulumi跨TypeScript/Python/Go

架构和设计:

  • references/state-management.md - 远程状态、锁定、隔离策略
  • references/module-design.md - 可组合模块、版本控制、注册表

操作:

  • references/drift-detection.md - 检测和修复基础设施漂移

工作示例

演示IaC模式的实践实现:

Terraform示例:

  • examples/terraform/vpc-module/ - 带公共/私有子网的多AZ VPC
  • examples/terraform/ecs-service/ - 带ALB、自动扩展的ECS服务
  • examples/terraform/rds-cluster/ - 带备份、加密的Aurora集群
  • examples/terraform/state-backend/ - S3 + DynamoDB后端设置

Pulumi示例:

  • examples/pulumi/typescript/vpc/ - TypeScript VPC组件
  • examples/pulumi/python/ecs-service/ - Python ECS服务
  • examples/pulumi/go/rds-cluster/ - Go RDS集群
  • examples/pulumi/testing/ - Pulumi程序的单元测试

AWS CDK示例:

  • examples/cdk/typescript/vpc-stack/ - 使用L2构造的VPC
  • examples/cdk/typescript/ecs-fargate/ - 带ALB的Fargate服务
  • examples/cdk/typescript/pipeline-stack/ - 自变CDK流水线
  • examples/cdk/testing/ - CDK断言和快照测试

实用脚本

自动化验证和操作工具:

  • scripts/validate-terraform.sh - Terraform格式化、验证、tflint
  • scripts/cost-estimate.sh - Infracost包装器用于成本分析
  • scripts/drift-check.sh - 安排漂移检测
  • scripts/security-scan.sh - Checkov/tfsec安全扫描
  • scripts/state-backup.sh - 状态文件备份自动化
  • scripts/module-release.sh - 模块版本控制和发布

与其他技能集成

部署流水线:

  • building-ci-pipelines - 在CI/CD中自动化terraform计划/应用
  • gitops-workflows - 基于GitOps的基础设施部署

平台工程:

  • kubernetes-operations - 配置EKS、GKE、AKS集群
  • platform-engineering - 内部开发者平台基础设施

安全:

  • secret-management - 配置Vault、外部秘密操作符
  • security-hardening - 实现基础设施安全控制
  • compliance-frameworks - 合规性策略即代码

操作:

  • observability - 配置监控基础设施(Prometheus、Grafana)
  • disaster-recovery - 基础设施重建过程
  • cost-optimization - 通过IaC实现成本控制

数据平台:

  • data-architecture - 配置数据湖、仓库
  • streaming-data - 配置Kafka、Kinesis基础设施

最佳实践

开发工作流:

  1. 在功能分支中编写基础设施代码
  2. 本地运行terraform plan / pulumi preview
  3. 提交带计划输出的拉取请求
  4. 代码审查聚焦安全、成本、爆炸半径
  5. CI运行自动化测试和安全扫描
  6. 仅在批准和CI通过后应用
  7. 部署后监控漂移

状态管理:

  • 从第一天起使用远程状态(团队永远不要本地状态)
  • 每个环境分开状态文件
  • 启用状态锁定防止并发修改 n- 版本化状态存储以支持回滚
  • 静态加密状态(包含敏感数据)
  • 定期备份状态到单独位置

模块开发:

  • 从单一代码开始,模式出现时提取模块
  • 设计可重用性但避免过早抽象
  • 文档化所有输入和输出
  • examples/目录提供工作示例
  • 在模块中固定提供商版本
  • 发布前测试模块
  • 发布使用语义版本控制

安全:

  • 应用前扫描IaC安全问题(Checkov、tfsec)
  • 永远不要将秘密提交到代码(使用秘密引用)
  • 标记敏感输出为sensitive = true
  • 实现最小权限IAM策略
  • 默认启用资源加密
  • 对内部模块使用私有模块注册表

成本管理:

  • 应用前估算成本(Infracost)
  • 标记所有资源用于成本分配
  • 在拉取请求中审查成本影响
  • 设置成本警报用于漂移
  • 基于使用情况调整资源大小

操作卓越:

  • 安排定期漂移检测
  • 文档化灾难恢复过程
  • 维护常见操作运行手册
  • 监控状态文件访问日志
  • 定期实践基础设施重建
  • 保持提供商版本最新并测试

常见陷阱

状态文件问题:

  • 手动状态编辑 - 使用terraform状态命令,不要直接编辑
  • 无状态锁定 - 竞态条件损坏状态
  • 团队使用本地状态 - 团队成员间状态分歧
  • 大状态文件 - 按层分解为多个状态文件

模块设计:

  • 过度抽象 - 太泛化,难以理解
  • 抽象不足 - 到处复制粘贴代码
  • 无版本固定 - 意外破坏性变更
  • 无示例 - 用户不知道如何使用模块

操作:

  • 无漂移检测 - 手动变更未被注意
  • 直接资源修改 - 绕过IaC创建漂移
  • 无回滚计划 - 无法从失败应用恢复
  • 忽略计划输出 - 应用期间意外

安全:

  • 代码中秘密 - 硬编码凭据
  • 无安全扫描 - 生产中的漏洞
  • 过于宽松的IAM - 过度权限
  • 无状态加密 - 敏感数据暴露

故障排除指南

状态锁问题:

terraform force-unlock <锁ID>  # 仅当确定无其他进程运行时使用

导入现有资源:

terraform import aws_vpc.main vpc-12345678
pulumi import aws:ec2/vpc:Vpc main vpc-12345678

漂移检测:

terraform plan -detailed-exitcode  # 退出码2 = 检测到漂移
pulumi preview --diff

有关详细漂移修复,见references/drift-detection.md

状态恢复:

# Terraform:从S3版本化恢复
aws s3 cp s3://bucket/backup/terraform.tfstate terraform.tfstate

# Pulumi:从检查点恢复
pulumi stack export --version <时间戳> | pulumi stack import

相关技能

针对云特定实现:

  • aws-patterns - AWS特定资源模式
  • gcp-patterns - GCP特定资源模式
  • azure-patterns - Azure特定资源模式

针对基础设施操作:

  • kubernetes-operations - 管理通过IaC配置的Kubernetes集群
  • gitops-workflows - 基于GitOps的基础设施部署
  • platform-engineering - 内部开发者平台

针对安全和合规:

  • security-hardening - 基础设施安全控制
  • secret-management - 秘密注入和轮换
  • compliance-frameworks - 合规性策略即代码

针对部署自动化:

  • building-ci-pipelines - 基础设施代码的CI/CD
  • deploying-applications - 应用部署到配置的基础设施

针对成本和可观察性:

  • cost-optimization - 基础设施的FinOps实践
  • observability - 监控基础设施健康