一.概览
terraform作为一种IaC技术,允许自动化来完成基础设施建设
这次,我将在阿里云ECS上使用terraform自动创建阿里云资源
阿里云文档
阿里云Terraform文档 Terraform Provider for Alibaba Cloud
华为云Terraform文档 HuaweiCloud Terraform Provider
二.安装Terraform
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install terraform
terraform -help
terraform -install-autocomplete # 自动补全三.了解terraform
terraform部署文件
# 顶级块--配置引擎(版本约束,模块行为)
terraform {
required_version = ">= 1.5.0, < 2.0.0" # 指定 Terraform 版本
required_providers {} # 描述所需 Provider 的版本与来源
backend <存储类型> {} # 存储位置,默认本地,可配置远程(如 s3、gcs 等)
}
# ---------------------------------------------------------
# Provider 提供者--配置云平台或服务
provider "alicloud" {
region = "<阿里云部署区域>"
}
provider "aws" {
region = "<AWS 部署区域>"
alias = "us" # 多 Provider 时需别名
}
# ---------------------------------------------------------
# Variables 变量--使配置可复用、参数化(建议存于 variables.tf)
variable "region" {
description = "部署区域"
type = string
default = var.<默认区域变量> # 通过 “var.xxxx” 引用变量
}
variable "instance_type" {
type = string
validation {
condition = contains(["<允许的实例类型1>", "<允许的实例类型2>"], var.instance_type)
error_message = "仅支持指定实例类型。"
}
}
# ---------------------------------------------------------
# Resources 资源--通过 provider 创建的基础设施对象
resource "alicloud_vpc" "main" {
vpc_name = "<VPC 名称>"
cidr_block = "<VPC CIDR 块>"
}
resource "alicloud_instance" "web" {
instance_name = "<实例名称>"
image_id = "<操作系统镜像 ID>"
instance_type = var.instance_type
vswitch_id = alicloud_vswitch.public.id # 引用其他资源属性
tags = {
Environment = "<环境标签>"
Team = "<团队标签>"
}
}
# ---------------------------------------------------------
# Outputs 输出--暴露重要信息供外部使用(terraform output,建议存于 outputs.tf)
output "web_server_public_ip" {
description = "Web服务器公网IP"
value = alicloud_instance.web.public_ip # resource.变量
sensitive = true # 隐藏敏感输出(但仍会存入 state)
}
output "vpc_id" {
value = alicloud_vpc.main.id
}
# ---------------------------------------------------------
# Locals 本地变量--简化复杂表达式,避免重复
locals {
common_tags = {
Owner = "<所有者信息>"
Project = "<项目名称>"
Environment = "<部署环境>"
}
}
resource "alicloud_instance" "web" {
tags = merge(local.common_tags, { Name = "<实例标识名>" })
}
# ---------------------------------------------------------
# Modules 模块--使用官方 VPC 模块,将配置封装为可复用单元
module "vpc" {
source = "<模块来源路径>"
version = "<模块版本>"
vpc_name = "<模块内 VPC 名称>"
cidr_block = "<模块内 CIDR 块>"
}
# 引用模块输出
resource "alicloud_instance" "web" {
vswitch_id = module.vpc.vswitch_ids[0]
}
# --------------------------------------------------------
# Data 数据源--读取外部已存在的资源信息
data "aws_vpc" "main" {
tags = {
Name = "<已有 VPC 的标签名称>"
}
}命令与执行
terraform init # 初始化项目,创建新配置使用(当前目录需要存在配置)
# 以下命令都需要在配置工作目录中才能执行
terraform fmt # 格式化配置
terraform validate # 检查配置是合法
terraform apply # 部署基础设施
terraform show # 检查当前配置运行的状态
terraform state list # 列出项目状态的资源
terraform destroy # 终止运行的资源,默认所有资源 -target单独指定某个资源
terraform output # 显示当前配置的output
如果需要修改,只需修改配置重新apply细节
- 部署
每次apply时,都会输出执行计划,可以查看添加,删除,修改了什么配置
+是添加,-是删除,-/+是重建(不是更新),~是就地更新 这些实现由Terraform决定
- 命名
terraform会加载工作目录下所有以.tf结尾的文件
- resource字段
使用不同的provider,使用不同的资源,resource的字段是不同的,甚至不同的provider本身的字段也是不同的。不同的资源与提供者的字段几乎都不相同
- provider需下载
terraform本身不会内置任何provider,任何provider都需要下载,作为插件使用
- resource的类型与provider
resource的类型有明显的格式:“provider_name”,他是provider提供的类型,自动与该provider关联,所以一般只需要一个provider就可以完成配置
- 多文件
多个文件仅仅是逻辑分隔,实际上terraform会将这些配置聚成一个文件使用四.实战
为了允许terraform操作阿里云,必须在阿里云上提前进行授权,而阿里云的授权方式很多,这里我选择了扮演RAM角色并将ECS实例作为可信实体,即允许该ECS中的进程扮演该RAM角色。
1.提前创建临时的ECS作为测试节点,并且按步骤完成了terraform部署
2.创建并授予RAM角色账号权限,用于操作ECS、VPC、KMS

信任策略参考
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": [
"ecs.aliyuncs.com"
]
}
}
],
"Version": "1"
}4.部署清单
# 创建交换机
resource "alicloud_vswitch" "vswitch" { #
vpc_id = alicloud_vpc.vpc.id
cidr_block = "172.16.0.0/24"
zone_id = data.alicloud_zones.default.zones.0.id
vswitch_name = var.name
}
# 创建安全组
resource "alicloud_security_group" "group" {
security_group_name = var.name
description = "foo"
vpc_id = alicloud_vpc.vpc.id
}
# 在阿里云创建KMS秘钥
resource "alicloud_kms_key" "key" {
description = "Hello KMS"
pending_window_in_days = "7"
status = "Enabled"
}
# 创建实例
resource "alicloud_instance" "instance" {
# 通过data动态的获取可用区
availability_zone = data.alicloud_zones.default.zones.0.id
security_groups = [alicloud_security_group.group.id]
# series III
instance_type = "ecs.e-c1m1.large"
system_disk_name = var.name
system_disk_description = "system_disk_description"
system_disk_performance_level = "PL0"
system_disk_category = "cloud_essd"
system_disk_size = 40
image_id = "centos_7_9_x64_20G_alibase_20240628.vhd"
instance_name = var.name
vswitch_id = alicloud_vswitch.vswitch.id
internet_max_bandwidth_out = 3
# data_disks {
# name = "data-disk"
# size = 20
# category = "cloud_essd"
# description = "disk-description"
# encrypted = true
# kms_key_id = alicloud_kms_key.key.id
# }
}
# 默认是按量付费,包年包月需要手动指定5.部署
terraform init
terraform validate
terraform apply7.清理
terraform destroy 8.出现的问题

搜索官方文档,发现是余额不足100导致无法创建按量付费的ECS实例
本文著作权归作者 [ wymm ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。

