用 Terraform 在华为云上一键部署高可用 Web 架构

举报
yd_243668775 发表于 2026/10/22 13:39:37 2026/10/22
【摘要】 从零开始:用 Terraform 在华为云上一键部署高可用 Web 架构前言作为开发者,我们经常需要在云上快速搭建一套 Web 服务。手动在控制台点击创建 VPC、子网、安全组、ECS、ELB……不仅耗时,而且难以复现。今天分享一个实战经验:用 Terraform + 华为云 Provider,20 分钟一键部署一套高可用 Web 架构。架构设计目标架构如下:互联网用户 → ELB(弹性负载...


从零开始:用 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" 之间切换。

踩过的坑

  1. AK/SK 不要写进 .tf 文件:一开始我把 AK/SK 硬编码在 provider 块里,后来不小心 commit 到 Git 了……正确做法是用环境变量传入。

  2. 可用区选择:不是所有 region 都有多可用区。部署前先在控制台确认目标 region 的可用区列表,否则会报 availability zone not found。

  3. 安全组 vs 旧版安全组:华为云有两套安全组 API,建议用新版 huaweicloud_vpc_secgroup,功能更全。

  4. cloud-init 脚本中的变量转义:Terraform 的 ${} 和 shell 的 $ 会冲突,需要用 $$ 转义,这个坑踩了好久。

总结

用 Terraform 管理华为云基础设施,最大的好处是可复现 + 可版本控制。团队新人 clone 仓库后 terraform apply 就能拉起一套一模一样的环境,不用再口口相传"你先建个 VPC,再建个子网……"。

本文基于华为云 Terraform Provider 1.60+ 版本,如有 API 变更请参考官方文档。



【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。