本文面向中高级运维工程师与云架构师,详细介绍在Ubuntu 22.04环境下使用**Terraform 1.5+**自动化部署AWS基础设施的全流程。内容涵盖环境准备、工具安装、最佳实践、代码示例、变量管理、State 管理,以及一套完整的示例架构(VPC、子网、EC2、RDS)。A5数据强调技术细节、产品参数和可执行代码,帮助你将云资源管理从手工操作彻底自动化。


一、背景与目标

随着云基础设施规模扩大,手工管理AWS资源不仅耗时,还容易产生配置不一致、资源泄漏等问题。Terraform作为业界主流的声明式基础设施即代码(IaC)工具,能将资源定义为代码,通过版本控制实现可审计、可复现的部署流程。本文以Ubuntu 22.04为开发主机,结合AWS实际生产环境,构建可自动化部署的Terraform工程流程。


二、目标架构与资源规格

本文最终将部署如下基础设施:

资源类别AWS 服务典型配置说明
网络VPCCIDR: 10.0.0.0/16内网隔离
子网公有与私有子网10.0.1.0/24,10.0.2.0/24分布于两个可用区
网关Internet Gateway-公网访问
路由表Public Route Table0.0.0.0/0 -> IGW公网路由
计算EC2 t3.micro1 vCPU,1GB RAM测试服务
数据库RDS PostgreSQLdb.t3.micro,20GB私有子网部署
SSH 管理Key PairRSA 4096SSH 访问

三、环境准备

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区域,按小时估算):

资源类型规格价格(美元/小时)
EC2t3.micro1 vCPU,1GB RAM~0.0104
RDSdb.t3.micro1 vCPU,1GB RAM,20GB gp3~0.018
EBSGeneral Purpose SSD20GB~0.002
数据传输公网N/A0.09/GB 出站

以上价格基于 AWS 官方按需价格(可能随区域而异)。


十、清理资源

部署完成测试后,及时清理资源以避免费用:

terraform destroy -auto-approve

十一、最佳实践

  1. 模块化设计
    将 VPC、EC2、RDS 等抽象为 Terraform 模块(modules/目录),提升复用性。

  2. 版本控制
    所有 .tf 文件纳入 Git 管理,并在 Pull Request 中审查变更。

  3. Secret 管理
    不要在 .tfvars 中明文存放密码,建议使用 AWS Secrets Manager 或 HashiCorp Vault 集成。

  4. CI/CD 集成
    使用 GitHub Actions/GitLab CI 在合并到主分支时自动触发 Terraform 部署。


十二、总结

A5数据通过在 Ubuntu 22.04 上结合 Terraform 进行 AWS 资源自动化部署,你可以将网络、计算与数据库等基础设施定义为代码,实现可重复、易审计、可版本化管理。本文从环境准备到代码示例,再到实际部署流程和资源评估,提供了一套完整解决方案。按需扩展可以将更多 AWS 服务(如 ALB、Auto Scaling、Lambda)纳入 Terraform 管理范畴,进一步简化云资源生命周期管理。

更多推荐