Terraform集成示例
本文為您演示如何通過(guò)Terraform創(chuàng)建云數(shù)據(jù)庫(kù) MongoDB 版實(shí)例。
如果您還不了解Terraform,請(qǐng)參見(jiàn)文檔什么是Terraform。關(guān)于支持的MongoDB資源類型,請(qǐng)參見(jiàn)集成概覽或直接通過(guò)Terraform文檔查找。
資源架構(gòu)
在指定地域創(chuàng)建一個(gè)VPC網(wǎng)絡(luò)和一臺(tái)交換機(jī),然后創(chuàng)建一個(gè)MongoDB副本集實(shí)例。
操作步驟
安裝Terraform
您如果想要在本地安裝和配置Terraform,請(qǐng)參見(jiàn)在本地安裝和配置Terraform。
安裝完成后,您可以打開命令行終端,輸入
terraform version
,看到返回版本信息表示已成功安裝。如果您不想安裝Terraform,可以使用阿里云提供的在線服務(wù)Cloud Shell,其中內(nèi)置了Terraform的運(yùn)行環(huán)境。
配置權(quán)限
執(zhí)行Terraform模板需要RAM用戶權(quán)限,我們需要?jiǎng)?chuàng)建一個(gè)RAM用戶,并獲取AccessKey,添加權(quán)限策略。示例Terraform模板會(huì)創(chuàng)建VPC、虛擬交換機(jī)以及MongoDB實(shí)例,您需要為RAM用戶添加以下權(quán)限:
AliyunVPCFullAccess:管理專有網(wǎng)絡(luò) VPC的權(quán)限。
AliyunMongoDBFullAccess:管理云數(shù)據(jù)庫(kù) MongoDB 版的權(quán)限。
編寫模板
創(chuàng)建一個(gè)名為main.tf
文件,根據(jù)需求選擇填入以下內(nèi)容。
單節(jié)點(diǎn)
# 引入 alicloud provider
provider "alicloud" {}
# 聲明變量名: name
variable "name" {
default = "terraform-example"
}
# 查詢可用區(qū)信息: alicloud_mongodb_zones
data "alicloud_mongodb_zones" "default" {
}
# 聲明本地值, zone_id 取 alicloud_mongodb_zones 中的最后一個(gè)可用區(qū)
locals {
index = length(data.alicloud_mongodb_zones.default.zones) - 1
zone_id = data.alicloud_mongodb_zones.default.zones[local.index].id
}
# 創(chuàng)建 alicloud_vpc 資源
resource "alicloud_vpc" "default" {
vpc_name = var.name
description = var.name
cidr_block = "172.17.3.0/24"
}
# 在 local.zone_id 地區(qū)創(chuàng)建 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信息創(chuàng)建單節(jié)點(diǎn)資源
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"
}
}
關(guān)于alicloud_mongodb_instance
資源類型的配置信息,請(qǐng)參見(jiàn)資源詳情。
副本集
# 引入 alicloud provider
provider "alicloud" {}
# 聲明變量名: name
variable "name" {
default = "terraform-example"
}
# 查詢可用區(qū)信息: alicloud_mongodb_zones
data "alicloud_mongodb_zones" "default" {
}
# 聲明本地值, zone_id 取 alicloud_mongodb_zones 中的最后一個(gè)可用區(qū)
locals {
index = length(data.alicloud_mongodb_zones.default.zones) - 1
zone_id = data.alicloud_mongodb_zones.default.zones[local.index].id
}
# 創(chuàng)建 alicloud_vpc 資源
resource "alicloud_vpc" "default" {
vpc_name = var.name
description = var.name
cidr_block = "172.17.3.0/24"
}
# 在 local.zone_id 地區(qū)創(chuàng)建 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信息創(chuàng)建副本集資源
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"
}
}
關(guān)于alicloud_mongodb_instance
資源類型的配置信息,請(qǐng)參見(jiàn)資源詳情。
分片集群
# 引入 alicloud provider
provider "alicloud" {}
# 聲明變量名: name
variable "name" {
default = "terraform-example"
}
# 查詢可用區(qū)信息: alicloud_mongodb_zones
data "alicloud_mongodb_zones" "default" {
}
# 聲明本地值, zone_id 取 alicloud_mongodb_zones 中的最后一個(gè)可用區(qū)
locals {
index = length(data.alicloud_mongodb_zones.default.zones) - 1
zone_id = data.alicloud_mongodb_zones.default.zones[local.index].id
}
# 創(chuàng)建 alicloud_vpc 資源
resource "alicloud_vpc" "default" {
vpc_name = var.name
description = var.name
cidr_block = "172.17.3.0/24"
}
# 在 local.zone_id 地區(qū)創(chuàng)建 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信息創(chuàng)建分片集群資源
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"
}
}
關(guān)于alicloud_mongodb_sharding_instance
資源類型的配置信息,請(qǐng)參見(jiàn)資源詳情。
如果您在運(yùn)行模板的時(shí)候遇到參數(shù)不存在的報(bào)錯(cuò),可以執(zhí)行terraform version
命令確認(rèn)當(dāng)前版本與官網(wǎng)版本是否一致,如果不是最新版本,您需要在main.tf
文件中的provider "alicloud" {}
內(nèi)指定版本,格式如下:
provider "alicloud" {version = "~> v*.***.*"}
實(shí)際使用時(shí)請(qǐng)將v*.***.*
替換為最新版本號(hào)。
運(yùn)行模板
初始化加載模塊,包括Provider,Provisioner,Module等模板。
terraform init
驗(yàn)證模板語(yǔ)法是否正確。
terraform validate
創(chuàng)建執(zhí)行計(jì)劃。
terraform plan
部署模板。
terraform apply
本案例部署時(shí)的部分返回日志。
輸入yes即可真正變更資源。
釋放當(dāng)前模板創(chuàng)建的資源。
terraform destroy
輸入yes即可銷毀資源。