1. 环境准备与工具安装
在开始使用Terraform自动化部署AWS基础设施之前,我们需要确保开发环境准备就绪。Ubuntu 22.04作为当前LTS版本,提供了稳定的基础环境,特别适合作为Terraform的工作站。
1.1 系统要求与基础配置
对于生产级Terraform项目,建议使用以下配置的Ubuntu服务器:
- CPU:至少4核(Intel Xeon或AMD EPYC系列更佳)
- 内存:8GB起步,大型项目建议16GB以上
- 存储:100GB SSD,用于存储Terraform状态文件和临时数据
- 网络:稳定的互联网连接,AWS API调用平均延迟<200ms
首先更新系统并安装基础工具包:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y unzip git curl jq python3-pip
注意:在生产环境中,建议使用专用服务账户而非root用户执行Terraform操作,可通过
sudo adduser terraform-user创建专用账户。
1.2 Terraform安装与验证
Terraform的安装有多种方式,这里推荐使用官方二进制包:
bash复制# 下载最新稳定版(当前为1.6.0)
TERRAFORM_VERSION="1.6.0"
curl -LO https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip
# 验证SHA256校验和(重要安全步骤)
curl -LO https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_SHA256SUMS
sha256sum --check --ignore-missing terraform_${TERRAFORM_VERSION}_SHA256SUMS
# 安装到系统路径
unzip terraform_${TERRAFORM_VERSION}_linux_amd64.zip
sudo mv terraform /usr/local/bin/
sudo chmod +x /usr/local/bin/terraform
验证安装成功:
bash复制terraform version
# 应输出类似:Terraform v1.6.0
1.3 AWS CLI配置
Terraform需要通过AWS API进行操作,因此需要配置访问凭证:
bash复制sudo apt install -y awscli
aws configure
按提示输入:
- AWS Access Key ID:具有足够权限的IAM用户密钥
- AWS Secret Access Key:对应的密钥
- Default region name:如
us-east-1 - Default output format:建议
json
验证凭证有效性:
bash复制aws sts get-caller-identity
安全提示:生产环境中建议使用IAM角色而非长期凭证,可通过
aws configure set aws_access_key_id ""清除明文凭证。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Terraform项目结构与设计
2.1 标准项目布局
一个规范的Terraform项目通常包含以下结构:
code复制aws-infra/
├── modules/ # 可复用模块
│ ├── vpc/
│ ├── ec2/
│ └── rds/
├── environments/ # 多环境配置
│ ├── dev/
│ ├── staging/
│ └── prod/
├── main.tf # 主配置文件
├── variables.tf # 输入变量定义
├── outputs.tf # 输出变量定义
├── provider.tf # 提供商配置
└── terraform.tfvars # 变量赋值文件
2.2 核心配置文件解析
provider.tf - 定义云服务提供商及版本约束:
hcl复制terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0" # 锁定主版本,允许小版本更新
}
}
required_version = ">= 1.5.0" # Terraform最低版本要求
}
provider "aws" {
region = var.aws_region
# 可选:假设角色配置
assume_role {
role_arn = "arn:aws:iam::ACCOUNT_ID:role/TerraformRole"
session_name = "terraform-session"
}
}
variables.tf - 定义可配置参数:
hcl复制variable "aws_region" {
description = "AWS区域代码"
type = string
default = "us-east-1"
validation {
condition = contains(["us-east-1", "us-west-2", "eu-central-1"], var.aws_region)
error_message = "仅支持特定AWS区域"
}
}
variable "environment" {
description = "部署环境标识"
type = string
default = "dev"
}
variable "ssh_key_name" {
description = "EC2实例SSH密钥对名称"
type = string
sensitive = true # 标记为敏感变量
}
3. 基础设施代码实现
3.1 VPC网络架构
vpc.tf - 定义核心网络资源:
hcl复制resource "aws_vpc" "main" {
cidr_block = var.vpc_cidr
enable_dns_support = true
enable_dns_hostnames = true
tags = {
Name = "${var.environment}-vpc"
Environment = var.environment
}
}
# 公有子网(带自动分配公网IP)
resource "aws_subnet" "public" {
count = length(var.public_subnet_cidrs)
vpc_id = aws_vpc.main.id
cidr_block = var.public_subnet_cidrs[count.index]
availability_zone = data.aws_availability_zones.available.names[count.index]
map_public_ip_on_launch = true
tags = {
Name = "${var.environment}-public-${count.index}"
Tier = "public"
}
}
# 私有子网(仅内网访问)
resource "aws_subnet" "private" {
count = length(var.private_subnet_cidrs)
vpc_id = aws_vpc.main.id
cidr_block = var.private_subnet_cidrs[count.index]
availability_zone = data.aws_availability_zones.available.names[count.index]
tags = {
Name = "${var.environment}-private-${count.index}"
Tier = "private"
}
}
3.2 EC2实例部署
ec2.tf - 定义计算资源:
hcl复制data "aws_ami" "ubuntu" {
most_recent = true
owners = ["099720109477"] # Canonical官方账号
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
}
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = var.instance_type
subnet_id = aws_subnet.public[0].id
vpc_security_group_ids = [aws_security_group.web_sg.id]
key_name = var.ssh_key_name
iam_instance_profile = aws_iam_instance_profile.ec2_profile.name
root_block_device {
volume_size = 30 # GB
volume_type = "gp3"
}
tags = {
Name = "${var.environment}-web-server"
}
lifecycle {
ignore_changes = [ami] # 防止AMI更新导致重建
}
}
4. 高级配置与最佳实践
4.1 状态文件远程存储
本地状态文件不适合团队协作,建议使用S3后端:
hcl复制terraform {
backend "s3" {
bucket = "terraform-state-prod-123456"
key = "global/s3/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "terraform-locks"
encrypt = true
}
}
4.2 安全防护措施
敏感数据管理:
- 使用AWS Secrets Manager存储数据库密码
- 在variables.tf中标记
sensitive = true - 通过
external数据源动态获取凭证
网络隔离策略:
hcl复制resource "aws_security_group" "db_sg" {
name_prefix = "db-sg-"
vpc_id = aws_vpc.main.id
ingress {
from_port = 5432
to_port = 5432
protocol = "tcp"
security_groups = [aws_security_group.web_sg.id]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
5. 部署流程与运维
5.1 标准工作流
- 初始化:
bash复制terraform init -upgrade
- 格式化验证:
bash复制terraform fmt -check
terraform validate
- 计划阶段:
bash复制terraform plan -out=tfplan -var-file=prod.tfvars
- 应用变更:
bash复制terraform apply tfplan
5.2 变更管理与协作
-
使用Git进行版本控制,
.gitignore添加:code复制*.tfstate *.tfstate.backup .terraform/ *.tfvars -
通过Pull Request流程审核变更
-
使用
terraform workspace隔离不同环境 -
集成CI/CD工具(如GitHub Actions)实现自动化部署
6. 成本优化与监控
6.1 资源成本分析
通过AWS Cost Explorer API集成:
hcl复制data "aws_ce_cost_forecast" "monthly" {
time_period {
start = formatdate("YYYY-MM-01", timestamp())
end = formatdate("YYYY-MM-01", timeadd(timestamp(), "720h"))
}
metric = "UNBLENDED_COST"
granularity = "MONTHLY"
}
6.2 监控与告警
集成CloudWatch监控:
hcl复制resource "aws_cloudwatch_metric_alarm" "high_cpu" {
alarm_name = "web-server-high-cpu"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = "2"
metric_name = "CPUUtilization"
namespace = "AWS/EC2"
period = "120"
statistic = "Average"
threshold = "80"
alarm_description = "监控EC2实例CPU使用率"
alarm_actions = [aws_sns_topic.alerts.arn]
dimensions = {
InstanceId = aws_instance.web.id
}
}
7. 故障排查与调试
7.1 常见问题处理
问题1:权限不足错误
- 症状:
Error: configuring Terraform AWS Provider: error validating provider credentials - 解决方案:
- 验证AWS凭证有效期:
aws sts get-caller-identity - 检查IAM策略是否包含必要权限
- 如使用角色,确保信任关系配置正确
- 验证AWS凭证有效期:
问题2:状态文件冲突
- 症状:
Error acquiring state lock - 解决方案:
bash复制terraform force-unlock LOCK_ID # 或手动删除DynamoDB锁条目
7.2 调试技巧
- 详细日志输出:
bash复制TF_LOG=DEBUG terraform apply
- 图形化依赖分析:
bash复制terraform graph | dot -Tsvg > graph.svg
- 针对性输出调试:
hcl复制output "instance_private_ip" {
value = aws_instance.web.private_ip
sensitive = true
}
8. 扩展与优化
8.1 模块化设计
创建可复用模块(如modules/ec2-cluster):
hcl复制variable "instance_count" {
type = number
default = 2
}
resource "aws_instance" "cluster" {
count = var.instance_count
ami = var.ami_id
instance_type = var.instance_type
tags = {
Name = "${var.prefix}-node-${count.index}"
}
}
8.2 策略即代码
集成AWS IAM策略生成器:
hcl复制data "aws_iam_policy_document" "ec2_readonly" {
statement {
actions = [
"ec2:Describe*",
"ec2:Get*"
]
resources = ["*"]
}
}
通过系统化的Terraform实践,我们实现了AWS基础设施的代码化管理。在实际项目中,建议从简单架构开始,逐步扩展复杂度。定期执行terraform plan检查配置漂移,结合Git版本控制实现完整的变更追溯能力。
