32b - AI辅助IaC生成
本文是《AI Agent 实战手册》第 32 章第 2 节。 上一节:32a-AI辅助DevOps概览 | 下一节:32c-AI辅助CI-CD配置
概述
基础设施即代码(Infrastructure as Code, IaC)是现代 DevOps 的基石,而 AI 正在将 IaC 从”手动编写声明式配置”推向”自然语言驱动基础设施”的新范式。2025-2026 年,Spacelift Intent 实现了无需编写 HCL 即可通过自然语言配置云基础设施,Pulumi AI 支持用对话式交互生成多语言 IaC 代码,Amazon Q Developer 的 Console-to-Code 功能可将控制台操作自动转换为 CDK/CloudFormation 模板。本节深入覆盖 Terraform、Pulumi、AWS CDK 三大 IaC 工具的 AI 辅助生成实践,提供完整的 Prompt 模板库、安全扫描集成方案和成本估算工作流,帮助基础设施工程师在 AI 时代高效、安全地管理云基础设施。
1. AI 辅助 IaC 生成工具全景
1.1 工具推荐
| 工具 | 用途 | 价格 | 适用场景 |
|---|---|---|---|
| Spacelift Intent | 自然语言→云基础设施,无需编写 HCL | 开源版免费;商业版 Early Access(含策略和安全控制) | 快速原型、非 IaC 专家的基础设施配置 |
| Pulumi AI | 对话式 AI 生成多语言 IaC(TypeScript/Python/Go/C#) | 个人免费;Team $50/月起;Enterprise 定制 | 偏好通用编程语言的团队、多云管理 |
| Amazon Q Developer | AWS 原生 AI 助手,Console-to-Code 生成 CDK/CloudFormation | 免费版可用;Pro $19/用户/月 | AWS 生态深度用户、CDK 项目 |
| GitHub Copilot | IDE 内实时补全 Terraform/Pulumi/CDK 代码 | Individual $10/月;Business $19/用户/月;Enterprise $39/用户/月 | 通用 AI 编码助手、IDE 集成 |
| Claude Code | AI 编码 Agent,支持复杂多文件 IaC 生成 | Claude Pro $20/月(按 API 用量计费) | 复杂模块化 IaC 生成、架构设计 |
| Kiro | AI IDE,Spec 驱动开发,内置 Steering 规则 | 免费预览版 | Spec 驱动的 IaC 配置生成、团队标准化 |
| Cursor | AI 优先的代码编辑器,多文件编辑 | 免费版可用;Pro $20/月;Business $40/用户/月 | AI 辅助编码、多文件 IaC 编辑 |
| Firefly AIAC | 开源 AI IaC 生成器(CLI 工具) | 开源免费 | 命令行快速生成 IaC 片段 |
| Infracost | IaC 成本估算,CI/CD 集成 | 开源免费;Cloud $50/月起 | 部署前成本预估、PR 成本评审 |
| Spacelift | IaC 编排平台,内置 AI 助手 Saturnhead AI | 免费版可用;Cloud $0.30/运行;Enterprise 定制 | 多团队 IaC 管理、策略即代码、漂移检测 |
1.2 工具选择决策树
你需要 AI 辅助 IaC 生成?
│
├── 你是否熟悉 IaC?
│ ├── 不熟悉 → Spacelift Intent(自然语言,无需学习 HCL)
│ └── 熟悉 → 继续 ↓
│
├── 你偏好哪种 IaC 工具?
│ ├── Terraform (HCL) → GitHub Copilot + Claude Code + Spacelift
│ ├── Pulumi (TypeScript/Python/Go) → Pulumi AI + GitHub Copilot
│ ├── AWS CDK (TypeScript/Python) → Amazon Q Developer + GitHub Copilot
│ └── CloudFormation (YAML/JSON) → Amazon Q Developer
│
├── 你需要什么级别的 AI 辅助?
│ ├── 代码补全 → GitHub Copilot / Cursor
│ ├── 完整模块生成 → Claude Code / Kiro / Pulumi AI
│ └── 自然语言→基础设施 → Spacelift Intent
│
└── 你需要额外能力?
├── 成本估算 → + Infracost
├── 安全扫描 → + Checkov / tfsec / Snyk IaC
└── 漂移检测 → + Spacelift / env01.3 AI 辅助 IaC 的工作模式对比
| 工作模式 | 描述 | 代表工具 | 优势 | 局限 |
|---|---|---|---|---|
| 代码补全 | 在编辑器中实时补全 IaC 代码片段 | GitHub Copilot, Cursor | 无缝集成开发流程,学习成本低 | 缺乏全局上下文,可能生成不一致配置 |
| 对话式生成 | 通过自然语言对话生成完整 IaC 代码 | Pulumi AI, Claude Code | 可生成完整模块,支持迭代优化 | 需要人工审查和调整 |
| Spec 驱动生成 | 基于规范文档和 Steering 规则生成 IaC | Kiro, Claude Code | 符合团队标准,可重复性高 | 需要前期投入定义规范 |
| 意图驱动配置 | 自然语言描述意图,AI 直接调用云 API 配置 | Spacelift Intent | 无需学习 IaC 语法,极速配置 | 缺少代码审查环节,适合非关键环境 |
| 控制台转代码 | 将手动控制台操作转换为 IaC 代码 | Amazon Q Console-to-Code | 从现有配置反向生成 IaC | 生成代码可能不够模块化 |
2. Terraform AI 辅助生成
2.1 Terraform + AI 的核心工作流
┌─────────────────────────────────────────────────────────────────┐
│ Terraform AI 辅助生成工作流 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ① 需求描述 ② AI 生成 ③ 安全审查 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 自然语言 │ ──→ │ HCL 代码 │ ──→ │ Checkov │ │
│ │ 需求描述 │ │ 模块生成 │ │ tfsec │ │
│ │ + Steering│ │ + 变量 │ │ Snyk IaC │ │
│ │ 规则 │ │ + 输出 │ │ 人工审查 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │ │
│ ⑥ 监控漂移 ⑤ 部署执行 ④ 成本估算 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Spacelift │ ←── │ terraform │ ←── │ Infracost │ │
│ │ 漂移检测 │ │ plan │ │ 成本预估 │ │
│ │ AI 修复 │ │ apply │ │ PR 评审 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘2.2 操作步骤
步骤 1:定义 Terraform Steering 规则
在使用 AI 生成 Terraform 代码之前,先定义 Steering 规则确保生成的代码符合团队标准:
Kiro Steering 文件(.kiro/steering/terraform.md):
---
inclusion: auto
globs: ["**/*.tf", "**/*.tfvars", "**/terraform/**"]
---
# Terraform Steering 规则
## 通用规则
- 使用 Terraform >= 1.9 语法
- 所有资源必须包含 `tags` 块,至少包含 environment、team、cost-center、managed-by 标签
- 使用 `terraform-aws-modules` 官方模块优先于自定义资源
- 变量必须包含 `description` 和 `type`,敏感变量标记 `sensitive = true`
- 输出必须包含 `description`
## 安全规则
- 安全组禁止 `0.0.0.0/0` 入站规则(ALB/NLB 的 80/443 端口除外)
- 所有 S3 存储桶必须启用 `server_side_encryption_configuration` 和 `versioning`
- 所有 S3 存储桶必须阻止公共访问(`block_public_acls = true` 等)
- RDS 实例必须启用 `storage_encrypted = true` 和 `backup_retention_period >= 7`
- IAM 策略必须遵循最小权限原则,禁止使用 `"Action": "*"` 或 `"Resource": "*"`
- 使用 `aws_kms_key` 管理加密密钥,禁止使用默认密钥
## 架构规则
- 生产环境必须使用多 AZ 部署
- 使用远程状态存储(S3 + DynamoDB 锁)
- 模块化结构:networking、compute、database、monitoring 分离
- 每个模块包含 `variables.tf`、`outputs.tf`、`main.tf`、`versions.tf`
## 命名规则
- 资源命名格式:`{project}-{environment}-{resource-type}-{identifier}`
- 变量命名使用 snake_case
- 模块命名使用 kebab-caseCLAUDE.md DevOps 规则片段:
## Terraform 生成规则
当生成 Terraform 代码时:
1. 始终使用模块化结构(networking/compute/database/monitoring 分离)
2. 所有资源添加标准标签(environment, team, cost-center, managed-by)
3. 安全组遵循最小权限,禁止 0.0.0.0/0 入站(ALB 80/443 除外)
4. 数据库启用加密存储和自动备份(≥7 天)
5. S3 启用版本控制、加密和公共访问阻止
6. 使用远程状态存储(S3 + DynamoDB)
7. 变量和输出必须包含 description
8. 敏感变量标记 sensitive = true
9. 优先使用 terraform-aws-modules 官方模块
10. 包含 README.md 说明模块用途和使用方法步骤 2:使用 AI 生成 Terraform 模块
方式一:使用 Claude Code / Kiro 生成完整模块
在 IDE 中使用以下 prompt 生成完整的 Terraform 模块:
请为以下需求生成模块化的 Terraform 配置:
## 需求
一个高可用的 Web 应用基础设施,包含:
- VPC(3 个 AZ,公有/私有子网,NAT Gateway)
- Application Load Balancer(HTTPS,ACM 证书)
- ECS Fargate 服务(自动扩缩容 2-10 实例)
- RDS PostgreSQL 16(Multi-AZ,加密存储,自动备份 14 天)
- ElastiCache Redis 7(集群模式,加密传输)
- S3 存储桶(静态资源 + 日志存储,版本控制)
- CloudWatch 日志组和告警
## 约束
- 云提供商:AWS
- 区域:ap-northeast-1
- 环境:production
- 月度预算:$2000 以内
## 模块结构
modules/
├── networking/ # VPC, 子网, NAT, 安全组
├── compute/ # ECS, ALB, 自动扩缩容
├── database/ # RDS, ElastiCache
├── storage/ # S3
└── monitoring/ # CloudWatch, SNS
## 输出要求
1. 每个模块包含 main.tf, variables.tf, outputs.tf, versions.tf
2. 根目录包含 main.tf(调用模块), variables.tf, outputs.tf, terraform.tfvars.example
3. 遵循 .kiro/steering/terraform.md 中的所有规则
4. 包含 README.md 说明架构和使用方法方式二:使用 Pulumi AI 对话式生成
访问 pulumi.com/ai 或在 CLI 中使用:
# 安装 Pulumi AI CLI 插件
pulumi ai web
# 在浏览器中打开 Pulumi AI 对话界面
# 输入自然语言描述:
# "Create a highly available web application infrastructure on AWS with
# VPC, ALB, ECS Fargate, RDS PostgreSQL, and ElastiCache Redis.
# Use TypeScript. Include auto-scaling and encryption."方式三:使用 Spacelift Intent 自然语言配置
# 安装 Spacelift Intent CLI
# Intent 直接调用云 API,无需编写 HCL
spacelift intent apply "Create a VPC with 3 availability zones,
public and private subnets, and a NAT gateway in ap-northeast-1"步骤 3:AI 生成的 Terraform 代码示例
以下是 AI 生成的 networking 模块示例(经人工审查和优化):
modules/networking/main.tf:
# ============================================================
# Networking Module - VPC, Subnets, NAT Gateway, Security Groups
# ============================================================
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.0"
name = "${var.project}-${var.environment}-vpc"
cidr = var.vpc_cidr
azs = var.availability_zones
private_subnets = var.private_subnet_cidrs
public_subnets = var.public_subnet_cidrs
enable_nat_gateway = true
single_nat_gateway = var.environment != "production"
one_nat_gateway_per_az = var.environment == "production"
enable_dns_hostnames = true
enable_dns_support = true
# 流日志
enable_flow_log = true
create_flow_log_cloudwatch_log_group = true
create_flow_log_iam_role = true
tags = merge(var.common_tags, {
Module = "networking"
})
}
# ALB 安全组
resource "aws_security_group" "alb" {
name_prefix = "${var.project}-${var.environment}-alb-"
description = "Security group for Application Load Balancer"
vpc_id = module.vpc.vpc_id
ingress {
description = "HTTPS from internet"
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
description = "HTTP from internet (redirect to HTTPS)"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
description = "All outbound traffic"
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = merge(var.common_tags, {
Name = "${var.project}-${var.environment}-alb-sg"
Module = "networking"
})
lifecycle {
create_before_destroy = true
}
}
# ECS 任务安全组
resource "aws_security_group" "ecs_tasks" {
name_prefix = "${var.project}-${var.environment}-ecs-"
description = "Security group for ECS tasks"
vpc_id = module.vpc.vpc_id
ingress {
description = "Traffic from ALB only"
from_port = var.app_port
to_port = var.app_port
protocol = "tcp"
security_groups = [aws_security_group.alb.id]
}
egress {
description = "All outbound traffic"
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = merge(var.common_tags, {
Name = "${var.project}-${var.environment}-ecs-sg"
Module = "networking"
})
lifecycle {
create_before_destroy = true
}
}
# 数据库安全组
resource "aws_security_group" "database" {
name_prefix = "${var.project}-${var.environment}-db-"
description = "Security group for RDS database"
vpc_id = module.vpc.vpc_id
ingress {
description = "PostgreSQL from ECS tasks only"
from_port = 5432
to_port = 5432
protocol = "tcp"
security_groups = [aws_security_group.ecs_tasks.id]
}
# 注意:没有 egress 规则 = 没有出站流量(数据库不需要)
# 如需出站,请明确指定目标
tags = merge(var.common_tags, {
Name = "${var.project}-${var.environment}-db-sg"
Module = "networking"
})
lifecycle {
create_before_destroy = true
}
}modules/networking/variables.tf:
variable "project" {
description = "项目名称,用于资源命名前缀"
type = string
}
variable "environment" {
description = "部署环境(dev/staging/production)"
type = string
validation {
condition = contains(["dev", "staging", "production"], var.environment)
error_message = "environment 必须是 dev、staging 或 production 之一"
}
}
variable "vpc_cidr" {
description = "VPC CIDR 块"
type = string
default = "10.0.0.0/16"
}
variable "availability_zones" {
description = "可用区列表"
type = list(string)
default = ["ap-northeast-1a", "ap-northeast-1c", "ap-northeast-1d"]
}
variable "private_subnet_cidrs" {
description = "私有子网 CIDR 列表"
type = list(string)
default = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
}
variable "public_subnet_cidrs" {
description = "公有子网 CIDR 列表"
type = list(string)
default = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
}
variable "app_port" {
description = "应用程序端口"
type = number
default = 3000
}
variable "common_tags" {
description = "应用于所有资源的通用标签"
type = map(string)
default = {}
}步骤 4:人工审查 AI 生成的 Terraform 代码
AI 生成的 Terraform 代码必须经过以下审查清单:
安全审查清单:
| 检查项 | 说明 | 严重性 |
|---|---|---|
| 安全组入站规则 | 是否存在 0.0.0.0/0 入站(ALB 80/443 除外) | 🔴 高 |
| IAM 权限范围 | 是否使用 "Action": "*" 或 "Resource": "*" | 🔴 高 |
| 加密配置 | RDS/S3/EBS 是否启用加密 | 🔴 高 |
| 密钥硬编码 | 是否在代码中硬编码密钥或密码 | 🔴 高 |
| S3 公共访问 | 是否阻止公共访问 | 🟡 中 |
| 备份配置 | RDS 备份保留期是否 ≥ 7 天 | 🟡 中 |
| 日志启用 | VPC 流日志、S3 访问日志是否启用 | 🟡 中 |
| 标签完整性 | 是否包含所有必需标签 | 🟢 低 |
| 版本锁定 | provider 和 module 版本是否锁定 | 🟢 低 |
架构审查清单:
| 检查项 | 说明 |
|---|---|
| 高可用性 | 生产环境是否跨多 AZ 部署 |
| 自动扩缩容 | 是否配置合理的扩缩容策略 |
| 状态管理 | 是否使用远程状态存储 |
| 模块化 | 是否按职责分离模块 |
| 变量验证 | 是否包含输入验证规则 |
| 输出定义 | 是否暴露必要的输出值 |
2.3 Terraform 状态管理的 AI 辅助
远程状态存储配置
使用 AI 生成安全的远程状态存储配置:
提示词模板:
请生成 Terraform 远程状态存储的引导配置(bootstrap),包含:
1. S3 存储桶(加密、版本控制、阻止公共访问、生命周期策略)
2. DynamoDB 表(状态锁定)
3. IAM 策略(最小权限访问状态存储)
4. backend 配置示例
要求:
- 存储桶名称包含账户 ID 以确保全局唯一
- 启用 S3 存储桶日志记录
- DynamoDB 使用按需计费模式
- 包含防止意外删除的保护措施AI 生成的状态存储配置示例:
# backend-bootstrap/main.tf
# 用于初始化 Terraform 远程状态存储的引导配置
terraform {
required_version = ">= 1.9"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
data "aws_caller_identity" "current" {}
data "aws_region" "current" {}
locals {
bucket_name = "${var.project}-${data.aws_caller_identity.current.account_id}-tfstate"
table_name = "${var.project}-tfstate-lock"
}
# 状态存储桶
resource "aws_s3_bucket" "tfstate" {
bucket = local.bucket_name
# 防止意外删除
lifecycle {
prevent_destroy = true
}
tags = {
Name = local.bucket_name
Purpose = "terraform-state"
Environment = "shared"
ManagedBy = "terraform-bootstrap"
}
}
resource "aws_s3_bucket_versioning" "tfstate" {
bucket = aws_s3_bucket.tfstate.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_s3_bucket_server_side_encryption_configuration" "tfstate" {
bucket = aws_s3_bucket.tfstate.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "aws:kms"
}
bucket_key_enabled = true
}
}
resource "aws_s3_bucket_public_access_block" "tfstate" {
bucket = aws_s3_bucket.tfstate.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
# 状态锁定表
resource "aws_dynamodb_table" "tfstate_lock" {
name = local.table_name
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
point_in_time_recovery {
enabled = true
}
tags = {
Name = local.table_name
Purpose = "terraform-state-lock"
Environment = "shared"
ManagedBy = "terraform-bootstrap"
}
}漂移检测与 AI 修复
当基础设施配置发生漂移时,AI 可以辅助分析和修复:
提示词模板:
Terraform plan 检测到以下配置漂移:
[粘贴 terraform plan 输出]
请分析:
1. 漂移的根本原因是什么?(手动修改?自动扩缩容?AWS 服务更新?)
2. 是否需要修复?还是应该将当前状态导入 Terraform?
3. 如果需要修复,请提供修复方案
4. 如何防止此类漂移再次发生?2.4 Terraform 模块组合的 AI 辅助
模块组合模式
AI 可以帮助设计和实现 Terraform 模块的组合模式:
提示词模板:
我有以下 Terraform 模块:
- modules/networking(VPC、子网、安全组)
- modules/compute(ECS Fargate)
- modules/database(RDS PostgreSQL)
请生成根模块(root module)的 main.tf,实现:
1. 模块间的依赖关系正确传递(networking → compute, networking → database)
2. 支持多环境部署(dev/staging/production)
3. 使用 terraform.tfvars 文件管理环境差异
4. 包含条件逻辑(如 dev 环境不需要 Multi-AZ)AI 生成的根模块示例:
# main.tf - 根模块,组合所有子模块
terraform {
required_version = ">= 1.9"
backend "s3" {
bucket = "myproject-123456789012-tfstate"
key = "infrastructure/terraform.tfstate"
region = "ap-northeast-1"
dynamodb_table = "myproject-tfstate-lock"
encrypt = true
}
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = var.aws_region
default_tags {
tags = {
Project = var.project
Environment = var.environment
ManagedBy = "terraform"
CostCenter = var.cost_center
Team = var.team
}
}
}
# ============================================================
# Networking Module
# ============================================================
module "networking" {
source = "./modules/networking"
project = var.project
environment = var.environment
vpc_cidr = var.vpc_cidr
availability_zones = var.availability_zones
private_subnet_cidrs = var.private_subnet_cidrs
public_subnet_cidrs = var.public_subnet_cidrs
app_port = var.app_port
common_tags = local.common_tags
}
# ============================================================
# Database Module
# ============================================================
module "database" {
source = "./modules/database"
project = var.project
environment = var.environment
vpc_id = module.networking.vpc_id
private_subnet_ids = module.networking.private_subnet_ids
database_sg_id = module.networking.database_sg_id
# 环境差异化配置
instance_class = var.db_instance_class
multi_az = var.environment == "production"
backup_retention = var.environment == "production" ? 14 : 7
deletion_protection = var.environment == "production"
common_tags = local.common_tags
}
# ============================================================
# Compute Module
# ============================================================
module "compute" {
source = "./modules/compute"
project = var.project
environment = var.environment
vpc_id = module.networking.vpc_id
private_subnet_ids = module.networking.private_subnet_ids
public_subnet_ids = module.networking.public_subnet_ids
alb_sg_id = module.networking.alb_sg_id
ecs_sg_id = module.networking.ecs_sg_id
# 应用配置
app_port = var.app_port
app_image = var.app_image
desired_count = var.ecs_desired_count
min_capacity = var.ecs_min_capacity
max_capacity = var.ecs_max_capacity
# 数据库连接信息
database_endpoint = module.database.endpoint
database_name = module.database.database_name
common_tags = local.common_tags
}
# ============================================================
# Locals
# ============================================================
locals {
common_tags = {
Project = var.project
Environment = var.environment
Team = var.team
CostCenter = var.cost_center
}
}环境差异化配置(environments/production.tfvars):
# Production 环境配置
project = "myapp"
environment = "production"
aws_region = "ap-northeast-1"
team = "platform"
cost_center = "eng-001"
# Networking
vpc_cidr = "10.0.0.0/16"
availability_zones = ["ap-northeast-1a", "ap-northeast-1c", "ap-northeast-1d"]
private_subnet_cidrs = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnet_cidrs = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
# Compute
app_port = 3000
ecs_desired_count = 3
ecs_min_capacity = 2
ecs_max_capacity = 10
# Database
db_instance_class = "db.r6g.large"3. Pulumi AI 辅助生成
3.1 Pulumi AI 概述
Pulumi 的核心优势在于使用通用编程语言(TypeScript、Python、Go、C#)编写 IaC,这使得 AI 代码生成更加自然——AI 模型对这些语言的训练数据远多于 HCL。Pulumi AI 是一个专门为 IaC 场景优化的 AI 助手,支持对话式交互生成 Pulumi 程序。
3.2 工具推荐
| 工具 | 用途 | 价格 | 适用场景 |
|---|---|---|---|
| Pulumi AI | 对话式 AI 生成 Pulumi 程序 | 免费使用(pulumi.com/ai) | 快速原型、学习 Pulumi |
| Pulumi Agent Skills | AI 编码助手的 Pulumi 最佳实践指南 | 开源免费 | Claude Code/Cursor/Copilot 集成 |
| Pulumi Copilot | Pulumi Cloud 内置 AI 助手 | Pulumi Cloud 订阅内含 | 基础设施查询、故障排查 |
| Pulumi ESC | 环境、密钥和配置管理 | 免费版可用;Team $50/月起 | 多环境密钥管理 |
3.3 操作步骤
步骤 1:使用 Pulumi AI 生成基础设施
方式一:Pulumi AI Web 界面
访问 pulumi.com/ai ,输入自然语言描述:
Create a highly available web application on AWS using TypeScript:
- VPC with 3 AZs, public and private subnets
- Application Load Balancer with HTTPS
- ECS Fargate service with auto-scaling (2-10 tasks)
- RDS PostgreSQL with Multi-AZ and encryption
- S3 bucket for static assets
- CloudWatch alarms for CPU and memoryPulumi AI 会生成完整的 TypeScript 程序,支持迭代优化(“请添加 Redis 缓存”、“请优化安全组规则”)。
方式二:使用 Pulumi Agent Skills 配合 AI 编码助手
Pulumi 提供了专门的 Agent Skills 文件,可以集成到 Claude Code、Cursor 等 AI 编码助手中,确保生成的 Pulumi 代码遵循最佳实践:
# 在项目中添加 Pulumi Agent Skills
# 参考 https://github.com/pulumi/pulumi-agent-skills步骤 2:Pulumi TypeScript 代码示例
以下是 AI 生成的 Pulumi TypeScript 基础设施代码(经人工审查):
// index.ts - Pulumi AWS 基础设施
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
import * as awsx from "@pulumi/awsx";
// ============================================================
// 配置
// ============================================================
const config = new pulumi.Config();
const project = config.require("project");
const environment = config.require("environment");
const dbPassword = config.requireSecret("dbPassword");
const commonTags = {
Project: project,
Environment: environment,
ManagedBy: "pulumi",
};
// ============================================================
// VPC
// ============================================================
const vpc = new awsx.ec2.Vpc(`${project}-vpc`, {
cidrBlock: "10.0.0.0/16",
numberOfAvailabilityZones: 3,
natGateways: {
strategy: environment === "production"
? awsx.ec2.NatGatewayStrategy.OnePerAz
: awsx.ec2.NatGatewayStrategy.Single,
},
enableDnsHostnames: true,
enableDnsSupport: true,
tags: { ...commonTags, Name: `${project}-${environment}-vpc` },
});
// ============================================================
// 安全组
// ============================================================
const albSg = new aws.ec2.SecurityGroup(`${project}-alb-sg`, {
vpcId: vpc.vpcId,
description: "Security group for ALB",
ingress: [
{ protocol: "tcp", fromPort: 443, toPort: 443, cidrBlocks: ["0.0.0.0/0"], description: "HTTPS" },
{ protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"], description: "HTTP redirect" },
],
egress: [
{ protocol: "-1", fromPort: 0, toPort: 0, cidrBlocks: ["0.0.0.0/0"], description: "All outbound" },
],
tags: { ...commonTags, Name: `${project}-${environment}-alb-sg` },
});
const ecsSg = new aws.ec2.SecurityGroup(`${project}-ecs-sg`, {
vpcId: vpc.vpcId,
description: "Security group for ECS tasks",
ingress: [
{
protocol: "tcp",
fromPort: 3000,
toPort: 3000,
securityGroups: [albSg.id],
description: "Traffic from ALB",
},
],
egress: [
{ protocol: "-1", fromPort: 0, toPort: 0, cidrBlocks: ["0.0.0.0/0"], description: "All outbound" },
],
tags: { ...commonTags, Name: `${project}-${environment}-ecs-sg` },
});
const dbSg = new aws.ec2.SecurityGroup(`${project}-db-sg`, {
vpcId: vpc.vpcId,
description: "Security group for RDS",
ingress: [
{
protocol: "tcp",
fromPort: 5432,
toPort: 5432,
securityGroups: [ecsSg.id],
description: "PostgreSQL from ECS",
},
],
tags: { ...commonTags, Name: `${project}-${environment}-db-sg` },
});
// ============================================================
// RDS PostgreSQL
// ============================================================
const dbSubnetGroup = new aws.rds.SubnetGroup(`${project}-db-subnet`, {
subnetIds: vpc.privateSubnetIds,
tags: commonTags,
});
const db = new aws.rds.Instance(`${project}-db`, {
engine: "postgres",
engineVersion: "16.4",
instanceClass: environment === "production" ? "db.r6g.large" : "db.t4g.medium",
allocatedStorage: 50,
maxAllocatedStorage: 200,
dbName: project.replace(/-/g, "_"),
username: "app_admin",
password: dbPassword,
dbSubnetGroupName: dbSubnetGroup.name,
vpcSecurityGroupIds: [dbSg.id],
multiAz: environment === "production",
storageEncrypted: true,
backupRetentionPeriod: environment === "production" ? 14 : 7,
deletionProtection: environment === "production",
skipFinalSnapshot: environment !== "production",
performanceInsightsEnabled: true,
tags: { ...commonTags, Name: `${project}-${environment}-db` },
});
// ============================================================
// ECS Fargate + ALB
// ============================================================
const cluster = new aws.ecs.Cluster(`${project}-cluster`, {
settings: [{ name: "containerInsights", value: "enabled" }],
tags: commonTags,
});
const alb = new awsx.lb.ApplicationLoadBalancer(`${project}-alb`, {
subnetIds: vpc.publicSubnetIds,
securityGroups: [albSg.id],
tags: commonTags,
});
const service = new awsx.ecs.FargateService(`${project}-service`, {
cluster: cluster.arn,
networkConfiguration: {
subnets: vpc.privateSubnetIds,
securityGroups: [ecsSg.id],
},
desiredCount: environment === "production" ? 3 : 1,
taskDefinitionArgs: {
container: {
name: `${project}-app`,
image: config.require("appImage"),
cpu: 512,
memory: 1024,
essential: true,
portMappings: [{ containerPort: 3000, targetGroup: alb.defaultTargetGroup }],
environment: [
{ name: "NODE_ENV", value: environment },
{ name: "DATABASE_HOST", value: db.address },
{ name: "DATABASE_NAME", value: db.dbName },
],
secrets: [
{ name: "DATABASE_PASSWORD", valueFrom: dbPassword.apply(p => p) },
],
logConfiguration: {
logDriver: "awslogs",
options: {
"awslogs-group": `/ecs/${project}-${environment}`,
"awslogs-region": aws.config.region!,
"awslogs-stream-prefix": "app",
},
},
healthCheck: {
command: ["CMD-SHELL", "curl -f http://localhost:3000/health || exit 1"],
interval: 30,
timeout: 5,
retries: 3,
startPeriod: 60,
},
},
},
tags: commonTags,
});
// ============================================================
// Auto Scaling
// ============================================================
const scalingTarget = new aws.appautoscaling.Target(`${project}-scaling-target`, {
maxCapacity: 10,
minCapacity: environment === "production" ? 2 : 1,
resourceId: pulumi.interpolate`service/${cluster.name}/${service.service.name}`,
scalableDimension: "ecs:service:DesiredCount",
serviceNamespace: "ecs",
});
new aws.appautoscaling.Policy(`${project}-cpu-scaling`, {
policyType: "TargetTrackingScaling",
resourceId: scalingTarget.resourceId,
scalableDimension: scalingTarget.scalableDimension,
serviceNamespace: scalingTarget.serviceNamespace,
targetTrackingScalingPolicyConfiguration: {
predefinedMetricSpecification: {
predefinedMetricType: "ECSServiceAverageCPUUtilization",
},
targetValue: 70,
scaleInCooldown: 300,
scaleOutCooldown: 60,
},
});
// ============================================================
// 输出
// ============================================================
export const vpcId = vpc.vpcId;
export const albDnsName = alb.loadBalancer.dnsName;
export const dbEndpoint = db.endpoint;
export const ecsClusterName = cluster.name;3.4 Pulumi vs Terraform 的 AI 生成对比
| 维度 | Terraform + AI | Pulumi + AI |
|---|---|---|
| AI 生成质量 | 中-高(HCL 训练数据较少) | 高(通用语言训练数据丰富) |
| 类型安全 | 无(HCL 弱类型) | 强(TypeScript/Go 编译时检查) |
| 条件逻辑 | 有限(count/for_each/dynamic) | 完整(if/else/for/map/filter) |
| 测试支持 | 有限(terratest) | 丰富(标准测试框架) |
| IDE 支持 | 中等 | 优秀(完整 IntelliSense) |
| 社区生态 | 极大(市场主导) | 增长中(活跃社区) |
| 学习曲线 | 需学习 HCL | 使用已知语言 |
| AI 辅助调试 | 较难(HCL 错误信息不直观) | 较易(标准编译错误) |
4. AWS CDK AI 辅助生成
4.1 AWS CDK + AI 概述
AWS Cloud Development Kit(CDK)使用 TypeScript、Python 等编程语言定义 AWS 基础设施。Amazon Q Developer 是 AWS 原生的 AI 助手,深度集成 CDK 开发体验,其 Console-to-Code 功能可以将 AWS 控制台操作自动转换为 CDK 代码。
4.2 工具推荐
| 工具 | 用途 | 价格 | 适用场景 |
|---|---|---|---|
| Amazon Q Developer | AWS 原生 AI 助手,CDK 代码生成和优化 | 免费版可用;Pro $19/用户/月 | AWS 深度用户、CDK 项目 |
| Console-to-Code | 将 AWS 控制台操作转换为 CDK/CloudFormation | Amazon Q Developer 内含 | 从现有配置反向生成 IaC |
| CDK Migrate | 将现有 CloudFormation 模板迁移到 CDK | AWS CDK 内置(免费) | CloudFormation → CDK 迁移 |
| GitHub Copilot | IDE 内 CDK 代码补全 | $10-39/用户/月 | 通用 AI 编码助手 |
4.3 操作步骤
步骤 1:使用 Amazon Q Developer 生成 CDK 代码
Console-to-Code 工作流:
- 在 AWS 管理控制台中手动配置资源(如创建 VPC、RDS 实例)
- Amazon Q Developer 自动记录操作
- 点击”生成代码”,选择输出格式(CDK TypeScript/Python、CloudFormation YAML/JSON)
- 审查生成的代码,调整参数化配置
- 将代码集成到 CDK 项目中
IDE 内 AI 辅助生成:
在 VS Code 或 JetBrains IDE 中安装 Amazon Q Developer 插件,使用 @workspace 指令获取项目上下文感知的 CDK 代码建议。
步骤 2:CDK TypeScript 代码示例
提示词模板:
请使用 AWS CDK v2 (TypeScript) 生成以下基础设施:
## 需求
高可用 Web 应用架构:
- VPC(3 AZ,公有/私有子网,NAT Gateway)
- Application Load Balancer(HTTPS,ACM 证书)
- ECS Fargate 服务(自动扩缩容)
- RDS PostgreSQL(Multi-AZ,加密)
- S3 存储桶(静态资源)
## 约束
- 使用 CDK L2/L3 构造(高级抽象)
- 遵循 AWS Well-Architected Framework
- 包含 CDK Nag 安全检查
- 使用 Stack 分离(NetworkStack, DatabaseStack, ComputeStack)AI 生成的 CDK 代码示例:
// lib/network-stack.ts
import * as cdk from "aws-cdk-lib";
import * as ec2 from "aws-cdk-lib/aws-ec2";
import { Construct } from "constructs";
export interface NetworkStackProps extends cdk.StackProps {
project: string;
environment: string;
}
export class NetworkStack extends cdk.Stack {
public readonly vpc: ec2.Vpc;
public readonly albSecurityGroup: ec2.SecurityGroup;
public readonly ecsSecurityGroup: ec2.SecurityGroup;
public readonly dbSecurityGroup: ec2.SecurityGroup;
constructor(scope: Construct, id: string, props: NetworkStackProps) {
super(scope, id, props);
// VPC - 3 AZ,公有/私有子网
this.vpc = new ec2.Vpc(this, "Vpc", {
vpcName: `${props.project}-${props.environment}-vpc`,
maxAzs: 3,
natGateways: props.environment === "production" ? 3 : 1,
subnetConfiguration: [
{
cidrMask: 24,
name: "Public",
subnetType: ec2.SubnetType.PUBLIC,
},
{
cidrMask: 24,
name: "Private",
subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
},
{
cidrMask: 24,
name: "Isolated",
subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
},
],
flowLogs: {
default: {
destination: ec2.FlowLogDestination.toCloudWatchLogs(),
trafficType: ec2.FlowLogTrafficType.REJECT,
},
},
});
// ALB 安全组
this.albSecurityGroup = new ec2.SecurityGroup(this, "AlbSg", {
vpc: this.vpc,
description: "Security group for ALB",
allowAllOutbound: true,
});
this.albSecurityGroup.addIngressRule(
ec2.Peer.anyIpv4(),
ec2.Port.tcp(443),
"HTTPS from internet"
);
this.albSecurityGroup.addIngressRule(
ec2.Peer.anyIpv4(),
ec2.Port.tcp(80),
"HTTP redirect"
);
// ECS 安全组 - 仅允许来自 ALB 的流量
this.ecsSecurityGroup = new ec2.SecurityGroup(this, "EcsSg", {
vpc: this.vpc,
description: "Security group for ECS tasks",
allowAllOutbound: true,
});
this.ecsSecurityGroup.addIngressRule(
this.albSecurityGroup,
ec2.Port.tcp(3000),
"Traffic from ALB"
);
// 数据库安全组 - 仅允许来自 ECS 的流量
this.dbSecurityGroup = new ec2.SecurityGroup(this, "DbSg", {
vpc: this.vpc,
description: "Security group for RDS",
allowAllOutbound: false,
});
this.dbSecurityGroup.addIngressRule(
this.ecsSecurityGroup,
ec2.Port.tcp(5432),
"PostgreSQL from ECS"
);
}
}// lib/database-stack.ts
import * as cdk from "aws-cdk-lib";
import * as ec2 from "aws-cdk-lib/aws-ec2";
import * as rds from "aws-cdk-lib/aws-rds";
import { Construct } from "constructs";
export interface DatabaseStackProps extends cdk.StackProps {
project: string;
environment: string;
vpc: ec2.Vpc;
securityGroup: ec2.SecurityGroup;
}
export class DatabaseStack extends cdk.Stack {
public readonly instance: rds.DatabaseInstance;
constructor(scope: Construct, id: string, props: DatabaseStackProps) {
super(scope, id, props);
this.instance = new rds.DatabaseInstance(this, "Database", {
engine: rds.DatabaseInstanceEngine.postgres({
version: rds.PostgresEngineVersion.VER_16_4,
}),
instanceType: props.environment === "production"
? ec2.InstanceType.of(ec2.InstanceClass.R6G, ec2.InstanceSize.LARGE)
: ec2.InstanceType.of(ec2.InstanceClass.T4G, ec2.InstanceSize.MEDIUM),
vpc: props.vpc,
vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_ISOLATED },
securityGroups: [props.securityGroup],
multiAz: props.environment === "production",
storageEncrypted: true,
backupRetention: cdk.Duration.days(
props.environment === "production" ? 14 : 7
),
deletionProtection: props.environment === "production",
removalPolicy: props.environment === "production"
? cdk.RemovalPolicy.RETAIN
: cdk.RemovalPolicy.DESTROY,
enablePerformanceInsights: true,
allocatedStorage: 50,
maxAllocatedStorage: 200,
databaseName: props.project.replace(/-/g, "_"),
credentials: rds.Credentials.fromGeneratedSecret("app_admin", {
secretName: `${props.project}/${props.environment}/db-credentials`,
}),
});
}
}// bin/app.ts - CDK 应用入口
import * as cdk from "aws-cdk-lib";
import { NetworkStack } from "../lib/network-stack";
import { DatabaseStack } from "../lib/database-stack";
// import { ComputeStack } from "../lib/compute-stack";
const app = new cdk.App();
const project = app.node.tryGetContext("project") || "myapp";
const environment = app.node.tryGetContext("environment") || "dev";
const env = {
account: process.env.CDK_DEFAULT_ACCOUNT,
region: process.env.CDK_DEFAULT_REGION || "ap-northeast-1",
};
const networkStack = new NetworkStack(app, `${project}-${environment}-network`, {
project,
environment,
env,
});
const databaseStack = new DatabaseStack(app, `${project}-${environment}-database`, {
project,
environment,
vpc: networkStack.vpc,
securityGroup: networkStack.dbSecurityGroup,
env,
});
// const computeStack = new ComputeStack(app, `${project}-${environment}-compute`, {
// project,
// environment,
// vpc: networkStack.vpc,
// albSecurityGroup: networkStack.albSecurityGroup,
// ecsSecurityGroup: networkStack.ecsSecurityGroup,
// database: databaseStack.instance,
// env,
// });4.4 CDK Nag 安全检查集成
CDK Nag 是 AWS CDK 的安全合规检查工具,可以在合成(synth)阶段自动检查安全问题:
// bin/app.ts 中添加 CDK Nag
import { Aspects } from "aws-cdk-lib";
import { AwsSolutionsChecks } from "cdk-nag";
// 在 app 级别添加安全检查
Aspects.of(app).add(new AwsSolutionsChecks({ verbose: true }));提示词模板:修复 CDK Nag 警告
CDK Nag 报告了以下安全警告:
[粘贴 CDK Nag 输出]
请分析每个警告并提供修复方案:
1. 哪些是必须修复的安全问题?
2. 哪些可以通过 NagSuppressions 安全地抑制?
3. 请提供修复代码5. IaC Prompt 模板库
5.1 通用 IaC Prompt 模板
以下是经过实战验证的 IaC Prompt 模板集合,适用于各种 AI 编码助手:
模板 1:基础设施架构生成
你是一位资深云架构师和 DevOps 工程师。请为以下需求设计并生成 [Terraform/Pulumi/CDK] 基础设施配置:
## 应用信息
- 应用类型:[Web 应用/API 服务/数据管线/ML 平台]
- 技术栈:[例如 Next.js + Node.js + PostgreSQL]
- 预期流量:[例如 1000 QPS 峰值]
- 数据量:[例如 100GB 初始,每月增长 10GB]
## 基础设施需求
[详细描述所需的基础设施组件]
## 非功能需求
- 可用性目标:[例如 99.9%]
- RPO/RTO:[例如 RPO 1小时, RTO 4小时]
- 合规要求:[例如 SOC 2, GDPR]
- 月度预算:[例如 $3000]
## 安全要求
- [列出具体安全要求]
## 输出要求
1. 模块化结构,每个模块职责单一
2. 支持多环境部署(dev/staging/production)
3. 包含安全最佳实践(加密、最小权限、网络隔离)
4. 包含监控和告警配置
5. 包含成本标签
6. 包含 README 文档模板 2:安全加固审查
请审查以下 [Terraform/Pulumi/CDK] 代码的安全性:
[粘贴 IaC 代码]
请检查以下方面并提供修复建议:
1. 网络安全:安全组规则是否过于宽松?
2. 数据加密:存储和传输是否加密?
3. 访问控制:IAM 权限是否遵循最小权限?
4. 密钥管理:是否有硬编码的密钥或密码?
5. 日志审计:是否启用必要的日志记录?
6. 备份恢复:是否配置了备份和恢复策略?
7. 合规性:是否符合 [SOC 2/GDPR/HIPAA] 要求?
对每个发现的问题,请提供:
- 风险等级(高/中/低)
- 问题描述
- 修复代码模板 3:现有基础设施优化
请分析以下 [Terraform/Pulumi/CDK] 配置并提供优化建议:
[粘贴 IaC 代码]
请从以下维度进行优化:
1. 成本优化:是否有过度配置的资源?推荐更经济的替代方案
2. 性能优化:是否有性能瓶颈?推荐优化措施
3. 可靠性:是否有单点故障?推荐高可用改进
4. 安全性:是否有安全漏洞?推荐加固措施
5. 可维护性:代码结构是否清晰?推荐重构方案
6. 可扩展性:是否支持未来扩展?推荐改进方案
对每个优化建议,请提供:
- 优先级(P0/P1/P2)
- 预期收益
- 实施难度
- 修改后的代码模板 4:多环境配置生成
请为以下基础设施生成多环境配置:
## 基础模块
[描述或粘贴基础 IaC 模块]
## 环境要求
### Development
- 最小化成本(单 AZ,最小实例)
- 可以使用 Spot 实例
- 无需高可用
- 数据可以不加密(非生产数据)
### Staging
- 模拟生产环境(但规模缩小)
- 多 AZ 部署
- 数据加密
- 自动关停(非工作时间)
### Production
- 完整高可用(多 AZ)
- 自动扩缩容
- 全面加密和安全加固
- 完整监控和告警
- 备份和灾备
请生成:
1. 共享的模块代码(参数化)
2. 每个环境的变量文件
3. 环境间的差异说明模板 5:故障排查辅助
Terraform apply 失败,错误信息如下:
[粘贴完整错误信息]
相关的 Terraform 配置:
[粘贴相关代码]
请分析:
1. 错误的根本原因是什么?
2. 是配置问题还是 AWS 服务限制?
3. 请提供具体的修复步骤
4. 如何防止此类错误再次发生?模板 6:IaC 迁移辅助
请帮我将以下 [CloudFormation/手动配置/Terraform] 迁移到 [Pulumi TypeScript/CDK TypeScript/Terraform]:
## 源配置
[粘贴源配置或描述现有基础设施]
## 迁移要求
1. 保持功能等价(不改变基础设施行为)
2. 改进安全配置(如果源配置有安全问题)
3. 添加缺失的最佳实践(标签、加密、日志)
4. 模块化重构
5. 生成迁移计划(步骤和风险评估)
## 约束
- 零停机迁移
- 保留现有资源(import 而非重建)5.2 特定场景 Prompt 模板
模板 7:Serverless 架构生成
请生成 [Terraform/Pulumi/CDK] 的 Serverless 架构配置:
## 架构
- API Gateway (REST/HTTP API)
- Lambda 函数([语言])
- DynamoDB 表
- S3 存储桶(文件上传)
- SQS 队列(异步处理)
- CloudWatch 日志和告警
## 要求
1. Lambda 使用 ARM64 架构(Graviton2,成本更低)
2. API Gateway 配置 WAF 和速率限制
3. DynamoDB 使用按需计费模式
4. 所有 Lambda 函数配置死信队列
5. 包含 X-Ray 追踪
6. 包含 CloudWatch 仪表板模板 8:数据库基础设施生成
请生成 [Terraform/Pulumi/CDK] 的数据库基础设施配置:
## 数据库需求
- 类型:[RDS PostgreSQL/Aurora/DynamoDB/ElastiCache Redis]
- 预期数据量:[大小]
- 读写比例:[例如 80% 读 20% 写]
- 延迟要求:[例如 P99 < 10ms]
## 高可用要求
- Multi-AZ:[是/否]
- 读副本:[数量]
- 自动故障转移:[是/否]
## 安全要求
- 加密存储:是
- 加密传输:是
- 密钥管理:[KMS/Secrets Manager]
- 网络隔离:私有子网 + 安全组
## 备份要求
- 自动备份保留期:[天数]
- 时间点恢复:[是/否]
- 跨区域备份:[是/否]模板 9:网络架构生成
请生成 [Terraform/Pulumi/CDK] 的企业级网络架构配置:
## 网络需求
- VPC 数量:[例如 3 个:production, staging, shared-services]
- VPC Peering / Transit Gateway:[选择]
- VPN / Direct Connect:[是否需要]
- 公网访问:[哪些服务需要]
## 安全需求
- 网络 ACL 规则
- 安全组策略
- VPC 流日志
- DNS 解析(Route 53 私有托管区)
## 合规需求
- 数据不出境:[是/否]
- PCI DSS 网络分段:[是/否]6. AI 辅助 IaC 审查
6.1 AI 审查工作流
┌─────────────────────────────────────────────────────────────┐
│ AI 辅助 IaC 审查工作流 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 开发者提交 PR │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 自动化审查管线 │ │
│ │ │ │
│ │ ① terraform fmt → 格式检查 │ │
│ │ ② terraform validate → 语法验证 │ │
│ │ ③ Checkov/tfsec → 安全扫描 │ │
│ │ ④ Infracost → 成本估算 │ │
│ │ ⑤ AI 代码审查 → 最佳实践检查 │ │
│ │ ⑥ terraform plan → 变更预览 │ │
│ └──────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ PR 评论汇总(安全发现 + 成本影响 + AI 建议) │
│ │ │
│ ▼ │
│ 人工审查 → 批准/请求修改 │
│ │
└─────────────────────────────────────────────────────────────┘6.2 使用 AI 进行 IaC 代码审查
提示词模板:IaC PR 审查
请审查以下 Terraform PR 变更:
## 变更摘要
[描述变更目的]
## 变更内容
```diff
[粘贴 git diff 输出]请从以下维度审查:
安全性
- 是否引入新的安全风险?
- 安全组/IAM 变更是否合理?
- 是否有密钥泄露风险?
成本影响
- 预估月度成本变化
- 是否有更经济的替代方案?
最佳实践
- 是否遵循模块化原则?
- 命名和标签是否规范?
- 是否有遗漏的配置?
风险评估
- 变更是否可能导致停机?
- 是否需要蓝绿部署?
- 回滚方案是什么?
请以 PR 评论格式输出审查结果。
---
## 7. IaC 安全扫描集成
### 7.1 安全扫描工具对比
| 工具 | 类型 | 支持的 IaC | 价格 | AI 增强 | 适用场景 |
|------|------|-----------|------|---------|---------|
| **Checkov** | 开源静态分析 | Terraform, CloudFormation, K8s, Pulumi, CDK | 开源免费;Prisma Cloud 集成需付费 | 否(规则驱动) | 全面的 IaC 安全扫描 |
| **tfsec** | 开源静态分析 | Terraform | 开源免费(已合并入 Trivy) | 否 | Terraform 专用安全扫描 |
| **Trivy** | 开源多功能扫描 | Terraform, CloudFormation, K8s, Docker | 开源免费 | 否 | 统一的安全扫描(IaC + 容器 + 依赖) |
| **Snyk IaC** | 商业安全平台 | Terraform, CloudFormation, K8s, ARM | 免费版可用;Team $25/月/开发者 | 是(AI 修复建议) | 开发者友好的安全扫描 |
| **Snyk MCP** | MCP 集成安全扫描 | 代码 + IaC + 依赖 | Snyk 订阅内含 | 是(AI 编码助手集成) | AI 编码助手内实时安全扫描 |
| **KICS** | 开源静态分析 | Terraform, CloudFormation, K8s, Ansible, Docker | 开源免费 | 否 | 多 IaC 框架支持 |
| **OPA/Conftest** | 策略即代码引擎 | 任意 JSON/YAML/HCL | 开源免费 | 否 | 自定义策略检查 |
### 7.2 操作步骤
#### 步骤 1:Checkov 集成
```bash
# 安装 Checkov
pip install checkov
# 扫描 Terraform 目录
checkov -d ./terraform/ --framework terraform
# 扫描并输出 SARIF 格式(用于 GitHub Security)
checkov -d ./terraform/ -o sarif > results.sarif
# 仅检查高严重性问题
checkov -d ./terraform/ --check HIGH --check CRITICAL
# 跳过特定检查(需要在代码中注释说明原因)
# 在 .tf 文件中添加:
# checkov:skip=CKV_AWS_18:S3 access logging not needed for this bucketGitHub Actions 集成:
# .github/workflows/iac-security.yml
name: IaC Security Scan
on:
pull_request:
paths:
- 'terraform/**'
- 'infrastructure/**'
jobs:
checkov:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Checkov
uses: bridgecrewio/checkov-action@v12
with:
directory: terraform/
framework: terraform
output_format: sarif
output_file_path: results.sarif
soft_fail: false # PR 失败如果发现高危问题
- name: Upload SARIF
if: always()
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif步骤 2:Snyk IaC + MCP 集成
Snyk 在 2025 年 8 月推出了”Secure At Inception”功能,通过 MCP 协议将安全扫描集成到 AI 编码助手中,实现代码生成时的实时安全检查:
# 安装 Snyk CLI
npm install -g snyk
# 认证
snyk auth
# 扫描 Terraform 代码
snyk iac test ./terraform/
# 扫描并生成 JSON 报告
snyk iac test ./terraform/ --json > snyk-results.json
# 监控(持续扫描)
snyk iac monitor ./terraform/Snyk MCP Server 配置(用于 AI 编码助手):
在 Claude Code 或 Cursor 中配置 Snyk MCP Server,实现 AI 生成 IaC 代码时自动进行安全扫描:
{
"mcpServers": {
"snyk": {
"command": "npx",
"args": ["-y", "@snyk/mcp-server"]
}
}
}配置后,AI 编码助手在生成 IaC 代码时可以自动调用 Snyk 进行安全检查,在代码生成阶段就捕获安全问题。
步骤 3:tfsec / Trivy 集成
# 安装 Trivy(包含原 tfsec 功能)
# macOS
brew install trivy
# 扫描 Terraform 配置
trivy config ./terraform/
# 仅显示高危和严重问题
trivy config ./terraform/ --severity HIGH,CRITICAL
# 输出 JSON 格式
trivy config ./terraform/ -f json -o trivy-results.json7.3 AI 辅助安全修复
当安全扫描发现问题时,使用 AI 辅助修复:
提示词模板:
安全扫描工具 [Checkov/Snyk/Trivy] 在我的 Terraform 代码中发现以下问题:
[粘贴扫描结果]
相关的 Terraform 代码:
[粘贴相关代码]
请为每个发现提供:
1. 风险说明(为什么这是安全问题)
2. 修复代码
3. 是否可以安全地抑制此检查(如果是,说明原因)
4. 预防措施(如何在 Steering 规则中避免此类问题)8. 成本估算集成
8.1 Infracost 概述
Infracost 是一个开源工具,可以在部署前估算 Terraform 基础设施的月度成本。它解析 Terraform plan 输出,查询云提供商定价 API,计算每个资源的预估成本。
8.2 工具推荐
| 工具 | 用途 | 价格 | 适用场景 |
|---|---|---|---|
| Infracost | Terraform 成本估算,CI/CD 集成 | 开源免费;Cloud $50/月起(团队功能) | PR 成本评审、部署前成本预估 |
| Spacelift | IaC 编排 + 成本管理 | 免费版可用;Cloud $0.30/运行 | 多团队 IaC 管理 + 成本控制 |
| env0 | IaC 管理 + 成本治理 | 免费版可用;Pro $25/用户/月 | 成本预算和策略管理 |
| CAST AI | K8s 成本优化 | 免费版可用;Pro 按节省金额计费 | Kubernetes 资源优化 |
| Kubecost | K8s 成本监控 | 开源免费;Enterprise 定制 | K8s 成本分配和优化 |
8.3 操作步骤
步骤 1:安装和配置 Infracost
# 安装 Infracost
# macOS
brew install infracost
# Linux
curl -fsSL https://raw.githubusercontent.com/infracost/infracost/master/scripts/install.sh | sh
# 注册并获取 API Key
infracost auth login
# 验证安装
infracost --version步骤 2:本地成本估算
# 生成 Terraform plan
cd terraform/
terraform init
terraform plan -out=tfplan.binary
terraform show -json tfplan.binary > tfplan.json
# 使用 Infracost 估算成本
infracost breakdown --path=tfplan.json
# 输出示例:
# Project: myapp-production
#
# Name Monthly Qty Unit Monthly Cost
#
# aws_instance.web
# ├─ Instance usage (Linux/UNIX, on-demand, m5.large)
# │ 730 hours $70.08
# ├─ root_block_device
# │ └─ Storage (general purpose SSD, gp3) 50 GB $4.00
# ...
#
# OVERALL TOTAL $1,234.56步骤 3:PR 成本评审集成
# .github/workflows/infracost.yml
name: Infracost
on:
pull_request:
paths:
- 'terraform/**'
jobs:
infracost:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
- name: Setup Infracost
uses: infracost/actions/setup@v3
with:
api-key: ${{ secrets.INFRACOST_API_KEY }}
- name: Generate Infracost diff
run: |
infracost diff \
--path=terraform/ \
--format=json \
--out-file=/tmp/infracost.json
- name: Post PR comment
uses: infracost/actions/comment@v1
with:
path: /tmp/infracost.json
behavior: update8.4 AI + Infracost 成本优化
提示词模板:
Infracost 估算我的基础设施月度成本为 $[金额],超出预算 $[预算]。
成本明细:
[粘贴 Infracost breakdown 输出]
请提供成本优化建议:
1. 哪些资源可以降级而不影响性能?
2. 是否可以使用 Reserved Instances 或 Savings Plans?
3. 是否有可以使用 Spot 实例的工作负载?
4. 是否有闲置或过度配置的资源?
5. 是否可以通过架构调整降低成本?
对每个建议,请提供:
- 预估节省金额
- 实施风险
- 修改后的 Terraform 代码9. IaC Steering 规则
9.1 为什么 IaC 需要专门的 Steering 规则
AI 生成的 IaC 代码面临独特的风险:
- 安全风险:过于宽松的安全组、缺少加密、过高的 IAM 权限
- 成本风险:过度配置的实例、未启用自动扩缩容、缺少成本标签
- 合规风险:不符合行业标准(SOC 2、GDPR、HIPAA)
- 运维风险:缺少监控、备份、日志配置
Steering 规则通过在 AI 生成代码之前设定约束,从源头预防这些问题。
9.2 IaC Steering 规则模板
Kiro Steering 文件(完整版)
---
inclusion: auto
globs: ["**/*.tf", "**/*.tfvars", "**/*.ts", "**/*.py", "**/cdk.json", "**/Pulumi.yaml"]
---
# IaC Steering 规则(完整版)
## 通用规则
- 所有 IaC 代码必须模块化,每个模块职责单一
- 所有资源必须包含标准标签:environment, team, cost-center, managed-by, project
- 变量必须包含 description 和 type,敏感变量标记为 sensitive
- 输出必须包含 description
- 使用远程状态存储,禁止本地状态文件
- Provider 和 module 版本必须锁定(使用 ~> 约束)
## 安全规则(最高优先级)
- 安全组入站规则禁止 0.0.0.0/0(ALB/NLB 的 80/443 除外)
- IAM 策略禁止 "Action": "*" 或 "Resource": "*"
- 所有存储(S3/EBS/RDS/DynamoDB)必须启用加密
- S3 存储桶必须阻止公共访问
- RDS 必须启用加密存储和自动备份(≥7 天)
- 密钥通过 Secrets Manager 或 SSM Parameter Store 管理,禁止硬编码
- 所有外部通信使用 TLS 1.2+
- 数据库部署在私有子网,禁止公网访问
- 启用 VPC 流日志和 CloudTrail
## 架构规则
- 生产环境必须多 AZ 部署
- 有状态服务(RDS/ElastiCache)必须配置自动故障转移
- 无状态服务必须配置自动扩缩容
- 使用 NAT Gateway 而非 NAT Instance
- 生产环境每个 AZ 一个 NAT Gateway
## 成本规则
- 所有资源必须包含 cost-center 标签
- 开发环境使用最小实例类型
- 开发环境配置自动关停(非工作时间)
- 优先使用按需计费模式(DynamoDB、Lambda)
- 生产环境评估 Reserved Instances / Savings Plans
## 命名规则
- 资源命名格式:{project}-{environment}-{resource-type}-{identifier}
- 变量使用 snake_case
- 模块使用 kebab-case
- 标签键使用 kebab-case
## Terraform 专用规则
- 使用 terraform-aws-modules 官方模块优先
- 使用 terraform fmt 格式化代码
- 使用 terraform validate 验证语法
- 使用 Checkov 或 tfsec 进行安全扫描
- 使用 Infracost 进行成本估算
## CDK 专用规则
- 使用 L2/L3 构造优先于 L1(CfnXxx)
- 集成 CDK Nag 进行安全检查
- 使用 Stack 分离不同关注点
- 使用 CDK Context 管理环境差异
## Pulumi 专用规则
- 使用 ComponentResource 封装可复用组件
- 使用 Pulumi Config 管理配置和密钥
- 使用 Pulumi ESC 管理多环境密钥
- 启用 Pulumi Policy Pack 进行合规检查CLAUDE.md IaC 规则片段
## IaC 生成规则
当生成基础设施代码时,必须遵循以下规则:
### 安全(不可协商)
1. 安全组禁止 0.0.0.0/0 入站(ALB 80/443 除外)
2. IAM 遵循最小权限,禁止 * 通配符
3. 所有存储加密(S3/EBS/RDS)
4. 密钥通过 Secrets Manager 管理,禁止硬编码
5. 数据库部署在私有子网
### 架构
1. 生产环境多 AZ 部署
2. 模块化结构(networking/compute/database/monitoring)
3. 支持多环境(dev/staging/production)
4. 配置自动扩缩容和健康检查
### 成本
1. 所有资源包含 cost-center 标签
2. 开发环境使用最小实例
3. 使用 Infracost 估算成本
### 质量
1. 变量和输出包含 description
2. 代码格式化(terraform fmt)
3. 安全扫描通过(Checkov/tfsec)
4. 包含 README 文档实战案例:AI 驱动的多云 IaC 管理
案例背景
一个 15 人的 SaaS 创业公司需要在 AWS 和 GCP 上部署服务:
- AWS:主要应用(ECS Fargate + RDS + ElastiCache)
- GCP:AI/ML 工作负载(GKE + Cloud SQL + Vertex AI)
- 共享:Terraform 远程状态、CI/CD 管线、监控
实施方案
阶段一:定义 Steering 规则和模块结构(第 1 天)
使用 AI 生成项目骨架:
请为以下多云项目生成 Terraform 项目结构:
## 项目结构要求
- 支持 AWS 和 GCP 双云
- 模块化设计(每个云的 networking/compute/database 分离)
- 共享模块(monitoring/alerting)
- 多环境支持(dev/staging/production)
- 远程状态存储(每个云独立状态文件)
## 输出
1. 目录结构
2. 每个模块的 README
3. Makefile(常用命令)
4. CI/CD 工作流(GitHub Actions)AI 生成的项目结构:
infrastructure/
├── modules/
│ ├── aws/
│ │ ├── networking/ # VPC, 子网, 安全组
│ │ ├── compute/ # ECS Fargate, ALB
│ │ ├── database/ # RDS, ElastiCache
│ │ └── storage/ # S3
│ ├── gcp/
│ │ ├── networking/ # VPC, 子网, 防火墙
│ │ ├── compute/ # GKE
│ │ ├── database/ # Cloud SQL
│ │ └── ai/ # Vertex AI
│ └── shared/
│ ├── monitoring/ # CloudWatch + Cloud Monitoring
│ └── alerting/ # SNS + PagerDuty
├── environments/
│ ├── dev/
│ │ ├── aws/ # AWS dev 配置
│ │ └── gcp/ # GCP dev 配置
│ ├── staging/
│ └── production/
├── .github/workflows/
│ └── terraform.yml # CI/CD 管线
├── .kiro/steering/
│ └── terraform.md # IaC Steering 规则
├── Makefile
└── README.md阶段二:AI 生成基础设施代码(第 2-3 天)
使用 Claude Code / Kiro 按模块逐步生成 Terraform 代码:
- 先生成 AWS networking 模块 → 人工审查 → 安全扫描
- 再生成 AWS compute 模块 → 人工审查 → 安全扫描
- 依次完成所有模块
- 生成根模块组合所有子模块
- 生成环境变量文件
阶段三:安全扫描和成本估算(第 4 天)
# 安全扫描
checkov -d ./infrastructure/ --framework terraform
# 成本估算
cd infrastructure/environments/production/aws/
terraform init && terraform plan -out=tfplan.binary
terraform show -json tfplan.binary > tfplan.json
infracost breakdown --path=tfplan.json阶段四:CI/CD 集成(第 5 天)
AI 生成的 GitHub Actions 工作流自动执行:
- PR 触发:
terraform fmt→terraform validate→ Checkov → Infracost →terraform plan - main 合并:
terraform apply(staging) - release tag:
terraform apply(production,需手动审批)
案例分析
关键决策点:
-
Steering 规则先行:在生成任何 IaC 代码之前,先定义完善的 Steering 规则。这确保了 AI 生成的代码从一开始就符合安全和架构标准。
-
模块化 + 逐步生成:不要一次性让 AI 生成所有代码。按模块逐步生成,每个模块完成后进行审查和扫描,确保质量。
-
多层安全防线:Steering 规则(预防)→ 安全扫描(检测)→ 人工审查(验证)→ CI/CD 门禁(阻止),形成完整的安全防线。
-
成本可见性:通过 Infracost 在 PR 阶段就展示成本影响,避免意外的高额账单。
成果:
| 指标 | 传统方式 | AI 辅助方式 | 改善 |
|---|---|---|---|
| 基础设施搭建时间 | 3 周 | 5 天 | -76% |
| 安全扫描通过率(首次) | 60% | 90% | +50% |
| 代码审查时间 | 4 小时/PR | 1 小时/PR | -75% |
| 月度云成本(vs 预算) | 超预算 20% | 低于预算 10% | -30% |
| IaC 代码覆盖率 | 70% | 95% | +36% |
避坑指南
❌ 常见错误
-
AI 生成的安全组过于宽松
- 问题:AI 为了”让代码能跑起来”,经常生成
0.0.0.0/0入站规则或过宽的端口范围,这在生产环境中是严重的安全隐患 - 正确做法:在 Steering 规则中明确禁止宽松安全组,使用 Checkov/tfsec 自动扫描,所有安全组变更必须人工审查
- 问题:AI 为了”让代码能跑起来”,经常生成
-
忽略 Terraform 状态管理
- 问题:AI 生成的代码通常不包含远程状态存储配置,使用本地状态文件会导致团队协作困难和状态丢失风险
- 正确做法:在项目初始化时就配置远程状态存储(S3 + DynamoDB),在 Steering 规则中要求所有项目使用远程状态
-
AI 生成的 IAM 权限过大
- 问题:AI 倾向于使用
"Action": "*"或"Resource": "*"来避免权限不足的错误,这违反最小权限原则 - 正确做法:在 Steering 规则中禁止通配符权限,使用 IAM Access Analyzer 验证权限范围,逐步收紧权限
- 问题:AI 倾向于使用
-
缺少成本标签导致账单不可追踪
- 问题:AI 生成的资源经常缺少成本标签,导致无法按项目/团队/环境追踪云成本
- 正确做法:在 Steering 规则中要求所有资源包含标准标签,使用 AWS Config 规则或 OPA 策略强制标签合规
-
直接在生产环境应用 AI 生成的配置
- 问题:AI 生成的配置可能包含错误的默认值、不适合生产环境的配置,或遗漏关键的高可用设置
- 正确做法:遵循”AI 生成 → 安全扫描 → 成本估算 → 人工审查 → staging 验证 → production 部署”的完整流程
-
不锁定 Provider 和 Module 版本
- 问题:AI 生成的代码可能不包含版本约束,导致不同时间的
terraform init拉取不同版本,产生不可预测的行为 - 正确做法:在
versions.tf中锁定所有 provider 和 module 版本,使用~>约束允许补丁更新
- 问题:AI 生成的代码可能不包含版本约束,导致不同时间的
-
忽略 IaC 代码的测试
- 问题:很多团队不测试 IaC 代码,导致配置错误在部署时才被发现
- 正确做法:使用
terraform validate验证语法,使用 Checkov/tfsec 扫描安全,使用terraform plan预览变更,考虑使用 Terratest 进行集成测试
-
AI 生成的代码缺少文档
- 问题:AI 生成的 Terraform 模块缺少 README、变量说明和使用示例,导致其他团队成员难以理解和使用
- 正确做法:在 Steering 规则中要求每个模块包含 README.md,变量和输出包含 description,关键配置包含注释
✅ 最佳实践
- Steering 规则先行:在使用 AI 生成 IaC 代码之前,先定义完善的 Steering 规则,包括安全基线、命名规范、标签策略、架构标准
- 模块化生成:按模块逐步生成 IaC 代码,每个模块完成后进行审查和扫描,而非一次性生成所有代码
- 多层安全防线:Steering 规则(预防)→ 安全扫描(检测)→ 人工审查(验证)→ CI/CD 门禁(阻止)
- 成本可见性:在 PR 阶段使用 Infracost 展示成本影响,设定成本预算告警
- 版本锁定:锁定所有 provider 和 module 版本,使用
.terraform.lock.hcl确保一致性 - 远程状态管理:从项目第一天就使用远程状态存储,配置状态锁定
- 环境差异化:使用变量文件管理环境差异,避免为每个环境维护独立的代码
- 持续扫描:在 CI/CD 管线中集成安全扫描和成本估算,每次 PR 自动执行
- 文档自动化:使用
terraform-docs自动生成模块文档,保持文档与代码同步 - 漂移检测:定期运行
terraform plan检测配置漂移,使用 Spacelift 或 env0 自动化漂移检测
相关资源与延伸阅读
以下资源可帮助你深入了解 AI 辅助 IaC 生成的各个方面:
- Spacelift Intent 官方文档 — 自然语言驱动基础设施配置的完整指南,包含架构说明和使用教程:spacelift.io/intent
- Pulumi AI — 对话式 AI 生成多语言 IaC 代码的在线工具:pulumi.com/ai
- Pulumi Agent Skills — AI 编码助手的 Pulumi 最佳实践指南,适用于 Claude Code、Cursor 等工具:github.com/pulumi/pulumi-agent-skills
- Amazon Q Developer Console-to-Code — 将 AWS 控制台操作转换为 IaC 代码的官方指南:aws.amazon.com/blogs/devops/console-to-code
- Infracost 官方文档 — Terraform 成本估算工具的完整使用指南:infracost.io/docs
- Checkov 官方文档 — 开源 IaC 安全扫描工具的规则库和集成指南:checkov.io/docs
- Snyk Secure At Inception — 通过 MCP 协议将安全扫描集成到 AI 编码助手的方案:snyk.io/news/secure-at-inception
- Terraform Best Practices — HashiCorp 官方的 Terraform 最佳实践指南:developer.hashicorp.com/terraform/guides
- AWS CDK Best Practices — AWS 官方的 CDK 最佳实践和设计模式:docs.aws.amazon.com/cdk
- Spacelift Terraform 扫描工具对比 — 2026 年 Terraform 安全扫描工具的全面对比:spacelift.io/blog/terraform-scanning-tools
参考来源
- Spacelift Unveils Codeless Natural Language Infrastructure Provisioning (2025 年 10 月)
- Pulumi AI: The Fastest Way to Discover, Learn, and Build IaC (2025 年)
- Pulumi Agent Skills: Best Practices for AI Coding Assistants (2025 年)
- A Recipe for a Better AI-based Code Generator - Pulumi (2026 年 1 月)
- Amazon Q Developer Console-to-Code Guide (2025 年 9 月)
- Snyk Unveils Secure At Inception for AI Coding Assistants (2025 年 8 月)
- Infrastructure Automation with AI: Using LLMs to Generate IaC Scripts (2025 年)
- How Automation Evolved to Power AI Workloads - DZone (2025 年 12 月)
- Top 7 Terraform Scanning Tools in 2026 - Spacelift (2026 年 1 月)
- The Future of Infrastructure-as-Code - Spacelift at KubeCon (2025 年 12 月)
- AI-Driven IaC and Cloud Automation Course - Udemy (2025 年)
- Snyk Evo: Agentic AI Security Integration (2025 年 10 月)
📖 返回 总览与导航 | 上一节:32a-AI辅助DevOps概览 | 下一节:32c-AI辅助CI-CD配置