Skip to content

Commit 9de7932

Browse files
wbw2048shanye997
authored andcommitted
docs:自建 MongoDB 迁移到云数据库的terraform模板
1 parent 4b2abbd commit 9de7932

File tree

4 files changed

+256
-0
lines changed

4 files changed

+256
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<!-- DOCS_DESCRIPTION_CN -->
2+
本示例用于实现解决方案[自建 MongoDB 迁移到云数据库](https://www.aliyun.com/solution/tech-solution/migrate-self-managed-mongodb-to-cloud), 涉及到专有网络(VPC)、交换机(VSwitch)、云服务器(ECS)、云数据库(MongoDB) 等资源的创建。
3+
<!-- DOCS_DESCRIPTION_CN -->
4+
5+
<!-- DOCS_DESCRIPTION_EN -->
6+
This example demonstrates the implementation of the solution [Migrate self-managed mongodb to cloud](https://www.aliyun.com/solution/tech-solution/migrate-self-managed-mongodb-to-cloud). It involves the creation, and deployment of resources such as Virtual Private Cloud (VPC), VSwitch, Elastic Compute Service (ECS), and ApsaraDB for MongoDB.
7+
<!-- DOCS_DESCRIPTION_EN -->
8+
9+
<!-- BEGIN_TF_DOCS -->
10+
## Providers
11+
12+
| Name | Version |
13+
|------|---------|
14+
| <a name="provider_alicloud"></a> [alicloud](#provider\_alicloud) | 1.253.0 |
15+
| <a name="provider_random"></a> [random](#provider\_random) | 3.7.2 |
16+
17+
## Modules
18+
19+
No modules.
20+
21+
## Resources
22+
23+
| Name | Type |
24+
|------|------|
25+
| [alicloud_ecs_command.run_command](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_command) | resource |
26+
| [alicloud_ecs_invocation.install_mongodb](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_invocation) | resource |
27+
| [alicloud_instance.mongodb_server](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/instance) | resource |
28+
| [alicloud_mongodb_instance.mongodb](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/mongodb_instance) | resource |
29+
| [alicloud_security_group.security_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group) | resource |
30+
| [alicloud_security_group_rule.http](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
31+
| [alicloud_security_group_rule.mongodb_egress](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
32+
| [alicloud_security_group_rule.mongodb_ingress](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
33+
| [alicloud_security_group_rule.rdp](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
34+
| [alicloud_vpc.vpc](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vpc) | resource |
35+
| [alicloud_vswitch.vswitch](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
36+
| [random_id.suffix](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/id) | resource |
37+
| [alicloud_images.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/images) | data source |
38+
| [alicloud_instance_types.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/instance_types) | data source |
39+
| [alicloud_mongodb_zones.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/mongodb_zones) | data source |
40+
41+
## Inputs
42+
43+
| Name | Description | Type | Default | Required |
44+
|------|-------------|------|---------|:--------:|
45+
| <a name="input_db_name"></a> [db\_name](#input\_db\_name) | 请输入自建MongoDB数据库名称(由小写字母、数字及特殊字符 -\_ 组成,以小写字母开头,小写字母或数字结尾,最多64个字符)。 | `string` | `"mongodb_transfer_test"` | no |
46+
| <a name="input_db_password"></a> [db\_password](#input\_db\_password) | 请输入自建MongoDB数据库密码。密码长度为8-32位,需包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*()\_+-=)。 | `string` | n/a | yes |
47+
| <a name="input_db_user_name"></a> [db\_user\_name](#input\_db\_user\_name) | 请输入自建MongoDB数据库账号(长度为2-16个字符,仅允许小写字母、大写字母、数字和下划线,必须以字母开头,以字母或数字结尾)。 | `string` | n/a | yes |
48+
| <a name="input_ecs_instance_password"></a> [ecs\_instance\_password](#input\_ecs\_instance\_password) | 请输入服务器登录密码。密码长度为8-30位,必须包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*\_-+=\|{}[]:;'<>,.?/)。 | `string` | n/a | yes |
49+
| <a name="input_mongodb_account_password"></a> [mongodb\_account\_password](#input\_mongodb\_account\_password) | 请输入MongoDB Root密码。密码长度为6-32位,需包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*()\_+-=)。 | `string` | n/a | yes |
50+
| <a name="input_mongodb_instance_class"></a> [mongodb\_instance\_class](#input\_mongodb\_instance\_class) | 请输入MongoDB实例规格(例如:mdb.shard.2x.xlarge.d)。根据您的数据库负载选择合适的规格。 | `string` | `"mdb.shard.2x.xlarge.d"` | no |
51+
| <a name="input_region_id"></a> [region\_id](#input\_region\_id) | 请输入地域ID(例如:cn-hangzhou)。 | `string` | `"cn-hangzhou"` | no |
52+
<!-- END_TF_DOCS -->
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
provider "alicloud" {
2+
region = var.region_id
3+
}
4+
5+
resource "random_id" "suffix" {
6+
byte_length = 8
7+
}
8+
data "alicloud_mongodb_zones" "default" {
9+
}
10+
11+
data "alicloud_instance_types" "default" {
12+
system_disk_category = "cloud_essd"
13+
image_id = data.alicloud_images.default.images[0].id
14+
instance_type_family = "ecs.c6"
15+
availability_zone = data.alicloud_mongodb_zones.default.zones[length(data.alicloud_mongodb_zones.default.zones) - 1].id
16+
}
17+
18+
data "alicloud_images" "default" {
19+
name_regex = "^aliyun_3_x64_20G_alibase_*"
20+
most_recent = true
21+
owners = "system"
22+
}
23+
24+
locals {
25+
common_name = random_id.suffix.id
26+
ecs_command = <<SHELL
27+
#!/bin/bash
28+
cat << INNER_EOF >> ~/.bash_profile
29+
export DB_NAME=${var.db_name}
30+
export DB_USERNAME=${var.db_user_name}
31+
export DB_PASSWORD=${var.db_password}
32+
export ROS_DEPLOY=true
33+
INNER_EOF
34+
35+
source ~/.bash_profile
36+
37+
curl -fsSL https://help-static-aliyun-doc.aliyuncs.com/install-script/ecs-mongo-to-cloud/install_init.sh|bash
38+
SHELL
39+
}
40+
41+
# VPC Resources
42+
resource "alicloud_vpc" "vpc" {
43+
vpc_name = "VPC_HZ"
44+
cidr_block = "192.168.0.0/16"
45+
}
46+
47+
resource "alicloud_vswitch" "vswitch" {
48+
vpc_id = alicloud_vpc.vpc.id
49+
cidr_block = "192.168.1.0/24"
50+
zone_id = data.alicloud_mongodb_zones.default.zones[length(data.alicloud_mongodb_zones.default.zones) - 1].id
51+
vswitch_name = "vsw_001"
52+
}
53+
54+
# Security Group
55+
resource "alicloud_security_group" "security_group" {
56+
vpc_id = alicloud_vpc.vpc.id
57+
security_group_name = "sg-mongodb-${local.common_name}"
58+
security_group_type = "normal"
59+
}
60+
61+
# Security Group Rules
62+
resource "alicloud_security_group_rule" "http" {
63+
type = "ingress"
64+
ip_protocol = "tcp"
65+
port_range = "80/80"
66+
cidr_ip = "0.0.0.0/0"
67+
security_group_id = alicloud_security_group.security_group.id
68+
}
69+
70+
resource "alicloud_security_group_rule" "rdp" {
71+
type = "ingress"
72+
ip_protocol = "tcp"
73+
port_range = "3389/3389"
74+
cidr_ip = "0.0.0.0/0"
75+
security_group_id = alicloud_security_group.security_group.id
76+
}
77+
78+
resource "alicloud_security_group_rule" "mongodb_ingress" {
79+
type = "ingress"
80+
ip_protocol = "tcp"
81+
port_range = "27017/27017"
82+
cidr_ip = "0.0.0.0/0"
83+
security_group_id = alicloud_security_group.security_group.id
84+
}
85+
86+
resource "alicloud_security_group_rule" "mongodb_egress" {
87+
type = "egress"
88+
ip_protocol = "tcp"
89+
port_range = "27017/27017"
90+
cidr_ip = "0.0.0.0/0"
91+
security_group_id = alicloud_security_group.security_group.id
92+
}
93+
94+
# MongoDB Resources
95+
resource "alicloud_mongodb_instance" "mongodb" {
96+
engine_version = "8.0"
97+
db_instance_class = var.mongodb_instance_class
98+
db_instance_storage = 20
99+
name = "mongodb_test"
100+
account_password = var.mongodb_password
101+
security_ip_list = ["192.168.1.0/24"]
102+
vpc_id = alicloud_vpc.vpc.id
103+
vswitch_id = alicloud_vswitch.vswitch.id
104+
storage_engine = "WiredTiger"
105+
storage_type = "cloud_essd1"
106+
}
107+
108+
# ECS Resources
109+
resource "alicloud_instance" "mongodb_server" {
110+
instance_name = "mongodb-server-${local.common_name}"
111+
system_disk_category = data.alicloud_instance_types.default.system_disk_category
112+
image_id = data.alicloud_images.default.images[0].id
113+
vswitch_id = alicloud_vswitch.vswitch.id
114+
password = var.ecs_instance_password
115+
instance_type = data.alicloud_instance_types.default.instance_types[0].id
116+
internet_max_bandwidth_out = 5
117+
security_groups = [alicloud_security_group.security_group.id]
118+
}
119+
120+
resource "alicloud_ecs_command" "run_command" {
121+
name = "install-mongodb-${local.common_name}"
122+
description = "install_mongodb_${local.common_name}_description"
123+
enable_parameter = false
124+
type = "RunShellScript"
125+
command_content = base64encode(local.ecs_command)
126+
timeout = 3600
127+
working_dir = "/root"
128+
}
129+
130+
resource "alicloud_ecs_invocation" "install_mongodb" {
131+
instance_id = [alicloud_instance.mongodb_server.id]
132+
command_id = alicloud_ecs_command.run_command.id
133+
depends_on = [alicloud_mongodb_instance.mongodb, alicloud_instance.mongodb_server]
134+
timeouts {
135+
create = "10m"
136+
}
137+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Outputs
2+
output "mongodb_inner_connection_string" {
3+
description = "MongoDB内网连接地址"
4+
value = "mongodb://root:${var.mongodb_password}@${alicloud_mongodb_instance.mongodb.replica_sets[0].connection_domain}:27017/${var.db_name}"
5+
sensitive = true
6+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Parameters
2+
variable "region_id" {
3+
description = "请输入地域ID(例如:cn-hangzhou)。"
4+
default = "cn-hangzhou"
5+
}
6+
7+
variable "ecs_instance_password" {
8+
description = "请输入服务器登录密码。密码长度为8-30位,必须包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*_-+=|{}[]:;'<>,.?/)。"
9+
type = string
10+
sensitive = true
11+
validation {
12+
condition = length(var.ecs_instance_password) >= 8 && length(var.ecs_instance_password) <= 30 && can(regex("^[0-9A-Za-z\\_\\-\\&:;'<>,=%`~!@#\\(\\)\\$\\^\\*\\+\\|\\{\\}\\[\\]\\.\\?\\/]+$", var.ecs_instance_password))
13+
error_message = "密码长度必须在8-30个字符之间,只能包含英文字母、数字和特殊字符!@#$%^&*()_+-=|{}[]:;'<>,.?/~`%=。"
14+
}
15+
}
16+
17+
variable "db_name" {
18+
description = "请输入自建MongoDB数据库名称(由小写字母、数字及特殊字符 -_ 组成,以小写字母开头,小写字母或数字结尾,最多64个字符)。"
19+
type = string
20+
default = "mongodb_transfer_test"
21+
validation {
22+
condition = can(regex("^([a-z][a-z0-9_-]{0,62}[a-z0-9])$", var.db_name)) && !contains(["admin", "config", "local", "test"], var.db_name)
23+
error_message = "数据库名称格式不正确。名称应由小写字母、数字及特殊字符 -_ 组成,以小写字母开头,小写字母或数字结尾,最多64个字符,且不能为admin、config、local、test。"
24+
}
25+
}
26+
27+
variable "db_user_name" {
28+
description = "请输入自建MongoDB数据库账号(长度为2-16个字符,仅允许小写字母、大写字母、数字和下划线,必须以字母开头,以字母或数字结尾)。"
29+
type = string
30+
default = "mongouser"
31+
validation {
32+
condition = length(var.db_user_name) >= 2 && length(var.db_user_name) <= 16 && can(regex("^[a-zA-Z][a-zA-Z0-9_]*[a-zA-Z0-9]$", var.db_user_name))
33+
error_message = "用户名格式不正确。用户名应由字母、数字和下划线组成,必须以字母开头,以字母或数字结尾,长度为2-16个字符。"
34+
}
35+
}
36+
37+
variable "db_password" {
38+
description = "请输入自建MongoDB数据库密码。密码长度为8-32位,需包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*()_+-=)。"
39+
type = string
40+
sensitive = true
41+
validation {
42+
condition = length(var.db_password) >= 8 && length(var.db_password) <= 32 && can(regex("^[0-9A-Za-z\\_\\-\\&:;'<>,=%`~!@#\\(\\)\\$\\^\\*\\+\\|\\{\\}\\[\\]\\.\\?\\/]+$", var.db_password))
43+
error_message = "密码长度必须在8-32个字符之间,只能包含英文字母、数字和特殊字符!@#$%^&*()_+-=|{}[]:;'<>,.?/~`%=。"
44+
}
45+
}
46+
47+
variable "mongodb_instance_class" {
48+
description = "请输入MongoDB实例规格(例如:mdb.shard.2x.xlarge.d)。根据您的数据库负载选择合适的规格。"
49+
type = string
50+
default = "mdb.shard.2x.xlarge.d"
51+
}
52+
53+
variable "mongodb_password" {
54+
description = "请输入MongoDB Root密码。密码长度为6-32位,需包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*()_+-=)。"
55+
type = string
56+
sensitive = true
57+
validation {
58+
condition = length(var.mongodb_password) >= 6 && length(var.mongodb_password) <= 32 && can(regex("^[0-9A-Za-z\\_\\-\\&:;'<>,=%`~!@#\\(\\)\\$\\^\\*\\+\\|\\{\\}\\[\\]\\.\\?\\/]+$", var.mongodb_password))
59+
error_message = "MongoDB Root密码长度必须在6-32个字符之间,只能包含英文字母、数字和特殊字符!@#$%^&*()_+-=|{}[]:;'<>,.?/~`%=。"
60+
}
61+
}

0 commit comments

Comments
 (0)