如何在Ubuntu 22.04上使用Terraform自动化部署AWS基础设施,简化云端资源管理?
本文面向中高级运维工程师与云架构师,详细介绍在Ubuntu 22.04环境下使用**Terraform 1.5+**自动化部署AWS基础设施的全流程。内容涵盖环境准备、工具安装、最佳实践、代码示例、变量管理、State 管理,以及一套完整的示例架构(VPC、子网、EC2、RDS)。A5数据强调技术细节、产品参数和可执行代码,帮助你将云资源管理从手工操作彻底自动化。
一、背景与目标
随着云基础设施规模扩大,手工管理AWS资源不仅耗时,还容易产生配置不一致、资源泄漏等问题。Terraform作为业界主流的声明式基础设施即代码(IaC)工具,能将资源定义为代码,通过版本控制实现可审计、可复现的部署流程。本文以Ubuntu 22.04为开发主机,结合AWS实际生产环境,构建可自动化部署的Terraform工程流程。
二、目标架构与资源规格
本文最终将部署如下基础设施:
| 资源类别 | AWS 服务 | 典型配置 | 说明 |
|---|---|---|---|
| 网络 | VPC | CIDR: 10.0.0.0/16 | 内网隔离 |
| 子网 | 公有与私有子网 | 10.0.1.0/24,10.0.2.0/24 | 分布于两个可用区 |
| 网关 | Internet Gateway | - | 公网访问 |
| 路由表 | Public Route Table | 0.0.0.0/0 -> IGW | 公网路由 |
| 计算 | EC2 t3.micro | 1 vCPU,1GB RAM | 测试服务 |
| 数据库 | RDS PostgreSQL | db.t3.micro,20GB | 私有子网部署 |
| SSH 管理 | Key Pair | RSA 4096 | SSH 访问 |
三、环境准备
3.1 Ubuntu 22.04香港服务器www.a5idc.com主机配置建议
用于执行Terraform的Ubuntu工作站或服务器应满足:
- CPU: 4核以上(Intel/AMD)
- 内存: 8GB RAM
- 磁盘: 100GB SSD
- 网络: 稳定公网访问
安装基础工具:
sudo apt update && sudo apt install -y unzip git curl
3.2 安装 Terraform
Terraform 官方最新稳定版(本文以1.6.0示例):
# 下载
curl -LO https://releases.hashicorp.com/terraform/1.6.0/terraform_1.6.0_linux_amd64.zip
# 解压
unzip terraform_1.6.0_linux_amd64.zip
# 移动到PATH
sudo mv terraform /usr/local/bin/
验证版本:
terraform version
输出示例:
Terraform v1.6.0
3.3 配置 AWS CLI
如果尚未安装 AWS CLI:
sudo apt install -y awscli
配置凭证:
aws configure
输入:
AWS Access Key ID: <your_access_key>
AWS Secret Access Key: <your_secret_key>
Default region name: us-east-1
Default output format: json
确保凭证有足够权限(至少包含 VPC、EC2、RDS、IAM 权限)。
四、Terraform 项目结构
建议将Terraform项目组织如下:
aws-terraform/
├── main.tf
├── variables.tf
├── outputs.tf
├── provider.tf
├── vpc.tf
├── ec2.tf
├── rds.tf
├── terraform.tfvars
五、编写 Terraform 配置
5.1 Provider 配置(provider.tf)
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
required_version = ">= 1.5.0"
}
provider "aws" {
region = var.aws_region
}
5.2 变量定义(variables.tf)
variable "aws_region" {
description = "AWS 区域"
type = string
default = "us-east-1"
}
variable "vpc_cidr" {
description = "VPC CIDR 块"
type = string
default = "10.0.0.0/16"
}
# SSH Key
variable "ssh_key_name" {
description = "EC2 使用的 SSH key"
type = string
default = "terraform-aws"
}
5.3 主网络资源(vpc.tf)
resource "aws_vpc" "main" {
cidr_block = var.vpc_cidr
tags = {
Name = "main-vpc"
}
}
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
map_public_ip_on_launch = true
availability_zone = "us-east-1a"
}
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.main.id
}
5.4 计算资源(ec2.tf)
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
subnet_id = aws_subnet.public.id
key_name = var.ssh_key_name
tags = {
Name = "terraform-web"
}
}
data "aws_ami" "ubuntu" {
most_recent = true
owners = ["099720109477"]
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]
}
}
5.5 RDS 数据库(rds.tf)
resource "aws_db_instance" "postgres" {
allocated_storage = 20
engine = "postgres"
engine_version = "15.4"
instance_class = "db.t3.micro"
name = "mydb"
username = "admin"
password = "StrongP@ssw0rd"
skip_final_snapshot = true
publicly_accessible = false
vpc_security_group_ids = [aws_security_group.db_sg.id]
db_subnet_group_name = aws_db_subnet_group.main.name
}
resource "aws_db_subnet_group" "main" {
name = "main-db-subnet"
subnet_ids = [aws_subnet.public.id]
}
resource "aws_security_group" "db_sg" {
name = "db-sg"
description = "Allow internal access only"
vpc_id = aws_vpc.main.id
}
六、变量值文件(terraform.tfvars)
aws_region = "us-east-1"
ssh_key_name = "terraform-aws"
七、初始化与部署
7.1 初始化
terraform init
Terraform 将下载 AWS Provider 插件,并初始化工作目录。
7.2 资源规划(预览)
terraform plan -out=tfplan
该命令生成计划并输出到 tfplan 文件,有助于审查变更。
7.3 应用变更
terraform apply "tfplan"
八、Terraform State 管理
默认情况下,State 文件保存在本地(terraform.tfstate)。生产环境建议使用远端存储,例如 AWS S3 + DynamoDB 锁定:
terraform {
backend "s3" {
bucket = "terraform-states-bucket"
key = "prod/aws/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "terraform-lock-table"
encrypt = true
}
}
九、评估与对比
下面表格展示不同资源类型的实际部署开销与预计成本(基于us-east-1区域,按小时估算):
| 资源 | 类型 | 规格 | 价格(美元/小时) |
|---|---|---|---|
| EC2 | t3.micro | 1 vCPU,1GB RAM | ~0.0104 |
| RDS | db.t3.micro | 1 vCPU,1GB RAM,20GB gp3 | ~0.018 |
| EBS | General Purpose SSD | 20GB | ~0.002 |
| 数据传输 | 公网 | N/A | 0.09/GB 出站 |
以上价格基于 AWS 官方按需价格(可能随区域而异)。
十、清理资源
部署完成测试后,及时清理资源以避免费用:
terraform destroy -auto-approve
十一、最佳实践
-
模块化设计
将 VPC、EC2、RDS 等抽象为 Terraform 模块(modules/目录),提升复用性。 -
版本控制
所有 .tf 文件纳入 Git 管理,并在 Pull Request 中审查变更。 -
Secret 管理
不要在.tfvars中明文存放密码,建议使用 AWS Secrets Manager 或 HashiCorp Vault 集成。 -
CI/CD 集成
使用 GitHub Actions/GitLab CI 在合并到主分支时自动触发 Terraform 部署。
十二、总结
A5数据通过在 Ubuntu 22.04 上结合 Terraform 进行 AWS 资源自动化部署,你可以将网络、计算与数据库等基础设施定义为代码,实现可重复、易审计、可版本化管理。本文从环境准备到代码示例,再到实际部署流程和资源评估,提供了一套完整解决方案。按需扩展可以将更多 AWS 服务(如 ALB、Auto Scaling、Lambda)纳入 Terraform 管理范畴,进一步简化云资源生命周期管理。
更多推荐
所有评论(0)