1
+ provider "alicloud" {
2
+ region = var. region_id
3
+ }
4
+
5
+ resource "random_id" "suffix" {
6
+ byte_length = 8
7
+ }
8
+
9
+ locals {
10
+ zone_id_1 = data. alicloud_db_zones . rds_zones . zones [length (data. alicloud_db_zones . rds_zones . zones ) - 1 ]. id
11
+ zone_id_2 = data. alicloud_db_zones . rds_zones . zones [length (data. alicloud_db_zones . rds_zones . zones ) - 2 ]. id
12
+ common_name = random_id. suffix . id
13
+ install_script = << SCRIPT
14
+ #!/bin/sh
15
+ export ROS_DEPLOY=true
16
+ curl -fsSL https://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/install-script/read-write-splitting-for-databases/install.sh | bash
17
+
18
+ SCRIPT
19
+ }
20
+
21
+ data "alicloud_db_zones" "rds_zones" {
22
+ engine = " MySQL"
23
+ engine_version = " 8.0"
24
+ instance_charge_type = " PostPaid"
25
+ category = " HighAvailability"
26
+ db_instance_storage_type = " cloud_essd"
27
+
28
+ }
29
+ data "alicloud_db_instance_classes" "example" {
30
+ zone_id = local. zone_id_1
31
+ engine = data. alicloud_db_zones . rds_zones . engine
32
+ engine_version = data. alicloud_db_zones . rds_zones . engine_version
33
+ category = data. alicloud_db_zones . rds_zones . category
34
+ db_instance_storage_type = data. alicloud_db_zones . rds_zones . db_instance_storage_type
35
+ instance_charge_type = data. alicloud_db_zones . rds_zones . instance_charge_type
36
+ }
37
+
38
+ data "alicloud_instance_types" "default" {
39
+ cpu_core_count = 4
40
+ system_disk_category = " cloud_essd"
41
+ image_id = data. alicloud_images . default . images [0 ]. id
42
+ instance_type_family = " ecs.c6"
43
+ availability_zone = local. zone_id_1
44
+ }
45
+
46
+ data "alicloud_images" "default" {
47
+ name_regex = " ^aliyun_3_x64_20G_alibase_*"
48
+ most_recent = true
49
+ owners = " system"
50
+ }
51
+
52
+ # VPC Resources
53
+ resource "alicloud_vpc" "vpc" {
54
+ vpc_name = " vpc"
55
+ cidr_block = var. vpc_cidr_block
56
+ }
57
+
58
+ # VSwitch Resources
59
+ resource "alicloud_vswitch" "vswitch1" {
60
+ vpc_id = alicloud_vpc. vpc . id
61
+ cidr_block = var. vswitch1_cidr_block
62
+ zone_id = local. zone_id_1
63
+ vswitch_name = " vsw_001"
64
+ }
65
+
66
+ resource "alicloud_vswitch" "vswitch2" {
67
+ vpc_id = alicloud_vpc. vpc . id
68
+ cidr_block = var. vswitch2_cidr_block
69
+ zone_id = local. zone_id_2
70
+ vswitch_name = " vsw_002"
71
+ }
72
+
73
+ # Security Group
74
+ resource "alicloud_security_group" "security_group" {
75
+ vpc_id = alicloud_vpc. vpc . id
76
+ security_group_name = " sg"
77
+ security_group_type = " normal"
78
+ }
79
+
80
+ resource "alicloud_security_group_rule" "allow_http" {
81
+ type = " ingress"
82
+ ip_protocol = " tcp"
83
+ port_range = " 80/80"
84
+ cidr_ip = " 140.205.11.1/25"
85
+ security_group_id = alicloud_security_group. security_group . id
86
+ }
87
+
88
+ # ECS Resources
89
+ resource "alicloud_instance" "ecs_instance" {
90
+ instance_name = " ecs-${ local . common_name } "
91
+ system_disk_category = data. alicloud_instance_types . default . system_disk_category
92
+ system_disk_size = 40
93
+ image_id = data. alicloud_images . default . images [0 ]. id
94
+ vswitch_id = alicloud_vswitch. vswitch1 . id
95
+ password = var. ecs_instance_password
96
+ instance_type = data. alicloud_instance_types . default . instance_types [0 ]. id
97
+ internet_max_bandwidth_out = 5
98
+ security_groups = [alicloud_security_group . security_group . id ]
99
+ }
100
+
101
+ # RDS Resources
102
+ resource "alicloud_db_instance" "database" {
103
+ engine = data. alicloud_db_instance_classes . example . engine
104
+ engine_version = data. alicloud_db_instance_classes . example . engine_version
105
+ instance_type = data. alicloud_db_instance_classes . example . instance_classes [0 ]. instance_class
106
+ instance_storage = data. alicloud_db_instance_classes . example . instance_classes [0 ]. storage_range . min
107
+ instance_name = " rds-${ local . common_name } "
108
+ vswitch_id = alicloud_vswitch. vswitch1 . id
109
+ monitoring_period = 60
110
+ zone_id = local. zone_id_1
111
+ zone_id_slave_a = local. zone_id_2
112
+ category = data. alicloud_db_instance_classes . example . category
113
+ security_group_ids = [alicloud_security_group . security_group . id ]
114
+ }
115
+
116
+ resource "alicloud_db_database" "rds_database" {
117
+ instance_id = alicloud_db_instance. database . id
118
+ name = var. db_name
119
+ character_set = " utf8"
120
+ }
121
+
122
+ resource "alicloud_db_account" "db_account" {
123
+ db_instance_id = alicloud_db_instance. database . id
124
+ account_name = var. db_user_name
125
+ account_password = var. db_password
126
+ account_type = " Normal"
127
+ }
128
+
129
+ resource "alicloud_db_account_privilege" "account_privilege" {
130
+ instance_id = alicloud_db_instance. database . id
131
+ account_name = alicloud_db_account. db_account . account_name
132
+ privilege = " ReadWrite"
133
+ db_names = [alicloud_db_database . rds_database . name ]
134
+ depends_on = [alicloud_db_database . rds_database ]
135
+ }
136
+
137
+ # RDS DB Proxy
138
+ resource "alicloud_rds_db_proxy" "db_proxy" {
139
+ instance_id = alicloud_db_instance. database . id
140
+ db_proxy_instance_type = " common"
141
+ vpc_id = alicloud_vpc. vpc . id
142
+ vswitch_id = alicloud_vswitch. vswitch1 . id
143
+ db_proxy_features = " ReadWriteSplitting"
144
+ instance_network_type = " VPC"
145
+ db_proxy_instance_num = 2
146
+ depends_on = [alicloud_db_account_privilege . account_privilege ]
147
+ }
148
+
149
+ resource "alicloud_db_readonly_instance" "readonly_instance" {
150
+ master_db_instance_id = alicloud_db_instance. database . id
151
+ zone_id = local. zone_id_2
152
+ vswitch_id = alicloud_vswitch. vswitch2 . id
153
+ instance_type = " mysqlro.n2.medium.1c"
154
+ instance_storage = alicloud_db_instance. database . instance_storage
155
+ instance_name = " readonly-${ local . common_name } "
156
+ engine_version = alicloud_db_instance. database . engine_version
157
+ depends_on = [alicloud_rds_db_proxy . db_proxy ]
158
+ }
159
+
160
+ # ECS Command
161
+ resource "alicloud_ecs_command" "install_script" {
162
+ name = " install-${ local . common_name } "
163
+ command_content = base64encode (local. install_script )
164
+ description = " Install read-write splitting application"
165
+ type = " RunShellScript"
166
+ working_dir = " /root"
167
+ timeout = 3600
168
+ }
169
+
170
+ resource "alicloud_ecs_invocation" "run_install" {
171
+ command_id = alicloud_ecs_command. install_script . id
172
+ instance_id = [alicloud_instance . ecs_instance . id ]
173
+ depends_on = [alicloud_db_readonly_instance . readonly_instance ]
174
+ timeouts {
175
+ create = " 15m"
176
+ }
177
+ }
0 commit comments