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