当前位置: 首页 > news >正文

云系列和Terraform(十二)

阿里云应用与实践


云计算基础


虚拟机种类:
系统级别虚拟机 - kvm - 大规模场景下,openstack
应用级别虚拟化 - docker - 大规模场景下,kubernetes
云计算分类:IaaS/PaaS/SaaS

IaaS(基础设施即服务):交付虚拟化计算、存储、网络等基础设施资源,用户自主部署系统与应用。 PaaS(平台即服务):提供应用开发、部署、运行的整套平台环境,屏蔽底层基础设施运维。 SaaS(软件即服务):云端部署完整应用软件,通过网络按需订阅使用。

阿里云产品


云服务器 ECS
云网络 VPC 【Vroute、Vswitch】
弹性公网ip EIP
网络防火墙 安全组
云数据库 RDS DMS
云存储 OSS、NAS、ESSD
云编排服务 OOS



其他产品


SLB、云解析、CEN、NAT网关、安全产品
云平台产品安全 -- 认证、权限、账号、费用、分析等

一、计算类 ECS:Elastic Compute Service,弹性计算服务(云服务器) ESSD:Enhanced Solid State Drive,增强型 SSD 云盘(高性能块存储,常和 ECS 搭配) 二、网络类 VPC:Virtual Private Cloud,专有网络(云上私有网络环境) EIP:Elastic IP Address,弹性公网 IP(可独立绑定 / 解绑的公网 IP) SLB:Server Load Balancer,负载均衡 CLB:Classic Load Balancer,传统型负载均衡(四层 + 七层) ALB:Application Load Balancer,应用型负载均衡(七层,侧重 HTTP/HTTPS) NLB:Network Load Balancer,网络型负载均衡(四层,侧重高性能、低延迟) 三、存储类 OSS:Object Storage Service,对象存储服务(海量文件存储) NAS:Network Attached Storage,文件存储服务(共享文件存储) 四、数据库类 RDS:Relational Database Service,关系型数据库服务(云数据库) DMS:Data Management Service,数据管理服务(数据库全生命周期管理平台) 五、运维管理类 OOS:Operation Orchestration Service,运维编排服务(自动化运维)


vpc


实践:ECS切换vpc、切换交换机、增加辅助网卡、NAT网关、SLB服务、云解析、CEN
安全体系
网络安全、主机安全、业务安全、管理安全

网络安全:防护网络链路、边界与传输,拦截网络攻击。 主机安全:加固服务器 / 终端,防范系统入侵、恶意程序。 业务安全:保障应用流程与数据,规避业务漏洞、违规操作。 管理安全:规范权限、人员、流程与审计,规避人为风险。


IaC 基础设施即代码


terraform


组成:CLI、provider、state、backend

CLI:命令行工具,执行初始化、部署、销毁等操作 Provider:云厂商 / 服务插件,对接对应平台接口 State:状态文件,记录云端资源当前拓扑与属性 Backend:状态存储后端,存放、同步 state 数据


命令:init、plan、apply、destroy

init:初始化环境、加载插件、配置后端 plan:预览资源变更,不实际执行 apply:执行配置,创建 / 更新云资源 destroy:销毁所有托管资源


元素:资源、数据源、变量、输出

资源:定义要创建的云服务 / 实例 数据源:读取已有云上资源信息 变量:外部传入参数,灵活配置 输出:执行后返回结果信息


ECS环境定制的时候,如何定制自己的环境
1 user_date 类似于 普通linux的 /etc/rc.local
2 为ECS定制环境,null_resource 【依赖于ECS绑定EIP】
3 如何为ECS传递文件
1 base64加密
2 如果文件里面需要ECS里面的其他资源数据,不推荐使用呢base64

state


最好单独报错,不允许手工修改

记录 Terraform 托管资源的实时状态、拓扑与关联关系。出现异常会单独告警提示,该文件由工具自动维护,禁止人工编辑修改,手动改动易引发资源错乱、部署失效。

Terraform 模块设计原则

复用性:封装资源,一处编写、多处调用 标准化:统一配置规范,避免环境差异 可维护性:模块化管理,问题定位与修改更清晰 可组合性:模块可嵌套、组合,构建复杂架构 可测试性:支持独立测试,降低变更风险 版本化:支持版本管理,便于回滚与迭代

Terraform 模块中最常用的核心属性

变量定义 (variable)

type:变量类型(如 string/number/list/map/bool/object) description:变量用途说明 default:变量默认值 validation:自定义校验规则(如正则、取值范围) sensitive:是否标记为敏感数据(日志中隐藏)

输出定义 (output)

value:要输出的值(可引用资源属性或变量) description:输出说明 sensitive:是否标记为敏感数据 depends_on:显式指定依赖关系

资源 / 数据源 (resource/data)

resource_type:资源类型(如 alicloud_instance) resource_name:资源名称 provider:指定使用的 provider(多环境 / 多账号场景) count/for_each:批量创建资源(循环控制) lifecycle:生命周期控制 create_before_destroy prevent_destroy ignore_changes

模块调用 (module)

source:模块路径 / 地址(本地或远程模块仓库) version:模块版本(远程模块必填) 自定义变量:向模块传递的变量参数 providers:为模块指定 provider

本地值 (locals)

用于在模块内部定义可复用的常量或计算值,减少重复表达式。

元参数(通用)

depends_on:显式依赖 count/for_each:批量创建 provider:指定 provider lifecycle:...

实践1

以ECS为对象,编写覆盖实例操作流程terraform代码

安装 Terraform

Ubuntu24安装

apt update && apt install wget unzip -y wget https://releases.hashicorp.com/terraform/1.9.0/terraform_1.9.0_linux_amd64.zip unzip terraform_1.9.0_linux_amd64.zip mv terraform /usr/local/bin/ terraform version

阿里云账号准备

登录阿里云控制台 → 右上角头像 → AccessKey 管理 创建 AccessKey ID、AccessKey Secret(复制保存,只显示一次) 本地生成 SSH 密钥(用来登录 ECS)

ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub

创建独立工作目录

mkdir ~/terraform-ecs-demo cd ~/terraform-ecs-demo

main.tf(核心资源:VPC / 交换机 / 安全组 / 密钥 / ECS)

# 指定Terraform版本与阿里云插件 terraform { required_providers { alicloud = { source = "aliyun/alicloud" version = ">= 1.200.0" } } } # 阿里云连接配置 provider "alicloud" { access_key = var.ali_ak secret_key = var.ali_sk region = var.region } # 1. 创建独立VPC resource "alicloud_vpc" "ecs_vpc" { vpc_name = "ecs-demo-vpc" cidr_block = "10.0.50.0/16" } # 2. 创建子网交换机 resource "alicloud_vswitch" "ecs_vsw" { vpc_id = alicloud_vpc.ecs_vpc.id zone_id = var.zone_id cidr_block = "10.0.50.0/24" vswitch_name = "ecs-demo-switch" } # 3. 创建安全组 resource "alicloud_security_group" "ecs_sg" { name = "ecs-demo-sg" vpc_id = alicloud_vpc.ecs_vpc.id description = "ECS实例放行22/80/8080端口" } # 放行SSH 22端口 resource "alicloud_security_group_rule" "ssh_rule" { security_group_id = alicloud_security_group.ecs_sg.id type = "ingress" cidr_ip = "0.0.0.0/0" port_range = "22/22" ip_protocol = "tcp" priority = 1 } # 放行80网页端口 resource "alicloud_security_group_rule" "http_rule" { security_group_id = alicloud_security_group.ecs_sg.id type = "ingress" cidr_ip = "0.0.0.0/0" port_range = "80/80" ip_protocol = "tcp" priority = 2 } # 放行SpringBoot 8080端口 resource "alicloud_security_group_rule" "spring_rule" { security_group_id = alicloud_security_group.ecs_sg.id type = "ingress" cidr_ip = "0.0.0.0/0" port_range = "8080/8080" ip_protocol = "tcp" priority = 3 } # 4. SSH密钥对,免密登录ECS resource "alicloud_key_pair" "ecs_ssh_key" { key_pair_name = "ecs-demo-key" public_key = var.ssh_public_key } # 5. 核心ECS实例资源 resource "alicloud_instance" "spring_server" { instance_name = "spring-boot-ecs" image_id = var.ubuntu_image_id instance_type = var.ecs_spec vswitch_id = alicloud_vswitch.ecs_vsw.id security_groups = [alicloud_security_group.ecs_sg.id] key_name = alicloud_key_pair.ecs_ssh_key.key_pair_name # 公网配置 internet_max_bandwidth_out = 10 internet_charge_type = "PayByTraffic" # 系统盘配置 system_disk_category = "cloud_efficiency" system_disk_size = 40 # 主机名 hostname = "ubuntu24-server" # 开机自动执行脚本,预装JDK17 user_data = <<-EOF #!/bin/bash apt update -y apt install openjdk-17-jdk -y EOF }

variables.tf

统一变量

# 阿里云密钥 variable "ali_ak" { type = string description = "阿里云AccessKey ID" } variable "ali_sk" { type = string description = "阿里云AccessKey Secret" } # 地域可用区 variable "region" { type = string default = "cn-huhehaote" } variable "zone_id" { type = string default = "cn-huhehaote-a" } # Ubuntu24镜像ID variable "ubuntu_image_id" { type = string default = "ubuntu_24_04_x64_20G_alibase_20250901.vhd" } # ECS实例规格 variable "ecs_spec" { type = string default = "ecs.t6.large" } # SSH公钥 variable "ssh_public_key" { type = string description = "本地~/.ssh/id_rsa.pub完整内容" }

terraform.tfvars

填自己的信息

ali_ak = "填入你的阿里云AccessKey ID" ali_sk = "填入你的阿里云AccessKey Secret" ssh_public_key = "cat ~/.ssh/id_rsa.pub输出的全部内容"

outputs.tf(创建完成自动输出 ECS 关键信息)

# ECS内网IP output "ecs_private_ip" { value = alicloud_instance.spring_server.private_ip } # ECS公网IP(用来ssh连接) output "ecs_public_ip" { value = alicloud_instance.spring_server.public_ip } # ECS实例ID output "ecs_instance_id" { value = alicloud_instance.spring_server.id } # VPC网段 output "vpc_cidr" { value = alicloud_vpc.ecs_vpc.cidr_block } # 安全组ID output "sg_id" { value = alicloud_security_group.ecs_sg.id }

1.确认 4 个文件都在当前目录

ls main.tf variables.tf terraform.tfvars outputs.tf

2 初始化,自动下载阿里云插件

terraform init

3 预览要创建的所有资源

terraform plan

4 生成 ECS,开始计费

terraform apply -auto-approve

5查看 ECS 信息

terraform output

6 SSH 登录 ECS 测试

ssh root@公网IP java -version

7 修改 ECS 配置

把实例规格从t6.large改成t6.medium

编辑 variables.tf,修改ecs_spec值

预览

terraform plan

8 销毁所有资源

terraform destroy -auto-approve

注:

创建:init → plan → apply 查询:terraform output /terraform show 更新:修改 HCL → plan → apply 删除:terraform destroy 全程自动处理资源依赖,无需手动管控创建 / 销毁顺序。

实践2

以“web服务和数据库”为例,构建完整的”VPC+ECS+RDS+SLB“完整web服务架构的terraform代码

计划:1 个 VPC、2 个业务子网、2 台 Web ECS、1 台公网 SLB、1 套 RDS MySQL、两套隔离安全组

装好 terraform 阿里云 AK/SK、本地 ssh 公钥 新建文件夹放 4 个 tf 文件

main.tf

# Terraform版本与阿里云插件声明 terraform { required_providers { alicloud = { source = "aliyun/alicloud" version = ">=1.200.0" } } } # 阿里云身份认证 provider "alicloud" { access_key = var.ak # 阿里云AK secret_key = var.sk # 阿里云SK region = var.region # 部署地域 } # ========== 1. 顶层VPC私有网络 ========== resource "alicloud_vpc" "web_vpc" { vpc_name = "web-vpc" cidr_block = "10.0.90.0/16" # VPC整体网段 } # ========== 2. 双可用区业务子网(放ECS/SLB) ========== # A区子网 resource "alicloud_vswitch" "sub_a" { vpc_id = alicloud_vpc.web_vpc.id zone_id = var.zone_a cidr_block = "10.0.90.1.0/24" vswitch_name = "sub-a" } # B区子网 resource "alicloud_vswitch" "sub_b" { vpc_id = alicloud_vpc.web_vpc.id zone_id = var.zone_b cidr_block = "10.0.90.2.0/24" vswitch_name = "sub-b" } # ========== 3. Web服务安全组:放行SSH、SpringBoot端口 ========== resource "alicloud_security_group" "web_sg" { name = "web-sg" vpc_id = alicloud_vpc.web_vpc.id } # 放行22远程登录 resource "alicloud_security_group_rule" "ssh" { security_group_id = alicloud_security_group.web_sg.id type = "ingress" # 入方向规则 cidr_ip = "0.0.0.0/0" port_range = "22/22" ip_protocol = "tcp" } # 放行8080业务端口 resource "alicloud_security_group_rule" "web" { security_group_id = alicloud_security_group.web_sg.id type = "ingress" cidr_ip = "0.0.0.0/0" port_range = "8080/8080" ip_protocol = "tcp" } # ========== 4. RDS数据库安全组:仅内网网段访问3306 ========== resource "alicloud_security_group" "db_sg" { name = "db-sg" vpc_id = alicloud_vpc.web_vpc.id } resource "alicloud_security_group_rule" "mysql" { security_group_id = alicloud_security_group.db_sg.id type = "ingress" cidr_ip = "10.0.90.0/16" # 仅本VPC内网可连数据库 port_range = "3306/3306" ip_protocol = "tcp" } # ========== 5. SSH密钥对,免密登录ECS ========== resource "alicloud_key_pair" "ssh_key" { key_pair_name = "web-key" public_key = var.pub_key # 本地生成的公钥 } # ========== 6. 两台跨可用区Web ECS节点 ========== # Web节点1(A区) resource "alicloud_instance" "web1" { instance_name = "web-01" image_id = var.ubuntu_img # Ubuntu系统镜像 instance_type = var.ecs_spec # ECS实例规格 vswitch_id = alicloud_vswitch.sub_a.id security_groups = [alicloud_security_group.web_sg.id] key_name = alicloud_key_pair.ssh_key.key_pair_name internet_max_bandwidth_out = 5 # 公网带宽 # 开机自动脚本:安装JDK17运行SpringBoot user_data = "#!/bin/bash\napt update -y\napt install openjdk-17-jdk -y" } # Web节点2(B区,高可用冗余) resource "alicloud_instance" "web2" { instance_name = "web-02" image_id = var.ubuntu_img instance_type = var.ecs_spec vswitch_id = alicloud_vswitch.sub_b.id security_groups = [alicloud_security_group.web_sg.id] key_name = alicloud_key_pair.ssh_key.key_pair_name internet_max_bandwidth_out = 5 user_data = "#!/bin/bash\napt update -y\napt install openjdk-17-jdk -y" } # ========== 7. 公网SLB负载均衡,对外统一入口 ========== resource "alicloud_slb" "web_lb" { name = "web-slb" internet = true # 开启公网 vswitch_id = alicloud_vswitch.sub_a.id } # ========== 8. SLB后端服务器组,存放两台Web节点 ========== resource "alicloud_slb_server_group" "web_group" { load_balancer_id = alicloud_slb.web_lb.id name = "web-group" } # 将web1加入后端组,转发8080端口 resource "alicloud_slb_server_group_server" "s1" { server_group_id = alicloud_slb_server_group.web_group.id server_id = alicloud_instance.web1.id port = 8080 } # 将web2加入后端组 resource "alicloud_slb_server_group_server" "s2" { server_group_id = alicloud_slb_server_group.web_group.id server_id = alicloud_instance.web2.id port = 8080 } # ========== 9. SLB监听:前端80端口转发后端8080 ========== resource "alicloud_slb_listener" "http" { load_balancer_id = alicloud_slb.web_lb.id backend_server_group_id = alicloud_slb_server_group.web_group.id frontend_port = 80 # 用户访问端口 backend_port = 8080 # Web服务端口 protocol = "http" } # ========== 10. RDS MySQL数据库实例 ========== resource "alicloud_db_instance" "mysql" { instance_name = "web-mysql" engine = "MySQL" engine_version = "8.0" instance_class = "mysql.n2.small.2c" # 数据库规格 instance_storage = 20 # 存储20G zone_id = var.zone_a vswitch_id = alicloud_vswitch.sub_a.id security_ips = ["10.0.90.0/16"] # 内网白名单 } # ========== 11. 数据库账号、业务库、权限 ========== # 业务账号 resource "alicloud_db_account" "user" { db_instance_id = alicloud_db_instance.mysql.id account_name = "webuser" account_password = "Root@123456" } # 创建业务数据库webdb resource "alicloud_db_database" "webdb" { db_instance_id = alicloud_db_instance.mysql.id db_name = "webdb" } # 账号授予数据库全部权限 resource "alicloud_db_account_privilege" "priv" { db_instance_id = alicloud_db_instance.mysql.id account_name = alicloud_db_account.user.account_name db_names = [alicloud_db_database.webdb.db_name] privilege = "All" }

variables.tf

# 阿里云密钥ID variable "ak" {} # 阿里云密钥Secret variable "sk" {} # 地域 variable "region" { default = "cn-huhehaote" } # 可用区A variable "zone_a" { default = "cn-huhehaote-a" } # 可用区B variable "zone_b" { default = "cn-huhehaote-b" } # Ubuntu24镜像ID variable "ubuntu_img" { default = "ubuntu_24_04_x64_20G_alibase_20250901.vhd" } # ECS实例规格 variable "ecs_spec" { default = "ecs.t6.small" } # SSH公钥文本 variable "pub_key" {}

terraform.tfvars

自己信息

ak = "你的阿里云AccessKey ID" sk = "你的阿里云AccessKey Secret" pub_key = "ssh-rsa 你的公钥完整内容"

outputs.tf 输出资源访问信息

# SLB公网访问IP,浏览器直接访问 output "slb公网ip" { value = alicloud_slb.web_lb.public_ip } # Web1内网IP output "web1内网ip" { value = alicloud_instance.web1.private_ip } # Web2内网IP output "web2内网ip" { value = alicloud_instance.web2.private_ip } # RDS内网连接地址,SpringBoot配置数据库用 output "rds内网地址" { value = alicloud_db_instance.mysql.connection_string } # 数据库账号 output "数据库账号" { value = "webuser" } # 数据库密码 output "数据库密码" { value = "Root@123456" }

初始化下载阿里云插件

terraform init

预览资源

terraform plan

创建整套 VPC+ECS+SLB+RDS

terraform apply -auto-approve

查看 SLB、数据库连接信息

terraform output

修改配置后更新资源

terraform plan terraform apply -auto-approve

销毁全部资源

terraform destroy -auto-approve
http://www.cnnetsun.cn/news/3126043.html

相关文章:

  • WidescreenFixesPack:让70+款经典游戏在现代宽屏显示器上完美运行的终极方案
  • Claude为什么这么聪明?揭秘藏在每个AI大模型背后的“注意力魔法“
  • 02-SpringBoot配置文件
  • 华为MetaERP OM 一致性对账 SQL 脚本集合(OM-WSH、WSH-INV、OM-AR、异常订单筛查)
  • 无感FOC与滑膜观测器在电机控制中的应用
  • 建筑外立面缺陷智能识别:YOLOv26驱动下的多类损伤检测数据集与实战10748期
  • 1kW高效BLDC电机设计:医疗设备应用与转矩脉动控制
  • 保姆级外部字幕添加教程 3步搞定播放器字幕加载
  • aixingpan.cn API开发文档:api_docs_onechart_lunar_return2接口指南
  • 大模型应用中的“中转层”到底解决了什么问题?
  • [对比评测]SendTomo和LocalSend哪个更适合文件传输
  • Linux服务器Jmeter压测实战:环境搭建、脚本优化与性能分析
  • RAG检索增强策略:混合检索、重排序与Query改写
  • 量子阱结构二极管:电子元器件的颠覆性创新
  • SQL慢_分析 执行计划突变
  • 一键生成公众号文章自动排版工具实战指南
  • 达梦数据库SSL/TLS加密实战:从证书生成到客户端配置全解析
  • SteamShutdown:Steam下载完成后自动关机的智能解决方案
  • OpenCV+YOLO实时目标检测:从环境搭建到多线程优化的完整项目实战
  • YOLOv8从零安装到实战:环境配置与目标检测入门指南
  • YOLOv8 从零部署到自定义训练:环境搭建、推理测试与实战指南
  • YOLOv8部署优化:从1.2 FPS到35 FPS的实战指南
  • YOLOv8+OpenCV性能优化:从1.2FPS到35FPS的全链路实战指南
  • Harness Engineering:构建AI编码助手的工程化缰绳系统
  • 第99题 2026年国家级科研痛点 SiC MOSFET短路耐量(SCSOA)提升技术
  • 汽车发动机故障诊断与维修实战指南
  • AI建站工具零基础教程:10分钟快速搭建专业网站
  • 企业级AI Agent实战:Hermes Agent与Harness Engineering从零到一
  • DataEyesAI与Sora 2视频生成API实战指南
  • AI全栈开发:40分钟快速构建企业官网实战