Terraform集成示例

本文为您演示如何通过Terraform创建云数据库 MongoDB 版实例。

如果您还不了解Terraform,请参见文档什么是Terraform。关于支持的MongoDB资源类型,请参见集成概览或直接通过Terraform文档查找。

资源架构

image.png

在指定地域创建一个VPC网络和一台交换机,然后创建一个MongoDB副本集实例。

操作步骤

安装Terraform

  • 您如果想要在本地安装和配置Terraform,请参见在本地安装和配置Terraform

    安装完成后,您可以打开命令行终端,输入terraform version,看到返回版本信息表示已成功安装。

  • 如果您不想安装Terraform,可以使用阿里云提供的在线服务Cloud Shell,其中内置了Terraform的运行环境。

配置权限

执行Terraform模板需要RAM用户权限,我们需要创建一个RAM用户,并获取AccessKey,添加权限策略。示例Terraform模板会创建VPC、虚拟交换机以及MongoDB实例,您需要为RAM用户添加以下权限:

  • AliyunVPCFullAccess:管理专有网络 VPC的权限。

  • AliyunMongoDBFullAccess:管理云数据库 MongoDB 版的权限。

编写模板

创建一个名为main.tf文件,根据需求选择填入以下内容。

单节点

# 引入 alicloud provider
provider "alicloud" {}

# 声明变量名: name
variable "name" {
  default = "terraform-example"
}

# 查询可用区信息: alicloud_mongodb_zones
data "alicloud_mongodb_zones" "default" {
  
}

# 声明本地值, zone_id 取 alicloud_mongodb_zones 中的最后一个可用区
locals {
  index   = length(data.alicloud_mongodb_zones.default.zones) - 1
  zone_id = data.alicloud_mongodb_zones.default.zones[local.index].id
}

# 创建 alicloud_vpc 资源
resource "alicloud_vpc" "default" {
  vpc_name   = var.name
  description = var.name
  cidr_block = "172.17.3.0/24"
}

# 在 local.zone_id 地区创建 alicloud_vpc 资源下的 alicloud_vswitch 资源
resource "alicloud_vswitch" "default" {
  vswitch_name = var.name
  cidr_block   = "172.17.3.0/24"
  vpc_id       = alicloud_vpc.default.id
  zone_id      = local.zone_id
}

# 使用上述vpc、vswitch信息创建单节点资源
resource "alicloud_mongodb_instance" "singleNode" {
  engine_version      = "4.0"
  db_instance_class   = "dds.sn4.xlarge.1"
  db_instance_storage = 20
  vswitch_id          = alicloud_vswitch.default.id
  zone_id             = local.zone_id
  security_ip_list    = [
        "10.168.1.12",
        "100.69.7.112"
    ]
  name                = var.name
  storage_type        = "cloud_essd1"
  tags = {
    Created = "TF"
    For     = "example"
    }
}

关于alicloud_mongodb_instance资源类型的配置信息,请参见资源详情

副本集

# 引入 alicloud provider
provider "alicloud" {}

# 声明变量名: name
variable "name" {
  default = "terraform-example"
}

# 查询可用区信息: alicloud_mongodb_zones
data "alicloud_mongodb_zones" "default" {
  
}

# 声明本地值, zone_id 取 alicloud_mongodb_zones 中的最后一个可用区
locals {
  index   = length(data.alicloud_mongodb_zones.default.zones) - 1
  zone_id = data.alicloud_mongodb_zones.default.zones[local.index].id
}

# 创建 alicloud_vpc 资源
resource "alicloud_vpc" "default" {
  vpc_name   = var.name
  description = var.name
  cidr_block = "172.17.3.0/24"
}

# 在 local.zone_id 地区创建 alicloud_vpc 资源下的 alicloud_vswitch 资源
resource "alicloud_vswitch" "default" {
  vswitch_name = var.name
  cidr_block   = "172.17.3.0/24"
  vpc_id       = alicloud_vpc.default.id
  zone_id      = local.zone_id
}

# 使用上述vpc、vswitch信息创建副本集资源
resource "alicloud_mongodb_instance" "default" {
  engine_version      = "5.0"
  db_instance_class   = "mdb.shard.2x.xlarge.d"
  db_instance_storage = 20
  vswitch_id          = alicloud_vswitch.default.id
  security_ip_list    = ["10.168.1.12", "100.69.7.112"]
  name                = var.name
  tags = {
    Created = "TF"
    For     = "example"
  }
}

关于alicloud_mongodb_instance资源类型的配置信息,请参见资源详情

分片集群

# 引入 alicloud provider
provider "alicloud" {}

# 声明变量名: name
variable "name" {
  default = "terraform-example"
}

# 查询可用区信息: alicloud_mongodb_zones
data "alicloud_mongodb_zones" "default" {
  
}

# 声明本地值, zone_id 取 alicloud_mongodb_zones 中的最后一个可用区
locals {
  index   = length(data.alicloud_mongodb_zones.default.zones) - 1
  zone_id = data.alicloud_mongodb_zones.default.zones[local.index].id
}

# 创建 alicloud_vpc 资源
resource "alicloud_vpc" "default" {
  vpc_name   = var.name
  description = var.name
  cidr_block = "172.17.3.0/24"
}

# 在 local.zone_id 地区创建 alicloud_vpc 资源下的 alicloud_vswitch 资源
resource "alicloud_vswitch" "default" {
  vswitch_name = var.name
  cidr_block   = "172.17.3.0/24"
  vpc_id       = alicloud_vpc.default.id
  zone_id      = local.zone_id
}

# 使用上述vpc、vswitch信息创建分片集群资源
resource "alicloud_mongodb_sharding_instance" "default" {
  engine_version      = "7.0"
  vswitch_id          = alicloud_vswitch.default.id
  name                = var.name
  zone_id = local.zone_id
  mongo_list {
    node_class = "mdb.shard.2x.large.c"
  }
  mongo_list {
    node_class = "mdb.shard.2x.large.c"
  }
  shard_list {
    node_class   = "mdb.shard.2x.large.c"
    node_storage = "20"
  }
  shard_list {
    node_class        = "mdb.shard.2x.large.c"
    node_storage      = "20"
    readonly_replicas = "1"
  }
  config_server_list {
    node_class ="mdb.shard.2x.large.c"
    node_storage = "20"
  }
  tags = {
    Created = "TF"
    For     = "Example"
  }
}

关于alicloud_mongodb_sharding_instance资源类型的配置信息,请参见资源详情

说明

如果您在运行模板的时候遇到参数不存在的报错,可以执行terraform version命令确认当前版本与官网版本是否一致,如果不是最新版本,您需要在main.tf文件中的provider "alicloud" {}内指定版本,格式如下:

provider "alicloud" {version = "~> v*.***.*"}

实际使用时请将v*.***.*替换为最新版本号。

运行模板

  1. 初始化加载模块,包括Provider,Provisioner,Module等模板。

    terraform init

    image

  2. 验证模板语法是否正确。

    terraform validate

    image

  3. 创建执行计划。

    terraform plan

    7dee7a7bdb291024a81457306cec277c

  4. 部署模板。

    terraform apply

    image.png

    本案例部署时的部分返回日志。

    image

    输入yes即可真正变更资源。

  5. 释放当前模板创建的资源。

    terraform destroy

    imageimage输入yes即可销毁资源。