通过 Terraform 管理 AnalyticDB for MySQL 资源组
通过 Terraform 创建 AnalyticDB for MySQL 企业版集群,并为不同负载特征创建三种资源组:Disable(固定预留)、AutoScale(按Cluster数量伸缩)、ServerlessAutoScale(按 ACU 伸缩)。
适用场景
-
用基础设施即代码(IaC)管理集群与资源组生命周期。
-
为不同业务负载分配独立资源组,实现资源隔离。
-
跨测试/生产环境复用同一份配置。
预计耗时:30 分钟。集群约 5 分钟,每个资源组约 3 分钟。
前提条件
-
已创建阿里云账号并开通 AnalyticDB for MySQL 服务。
-
已创建 RAM 用户并获取 AccessKey ID 和 AccessKey Secret。建议通过环境变量管理密钥,避免硬编码。
-
已安装 Terraform 1.0+ 并配置阿里云 Provider。
-
RAM 用户具备以下权限:
权限
用途
vpc:CreateVpc、vpc:DeleteVpcVPC 生命周期管理。
vpc:CreateVSwitch、vpc:DeleteVSwitch交换机生命周期管理。
adb:CreateDBCluster、adb:DeleteDBClusterAnalyticDB for MySQL集群生命周期管理。
adb:CreateDBResourceGroup、adb:ModifyDBResourceGroup、adb:DeleteDBResourceGroup资源组生命周期。
bss:PayOrder按量付费下单。
-
已通过环境变量配置 AccessKey:
export ALICLOUD_ACCESS_KEY="<your-access-key-id>" export ALICLOUD_SECRET_KEY="<your-access-key-secret>" export ALICLOUD_REGION="<region>"
使用的资源
本文示例涉及以下 Terraform 资源:
-
alicloud_vpc:创建专有网络。
-
alicloud_vswitch:创建交换机。
-
alicloud_adb_db_cluster_lake_version:创建 AnalyticDB for MySQL 企业版集群。
-
alicloud_adb_resource_group:创建 AnalyticDB for MySQL 资源组。
步骤一:创建 VPC 和交换机
新建 main.tf:
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "~> 1.230"
}
}
}
variable "name" {
default = "tf-adb-rg-example"
}
provider "alicloud" {}
data "alicloud_adb_zones" "default" {}
resource "alicloud_vpc" "default" {
vpc_name = var.name
cidr_block = "192.168.0.0/16"
}
resource "alicloud_vswitch" "default" {
vswitch_name = var.name
vpc_id = alicloud_vpc.default.id
cidr_block = "192.168.1.0/24"
zone_id = data.alicloud_adb_zones.default.ids[0]
}
alicloud_adb_zones 自动返回支持 AnalyticDB for MySQL 的可用区,无需手动指定。
步骤二:创建企业版集群
资源组必须依附于企业版集群。企业版以 ACU(AnalyticDB Compute Unit)为计量单位,集群总容量 = reserved_node_size × reserved_node_count。
resource "alicloud_adb_db_cluster_lake_version" "default" {
db_cluster_version = "5.0"
vpc_id = alicloud_vpc.default.id
vswitch_id = alicloud_vswitch.default.id
zone_id = data.alicloud_adb_zones.default.ids[0]
payment_type = "PayAsYouGo"
product_form = "IntegrationForm"
product_version = "EnterpriseVersion"
reserved_node_size = "8ACU"
reserved_node_count = 6
enable_default_resource_group = false
db_cluster_description = var.name
}
|
参数 |
说明 |
推荐值 |
|
|
集群产品形态。 |
|
|
|
集群版本。仅在 |
|
|
|
单个预留节点的规格,ACU 字符串。 |
|
|
|
预留节点数量。 |
|
|
|
是否将集群的全部 ACU 容量分配给默认资源组 |
|
步骤三:创建三种模式的资源组
三种模式对应三类负载场景。下方模板按需追加到 main.tf,可单独使用,也可同时启用。所有资源组的 ACU 容量总和不能超过集群总容量,否则会因 free compute resource is not sufficient 错误创建失败。
Disable 模式:稳定负载
固定 ACU,不伸缩。适合负载稳定、对延迟敏感的业务,例如定时刷新的 BI 报表。
resource "alicloud_adb_resource_group" "disable_mode" {
db_cluster_id = alicloud_adb_db_cluster_lake_version.default.id
group_name = "TF_DISABLE"
group_type = "interactive"
cluster_mode = "Disable"
min_compute_resource = "16ACU"
max_compute_resource = "16ACU"
}
min_compute_resource 与 max_compute_resource 设为相同值即固定占用。
AutoScale 模式:并发波动负载
详情请参见AutoScale 资源组。
resource "alicloud_adb_resource_group" "autoscale_mode" {
db_cluster_id = alicloud_adb_db_cluster_lake_version.default.id
group_name = "TF_AUTOSCALE"
group_type = "interactive"
cluster_mode = "AutoScale"
min_cluster_count = 1
max_cluster_count = 2
cluster_size_resource = "16ACU"
}
上例:每个Cluster 16 ACU,Cluser数 1-2 自动伸缩,峰值 32 ACU。
ServerlessAutoScale 模式:稀疏不可预测负载
详情请参见ServerlessAutoScale 资源组。
要求集群引擎版本 ≥ 3.2.7.0。低版本会返回 FeatureUnsupported.serverlessXihe。
请在云原生数据仓库AnalyticDB MySQL控制台集群信息页面,配置信息区域,查看和升级内核版本。
resource "alicloud_adb_resource_group" "serverless_mode" {
db_cluster_id = alicloud_adb_db_cluster_lake_version.default.id
group_name = "TF_SERVERLESS"
group_type = "interactive"
cluster_mode = "ServerlessAutoScale"
min_compute_resource = "0ACU"
max_compute_resource = "32ACU"
}
步骤四:部署并验证
terraform init # 输出末尾应见 "Terraform has been successfully initialized!"
terraform plan # 应见 "Plan: 6 to add, 0 to change, 0 to destroy."
terraform apply -auto-approve
apply 总耗时约 8-10 分钟(集群 4-5 分钟,每个资源组 2-3 分钟,资源组并行创建)。完成后输出末尾应见:
Apply complete! Resources: 6 added, 0 changed, 0 destroyed.
在 AnalyticDB for MySQL 控制台的集群资源组管理页面,确认三个资源组均为运行中。
步骤六:清理资源
terraform destroy -auto-approve
应见 Destroy complete! Resources: 6 destroyed.。企业版集群删除约 3-5 分钟,destroy 命令会等待全部资源释放完成才返回。
完整示例
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "~> 1.230"
}
}
}
variable "name" {
default = "tf-adb-rg-example"
}
provider "alicloud" {}
data "alicloud_adb_zones" "default" {}
resource "alicloud_vpc" "default" {
vpc_name = var.name
cidr_block = "192.168.0.0/16"
}
resource "alicloud_vswitch" "default" {
vswitch_name = var.name
vpc_id = alicloud_vpc.default.id
cidr_block = "192.168.1.0/24"
zone_id = data.alicloud_adb_zones.default.ids[0]
}
resource "alicloud_adb_db_cluster_lake_version" "default" {
db_cluster_version = "5.0"
vpc_id = alicloud_vpc.default.id
vswitch_id = alicloud_vswitch.default.id
zone_id = data.alicloud_adb_zones.default.ids[0]
payment_type = "PayAsYouGo"
product_form = "IntegrationForm"
product_version = "EnterpriseVersion"
reserved_node_size = "8ACU"
reserved_node_count = 6
enable_default_resource_group = false
db_cluster_description = var.name
}
resource "alicloud_adb_resource_group" "disable_mode" {
db_cluster_id = alicloud_adb_db_cluster_lake_version.default.id
group_name = "TF_DISABLE"
group_type = "interactive"
cluster_mode = "Disable"
min_compute_resource = "16ACU"
max_compute_resource = "16ACU"
}
resource "alicloud_adb_resource_group" "autoscale_mode" {
db_cluster_id = alicloud_adb_db_cluster_lake_version.default.id
group_name = "TF_AUTOSCALE"
group_type = "interactive"
cluster_mode = "AutoScale"
min_cluster_count = 1
max_cluster_count = 2
cluster_size_resource = "16ACU"
}
resource "alicloud_adb_resource_group" "serverless_mode" {
db_cluster_id = alicloud_adb_db_cluster_lake_version.default.id
group_name = "TF_SERVERLESS"
group_type = "interactive"
cluster_mode = "ServerlessAutoScale"
min_compute_resource = "0ACU"
max_compute_resource = "32ACU"
}
导入控制台已有资源组
将控制台手动创建的资源组纳入 Terraform 管理,避免重复创建。
语法:
terraform import alicloud_adb_resource_group.<terraform-name> <db_cluster_id>:<group_name>
示例:将集群 amv-bp1xxxxxx 中名为 TF_DISABLE 的资源组导入为本地 Terraform 资源 disable_mode。
terraform import alicloud_adb_resource_group.disable_mode amv-bp1xxxxxx:TF_DISABLE