3. 开发环境准备:安装 Terraform、配置云服务商 CLI、初始化 Git 仓库

本章将搭建事故响应值班机器人项目所需的本地开发环境。环境准备是 IaC 实践的第一步,直接影响后续代码编写、调试与团队协作的效率。完成本章操作后,你将拥有一个可运行 Terraform 命令、能通过 CLI 与云服务商通信、并受 Git 版本控制的标准化工作台。

3.1 安装 Terraform

Terraform 以单一二进制文件分发,安装过程简洁。请根据操作系统选择对应方式:

操作系统 安装方式 验证命令
macOS brew install hashicorp/tap/terraform terraform version
Ubuntu/Debian 添加 HashiCorp 官方 APT 源后 sudo apt install terraform terraform version
Windows Chocolatey: choco install terraform 或手动下载 exe terraform version
通用(Linux/macOS) 从 releases.hashicorp.com 下载 zip 并解压至 /usr/local/bin terraform version
版本建议:本课程基于 Terraform v1.6+ 编写。安装后请执行 terraform version 确认版本不低于 1.6.0。若使用旧版本,部分特性(如 import 块、terraform test)可能不可用。

3.2 配置云服务商 CLI

值班机器人将部署在云上,Terraform 通过云服务商的 API 管理资源。因此需要先安装并认证对应的 CLI 工具。本课程以 AWS 为主要目标平台,同时提供 Azure 和 GCP 的配置要点。

3.2.1 AWS CLI 安装与认证

# 安装 AWS CLI v2(macOS/Linux)
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

# 验证安装
aws --version

# 配置访问密钥(推荐使用 IAM 用户)
aws configure
# 依次输入:AWS Access Key ID, AWS Secret Access Key, 默认区域(如 us-east-1), 输出格式(json)
安全提醒:永远不要将 Access Key 提交到 Git 仓库。AWS CLI 将凭证存储在 ~/.aws/credentials 文件中,该文件应被 .gitignore 排除。生产环境建议使用 IAM 角色或 AWS SSO。

3.2.2 Azure CLI 与 GCP CLI 快速参考

云平台 CLI 安装命令 认证命令 验证命令
Azure brew install azure-cli 或官方脚本 az login az account show
GCP brew install google-cloud-sdk 或官方包 gcloud auth application-default login gcloud config list
多平台策略:本课程后续章节将以 AWS 为例编写 Terraform 配置。如果你使用 Azure 或 GCP,只需替换 provider 块和资源类型,整体架构与流程完全一致。

3.3 初始化 Git 仓库

Git 是 IaC 的版本控制基石。良好的仓库结构能提升团队协作效率,并支持后续的 CI/CD 集成。

3.3.1 创建项目目录与初始化

# 创建项目根目录
mkdir incident-response-bot
cd incident-response-bot

# 初始化 Git 仓库
git init

# 创建标准目录结构
mkdir -p modules/alerting modules/notification modules/compute
mkdir -p environments/dev environments/staging environments/prod
mkdir -p scripts docs

# 创建 .gitignore 文件(防止敏感文件泄露)
cat > .gitignore << EOF
# Terraform
*.tfstate
*.tfstate.*
.terraform/
crash.log
override.tf
override.tf.json
*_override.tf
*_override.tf.json

# CLI 凭证
.aws/
.azure/
.gcp/

# IDE
.vscode/
.idea/
*.swp
EOF

# 首次提交
git add .
git commit -m "chore: initialize project structure for incident response bot"

3.3.2 推荐的项目目录结构

incident-response-bot/
├── modules/                  # 可复用模块
│   ├── alerting/             # 告警源模块(PagerDuty, Slack)
│   ├── notification/         # 通知渠道模块
│   └── compute/              # 计算资源模块(Lambda, ECS)
├── environments/             # 环境配置
│   ├── dev/                  # 开发环境
│   ├── staging/              # 预发布环境
│   └── prod/                 # 生产环境
├── scripts/                  # 辅助脚本
├── docs/                     # 文档
├── .gitignore
└── README.md
结构说明:modules/ 存放可复用的 Terraform 模块,environments/ 存放各环境的根配置。这种分离方式使得不同环境可以引用同一模块但使用不同的变量值,避免配置重复。

3.4 环境准备全景流程

下图展示了从本地机器到云服务商 API 的完整工具链与认证路径:

开发环境准备全景流程 本地开发机 Terraform 二进制 Git 仓库 版本控制 / 协作 云服务商 CLI AWS CLI / Azure CLI / gcloud 本地凭证 ~/.aws/credentials 云服务商 API AWS / Azure / GCP 调用 读取 认证请求 代码源 关键说明 1. Terraform 通过云 CLI 的 SDK 与云 API 通信,不直接处理凭证。 2. 凭证文件由云 CLI 管理,Terraform 自动继承其认证上下文。 3. Git 仓库管理 Terraform 代码,但不存储任何凭证或 .tfstate 文件。

3.5 环境验证清单

完成上述步骤后,请逐项验证环境是否就绪:

  1. Terraform 可用性:执行 terraform version,确认输出包含版本号及 provider 信息。
  2. 云 CLI 认证:执行 aws sts get-caller-identity(AWS)、az account show(Azure)或 gcloud auth list(GCP),确认返回有效的身份信息。
  3. Git 仓库状态:执行 git status,确认工作区干净,且 .gitignore 已正确排除敏感文件。
  4. 目录结构完整性:确认 modules/、environments/、scripts/、docs/ 目录已创建。
快速验证脚本:你可以将以下命令保存为 scripts/verify-env.sh,每次切换环境时一键检查:
#!/bin/bash
echo "=== Terraform Version ==="
terraform version
echo ""
echo "=== AWS Identity ==="
aws sts get-caller-identity
echo ""
echo "=== Git Status ==="
git status
执行 chmod +x scripts/verify-env.sh 后即可运行。

3.6 常见问题与排错

问题现象 可能原因 解决方案
terraform version 提示命令未找到 Terraform 未加入 PATH 将 terraform 二进制所在目录添加到 ~/.bashrc 或 ~/.zshrc 的 PATH 中
aws sts get-caller-identity 返回访问被拒绝 Access Key 无效或 IAM 用户权限不足 检查 ~/.aws/credentials 中的密钥,或重新执行 aws configure
git init 后 .gitignore 未生效 文件已跟踪后才添加 .gitignore 执行 git rm --cached <file> 取消跟踪,再重新提交
Terraform 初始化时提示 provider 下载失败 网络代理或防火墙限制 配置 HTTP_PROXY 环境变量,或使用 terraform providers mirror 离线缓存