Terraform AWS 是一个面向 AWS 基础设施即代码(IaC)的技能,提供使用 Terraform 管理 AWS 资源时的模式与最佳实践。当用户询问 Terraform 模块结构、命名约定、状态管理、IAM 与安全、CI/CD 流水线等内容时适用。
【用途与内容组织】 技能以快速参考表加参考文件的方式组织。主要参考文件包括:terraform-structure.md(模块结构、命名约定、状态管理、状态后端引导)、security-iam.md(IAM 与安全、Checkov 检查、Terraform 状态中的密钥、CI/CD OIDC 联合)、cicd-patterns.md(CI/CD 流水线与多环境流水线、流水线安全)。技能强调按需加载:只加载与用户问题匹配的参考文件,不要一次性加载全部三个。
【主要能力】
- 模块结构与命名:避免用模块包装单一资源;模块嵌套不超过 2 层;使用一致的 name_prefix locals 模式。
- 状态管理:S3 原生锁定(Terraform 1.10+),DynamoDB 锁定已弃用;状态后端引导使用独立的 bootstrap 项目,采用本地状态、SSE-KMS 与 CI/CD 访问策略。
- IAM 与安全:多租户使用 LeadingKeys;策略组合;防范 confused deputy;KMS 密钥策略;使用临时资源(ephemeral resource,Terraform 1.10+)处理密钥,避免写入状态;用 SSE-KMS S3 后端保护状态。
- Checkov 检查覆盖 DynamoDB、Lambda、API Gateway,涉及 CKV_AWS_28/119、CKV_AWS_258、CKV_AWS_76/CKV2_AWS_29 等。
- CI/CD:使用 OIDC 联合(aws_iam_openid_connect_provider + sts:AssumeRoleWithWebIdentity),不存储静态密钥;多环境流水线采用按分支的后端 key、环境解析器与临时环境清理;流水线安全包括按环境并发、环境保护门与漂移检测。
【文件加载策略】 模块结构、命名、状态、后端桶问题加载 terraform-structure.md(184 行);IAM 策略、最小权限、角色设计、SCP、Checkov 检查、KMS、状态中的密钥、OIDC 问题加载 security-iam.md(327 行);CI/CD、GitHub Actions、OIDC、流水线、临时环境、漂移问题加载 cicd-patterns.md(642 行)。基础设施评审时加载 terraform-structure.md 与 security-iam.md(共 511 行),仅当评审范围包含流水线配置时才加入 cicd-patterns.md。
【关键反模式】 模块设计:不用模块包装单一 AWS 资源,应封装逻辑分组(如 Lambda + Role + Log Group);模块嵌套不超过 2 层。 IAM 与安全:IAM 策略不用 Resource: "";不给 Lambda 执行角色附加 AdministratorAccess;当 principal 为服务时,aws_lambda_permission 不能省略 source_arn;Lambda 执行角色日志权限不应对 * 授权,应预先创建 aws_cloudwatch_log_group 并限定到该日志组 ARN;Lambda SQS 消费者不使用 sqs: on *,只需 sqs:ReceiveMessage、sqs:DeleteMessage、sqs:GetQueueAttributes 并限定到具体队列 ARN;DynamoDB 不能只设 server_side_encryption { enabled = true },缺少 kms_key_arn 会使用 AWS 托管密钥并触发 Checkov CKV_AWS_119;生产环境不应依赖默认 KMS 密钥策略;aws_lambda_function_url 不应设置 authorization_type = "NONE";Terraform ≥ 1.10 不使用 data "aws_secretsmanager_secret_version",改用 ephemeral。 CI/CD:不将 AWS 凭据存为 GitHub/CI 密钥,改用 OIDC 联合;不在推送到 main 时直接运行 terraform apply,应在 PR 中先审查 plan;apply/destroy 任务不使用 cancel-in-progress: true;不跳过带 Branch 标签的 default_tags;动态环境名优先使用对象格式 environment: { name: ${{ needs.x.outputs.y }} };不依赖动态 environment: name: 而不在仓库设置中预先创建环境。
【决策框架】 创建模块的时机:3 个及以上资源总是同时部署、跨 2 个及以上环境或仓库复用、封装非显而易见的接线(IAM + 资源)时创建模块;单一无依赖资源、一次性资源、标准配置的简单资源则直接使用资源。 版本矩阵:S3 原生状态锁定与临时资源均需 Terraform Core 1.10+,对 AWS Provider 版本无特定要求。
【成本分析】 当用户询问成本影响、定价或成本优化时,建议安装 AWS Pricing MCP Server,它可通过 analyze_terraform_project 扫描 Terraform 项目并自动生成成本明细。前置条件:uv 包管理器、Python 3.10+、具备 pricing:* 权限的 AWS 凭据。配置示例(macOS/Linux)为在 mcpServers 下添加 awslabs.aws-pricing-mcp-server,command 为 uvx,args 为 ["awslabs.aws-pricing-mcp-server@latest"],并设置 FASTMCP_LOG_LEVEL、AWS_PROFILE、AWS_REGION 环境变量;Windows 使用 --from 与 awslabs.aws-pricing-mcp-server.exe。配置文件位置为 Claude Desktop 的 ~/.claude/claude_desktop_config.json 或 Claude Code 的 .claude/mcp.json。