用 Terraform 在华为云上一键部署高可用 Web 架构
从零开始:用 Terraform 在华为云上一键部署高可用 Web 架构
前言
作为开发者,我们经常需要在云上快速搭建一套 Web 服务。手动在控制台点击创建 VPC、子网、安全组、ECS、ELB……不仅耗时,而且难以复现。今天分享一个实战经验:用 Terraform + 华为云 Provider,20 分钟一键部署一套高可用 Web 架构。
架构设计
目标架构如下:
互联网用户 → ELB(弹性负载均衡)→ 2 × ECS(Nginx)→ 同一个 VPC
↑
自动伸缩组 AS 托管
核心组件:
- VPC + 子网:网络基础设施
- 安全组:仅放通 80 和 443 端口
- 2 台 ECS:部署 Nginx,分布在不同可用区
- ELB:负载均衡,健康检查 + 流量分发
开始动手
1. 安装 Terraform
# 使用华为云镜像源安装(国内更快)
curl -fsSL https://mirrors.huaweicloud.com/terraform/install.sh | bash
2. 配置 Provider
创建 provider.tf:
terraform {
required_providers {
huaweicloud = {
source = "huaweicloud/huaweicloud"
version = ">= 1.60.0"
}
}
}
provider "huaweicloud" {
region = "cn-north-4"
# 推荐通过环境变量传入 AK/SK,不要硬编码
# export HW_ACCESS_KEY="你的AK"
# export HW_SECRET_KEY="你的SK"
}
3. 网络层 — VPC 与子网
创建 network.tf:
resource "huaweicloud_vpc" "web_vpc" {
name = "web-ha-vpc"
cidr = "192.168.0.0/16"
}
resource "huaweicloud_vpc_subnet" "web_subnet" {
name = "web-subnet-az1"
vpc_id = huaweicloud_vpc.web_vpc.id
cidr = "192.168.1.0/24"
gateway_ip = "192.168.1.1"
availability_zone = "cn-north-4a"
}
4. 安全组 — 最小权限原则
创建 security.tf:
resource "huaweicloud_networking_secgroup" "web_sg" {
name = "web-sg"
description = "Security group for web servers"
}
resource "huaweicloud_networking_secgroup_rule" "allow_http" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 80
port_range_max = 80
remote_ip_prefix = "0.0.0.0/0"
security_group_id = huaweicloud_networking_secgroup.web_sg.id
}
resource "huaweicloud_networking_secgroup_rule" "allow_https" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 443
port_range_max = 443
remote_ip_prefix = "0.0.0.0/0"
security_group_id = huaweicloud_networking_secgroup.web_sg.id
}
⚠️ 安全提醒:千万不要图省事放通所有端口。数据库端口(3306、5432 等)只对内网开放,不暴露公网。
5. ECS 计算层 — 双可用区部署
创建 compute.tf:
locals {
nginx_script = <<-EOF
#!/bin/bash
yum install -y nginx
systemctl start nginx
systemctl enable nginx
echo "<h1>Server from AZ-$${az}</h1>" > /usr/share/nginx/html/index.html
EOF
}
resource "huaweicloud_compute_instance" "web" {
count = 2
name = "web-server-${count.index + 1}"
image_name = "CentOS 7.9 64bit"
flavor_name = "s6.large.2"
availability_zone = count.index == 0 ? "cn-north-4a" : "cn-north-4b"
security_group_ids = [huaweicloud_networking_secgroup.web_sg.id]
network {
uuid = huaweicloud_vpc_subnet.web_subnet.id
}
user_data = replace(local.nginx_script, "$${az}", count.index == 0 ? "A" : "B")
tags = {
Environment = "production"
ManagedBy = "terraform"
}
}
6. ELB 负载均衡
创建 loadbalancer.tf:
resource "huaweicloud_elb_loadbalancer" "web_elb" {
name = "web-elb"
vip_subnet_id = huaweicloud_vpc_subnet.web_subnet.id
}
resource "huaweicloud_elb_listener" "web_listener" {
name = "web-listener"
protocol = "HTTP"
protocol_port = 80
loadbalancer_id = huaweicloud_elb_loadbalancer.web_elb.id
}
resource "huaweicloud_elb_pool" "web_pool" {
name = "web-pool"
protocol = "HTTP"
lb_method = "ROUND_ROBIN"
listener_id = huaweicloud_elb_listener.web_listener.id
}
resource "huaweicloud_elb_monitor" "web_monitor" {
pool_id = huaweicloud_elb_pool.web_pool.id
protocol = "HTTP"
interval = 10
timeout = 5
max_retries = 3
url_path = "/"
}
resource "huaweicloud_elb_member" "web_members" {
count = 2
pool_id = huaweicloud_elb_pool.web_pool.id
address = huaweicloud_compute_instance.web[count.index].access_ip_v4
subnet_id = huaweicloud_vpc_subnet.web_subnet.id
protocol_port = 80
weight = 1
}
7. 一键部署
terraform init
terraform plan
terraform apply
执行完成后,Terraform 会输出 ELB 的公网 IP,浏览器访问即可看到负载均衡效果——刷新页面会在 "Server from AZ-A" 和 "Server from AZ-B" 之间切换。
踩过的坑
-
AK/SK 不要写进 .tf 文件:一开始我把 AK/SK 硬编码在 provider 块里,后来不小心 commit 到 Git 了……正确做法是用环境变量传入。
-
可用区选择:不是所有 region 都有多可用区。部署前先在控制台确认目标 region 的可用区列表,否则会报
availability zone not found。 -
安全组 vs 旧版安全组:华为云有两套安全组 API,建议用新版
huaweicloud_vpc_secgroup,功能更全。 -
cloud-init 脚本中的变量转义:Terraform 的
${}和 shell 的$会冲突,需要用$$转义,这个坑踩了好久。
总结
用 Terraform 管理华为云基础设施,最大的好处是可复现 + 可版本控制。团队新人 clone 仓库后 terraform apply 就能拉起一套一模一样的环境,不用再口口相传"你先建个 VPC,再建个子网……"。
本文基于华为云 Terraform Provider 1.60+ 版本,如有 API 变更请参考官方文档。
- 点赞
- 收藏
- 关注作者
评论(0)