通过 Terraform 管理 AnalyticDB for MySQL 资源组

更新时间:
复制 MD 格式

通过 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:CreateVpcvpc:DeleteVpc

    VPC 生命周期管理。

    vpc:CreateVSwitchvpc:DeleteVSwitch

    交换机生命周期管理。

    adb:CreateDBClusteradb:DeleteDBCluster

    AnalyticDB for MySQL集群生命周期管理。

    adb:CreateDBResourceGroupadb:ModifyDBResourceGroupadb: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 资源:

步骤一:创建 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
}

参数

说明

推荐值

product_form

集群产品形态。

IntegrationForm(集成形态)。

product_version

集群版本。仅在 product_form = "IntegrationForm" 时必填。

EnterpriseVersion(企业版)。

reserved_node_size

单个预留节点的规格,ACU 字符串。

8ACU

reserved_node_count

预留节点数量。

6(即集群总容量 48 ACU)。

enable_default_resource_group

是否将集群的全部 ACU 容量分配给默认资源组 user_default

false(避免容量全部分配给默认组,导致自定义资源组无可分配 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_resourcemax_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

相关文档