Skip to content

Commit fc59d9b

Browse files
Atmosphere10shanye997
authored andcommitted
feat: 解决方案basic-highly-available-architecture tf文件完成
1 parent 5a03067 commit fc59d9b

File tree

5 files changed

+409
-0
lines changed

5 files changed

+409
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
## Introduction
2+
<!-- DOCS_DESCRIPTION_CN -->
3+
本示例用于实现解决方案[云上高可用架构](https://www.aliyun.com/solution/tech-solution/hablog),涉及专有网络(VPC)、交换机(VSwitch)、RDS数据库(RDS)、云服务器(ECS)、应用型负载均衡器(ALB) 等资源的部署。
4+
<!-- DOCS_DESCRIPTION_CN -->
5+
6+
<!-- DOCS_DESCRIPTION_EN -->
7+
This example is used to implement solution [Cloud High Availability Architecture](https://www.aliyun.com/solution/tech-solution/hablog), which involves the creation and deployment of resources such as Virtual Private Cloud (Vpc), Virtual Switch (VSwitch), RDS Database (Rds), Elastic Compute Service (Ecs), and Application Load Balancer (Alb).
8+
<!-- DOCS_DESCRIPTION_EN -->
9+
10+
<!-- BEGIN_TF_DOCS -->
11+
## Providers
12+
13+
| Name | Version |
14+
|------|---------|
15+
| <a name="provider_alicloud"></a> [alicloud](#provider\_alicloud) | n/a |
16+
17+
## Modules
18+
19+
No modules.
20+
21+
## Resources
22+
23+
| Name | Type |
24+
|------|------|
25+
| [alicloud_alb_listener.alb_listener](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/alb_listener) | resource |
26+
| [alicloud_alb_load_balancer.alb](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/alb_load_balancer) | resource |
27+
| [alicloud_alb_server_group.alb_server_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/alb_server_group) | resource |
28+
| [alicloud_db_database.rds_database](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/db_database) | resource |
29+
| [alicloud_db_instance.rds_instance](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/db_instance) | resource |
30+
| [alicloud_ecs_command.install_app](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_command) | resource |
31+
| [alicloud_ecs_command.prepare_data](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_command) | resource |
32+
| [alicloud_ecs_invocation.invoke_app](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_invocation) | resource |
33+
| [alicloud_ecs_invocation.invoke_script](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_invocation) | resource |
34+
| [alicloud_instance.ecs_instance1](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/instance) | resource |
35+
| [alicloud_instance.ecs_instance2](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/instance) | resource |
36+
| [alicloud_rds_account.create_db_user](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/rds_account) | resource |
37+
| [alicloud_security_group.security_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group) | resource |
38+
| [alicloud_security_group_rule.security_group_rule1](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
39+
| [alicloud_security_group_rule.security_group_rule2](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
40+
| [alicloud_vpc.vpc](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vpc) | resource |
41+
| [alicloud_vswitch.alb_vswitch3](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
42+
| [alicloud_vswitch.alb_vswitch4](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
43+
| [alicloud_vswitch.ecs_vswitch1](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
44+
| [alicloud_vswitch.ecs_vswitch2](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
45+
| [alicloud_vswitch.rds_vswitch5](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
46+
| [alicloud_alb_zones.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/alb_zones) | data source |
47+
| [alicloud_db_instance_classes.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/db_instance_classes) | data source |
48+
| [alicloud_db_zones.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/db_zones) | data source |
49+
| [alicloud_images.instance_image](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/images) | data source |
50+
| [alicloud_instance_types.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/instance_types) | data source |
51+
| [alicloud_zones.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/zones) | data source |
52+
53+
## Inputs
54+
55+
| Name | Description | Type | Default | Required |
56+
|------|-------------|------|---------|:--------:|
57+
| <a name="input_common_name"></a> [common\_name](#input\_common\_name) | 应用名称 | `string` | `"high-availability"` | no |
58+
| <a name="input_database_name"></a> [database\_name](#input\_database\_name) | 数据名称,由 2 到 32 个小写字母组成,支持小写字母、数字和下划线,以小写字母开头。 | `string` | `"high_availability"` | no |
59+
| <a name="input_db_password"></a> [db\_password](#input\_db\_password) | 数据库账号密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)` | `string` | n/a | yes |
60+
| <a name="input_db_user_name"></a> [db\_user\_name](#input\_db\_user\_name) | 数据库用户名,由 2 到 32 个小写字母组成,支持小写字母、数字和下划线,以小写字母开头。 | `string` | `"high_availability"` | no |
61+
| <a name="input_ecs_instance_password"></a> [ecs\_instance\_password](#input\_ecs\_instance\_password) | 服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)` | `string` | n/a | yes |
62+
| <a name="input_region"></a> [region](#input\_region) | 地域 | `string` | `"cn-hangzhou"` | no |
63+
<!-- END_TF_DOCS -->

solution/tech-solution/hablog/main.tf

Lines changed: 291 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,291 @@
1+
# 查询实例实例规格
2+
data "alicloud_instance_types" "default" {
3+
instance_type_family = "ecs.g7"
4+
}
5+
6+
data "alicloud_zones" "default" {
7+
available_instance_type = data.alicloud_instance_types.default.ids.0
8+
}
9+
10+
data "alicloud_db_zones" "default" {
11+
engine = "MySQL"
12+
engine_version = "8.0"
13+
instance_charge_type = "PostPaid"
14+
category = "Basic"
15+
db_instance_storage_type = "cloud_essd"
16+
}
17+
18+
data "alicloud_db_instance_classes" "default" {
19+
zone_id = data.alicloud_db_zones.default.ids.0
20+
instance_charge_type = "PostPaid"
21+
engine = "MySQL"
22+
engine_version = "8.0"
23+
category = "Basic"
24+
db_instance_storage_type = "cloud_essd"
25+
}
26+
27+
data "alicloud_alb_zones" "default" {}
28+
29+
data "alicloud_images" "instance_image" {
30+
name_regex = "^aliyun_3_9_x64_20G_*"
31+
most_recent = true
32+
owners = "system"
33+
instance_type = data.alicloud_instance_types.default.ids.0
34+
}
35+
36+
resource "alicloud_vpc" "vpc" {
37+
vpc_name = "${var.common_name}-vpc"
38+
cidr_block = "192.168.0.0/16"
39+
}
40+
41+
resource "alicloud_vswitch" "ecs_vswitch1" {
42+
vpc_id = alicloud_vpc.vpc.id
43+
cidr_block = "192.168.1.0/24"
44+
zone_id = data.alicloud_zones.default.ids.0
45+
vswitch_name = "${var.common_name}-vsw"
46+
}
47+
48+
resource "alicloud_vswitch" "ecs_vswitch2" {
49+
vpc_id = alicloud_vpc.vpc.id
50+
cidr_block = "192.168.2.0/24"
51+
zone_id = data.alicloud_zones.default.ids.1
52+
vswitch_name = "${var.common_name}-vsw"
53+
}
54+
55+
resource "alicloud_vswitch" "alb_vswitch3" {
56+
vpc_id = alicloud_vpc.vpc.id
57+
cidr_block = "192.168.3.0/24"
58+
zone_id = data.alicloud_alb_zones.default.ids.0
59+
vswitch_name = "${var.common_name}-vsw"
60+
}
61+
62+
resource "alicloud_vswitch" "alb_vswitch4" {
63+
vpc_id = alicloud_vpc.vpc.id
64+
cidr_block = "192.168.4.0/24"
65+
zone_id = data.alicloud_alb_zones.default.ids.1
66+
vswitch_name = "${var.common_name}-vsw"
67+
}
68+
69+
resource "alicloud_vswitch" "rds_vswitch5" {
70+
vpc_id = alicloud_vpc.vpc.id
71+
cidr_block = "192.168.5.0/24"
72+
zone_id = data.alicloud_db_zones.default.ids.0
73+
vswitch_name = "${var.common_name}-vsw"
74+
}
75+
76+
resource "alicloud_security_group" "security_group" {
77+
security_group_name = "${var.common_name}-sg"
78+
vpc_id = alicloud_vpc.vpc.id
79+
}
80+
81+
resource "alicloud_security_group_rule" "security_group_rule1" {
82+
security_group_id = alicloud_security_group.security_group.id
83+
type = "ingress"
84+
ip_protocol = "tcp"
85+
port_range = "80/80"
86+
cidr_ip = "0.0.0.0/0"
87+
}
88+
89+
resource "alicloud_security_group_rule" "security_group_rule2" {
90+
security_group_id = alicloud_security_group.security_group.id
91+
type = "ingress"
92+
ip_protocol = "tcp"
93+
port_range = "443/443"
94+
cidr_ip = "0.0.0.0/0"
95+
}
96+
97+
resource "alicloud_instance" "ecs_instance1" {
98+
instance_name = "${var.common_name}-ecs-1"
99+
image_id = data.alicloud_images.instance_image.images.0.id
100+
instance_type = data.alicloud_instance_types.default.ids.0
101+
security_groups = [alicloud_security_group.security_group.id]
102+
vswitch_id = alicloud_vswitch.ecs_vswitch1.id
103+
system_disk_category = "cloud_essd"
104+
internet_max_bandwidth_out = 5
105+
password = var.ecs_instance_password
106+
}
107+
108+
resource "alicloud_instance" "ecs_instance2" {
109+
instance_name = "${var.common_name}-ecs-2"
110+
image_id = data.alicloud_images.instance_image.images.0.id
111+
instance_type = data.alicloud_instance_types.default.ids.0
112+
security_groups = [alicloud_security_group.security_group.id]
113+
vswitch_id = alicloud_vswitch.ecs_vswitch2.id
114+
system_disk_category = "cloud_essd"
115+
internet_max_bandwidth_out = 5
116+
password = var.ecs_instance_password
117+
}
118+
119+
resource "alicloud_alb_load_balancer" "alb" {
120+
load_balancer_name = "${var.common_name}-alb"
121+
load_balancer_edition = "Basic"
122+
vpc_id = alicloud_vpc.vpc.id
123+
address_type = "Internet"
124+
address_allocated_mode = "Fixed"
125+
126+
load_balancer_billing_config {
127+
pay_type = "PayAsYouGo"
128+
}
129+
130+
zone_mappings {
131+
zone_id = data.alicloud_alb_zones.default.ids.0
132+
vswitch_id = alicloud_vswitch.alb_vswitch3.id
133+
}
134+
135+
zone_mappings {
136+
zone_id = data.alicloud_alb_zones.default.ids.1
137+
vswitch_id = alicloud_vswitch.alb_vswitch4.id
138+
}
139+
}
140+
141+
resource "alicloud_alb_server_group" "alb_server_group" {
142+
server_group_name = "${var.common_name}-server-group"
143+
vpc_id = alicloud_vpc.vpc.id
144+
protocol = "HTTP"
145+
146+
health_check_config {
147+
health_check_enabled = true
148+
health_check_protocol = "HTTP"
149+
health_check_path = "/"
150+
health_check_codes = ["http_2xx", "http_3xx", "http_4xx"]
151+
health_check_connect_port = 80
152+
}
153+
154+
sticky_session_config {
155+
sticky_session_enabled = false
156+
}
157+
158+
servers {
159+
port = 80
160+
server_type = "Ecs"
161+
server_id = alicloud_instance.ecs_instance1.id
162+
server_ip = alicloud_instance.ecs_instance1.primary_ip_address
163+
weight = 100
164+
}
165+
166+
servers {
167+
port = 80
168+
server_type = "Ecs"
169+
server_id = alicloud_instance.ecs_instance2.id
170+
server_ip = alicloud_instance.ecs_instance2.primary_ip_address
171+
weight = 100
172+
}
173+
}
174+
175+
resource "alicloud_alb_listener" "alb_listener" {
176+
listener_protocol = "HTTP"
177+
listener_port = 80
178+
load_balancer_id = alicloud_alb_load_balancer.alb.id
179+
180+
default_actions {
181+
type = "ForwardGroup"
182+
forward_group_config {
183+
server_group_tuples {
184+
server_group_id = alicloud_alb_server_group.alb_server_group.id
185+
}
186+
}
187+
}
188+
}
189+
190+
resource "alicloud_db_instance" "rds_instance" {
191+
engine = "MySQL"
192+
engine_version = "8.0"
193+
instance_type = data.alicloud_db_instance_classes.default.ids.0
194+
instance_storage = 40
195+
vpc_id = alicloud_vpc.vpc.id
196+
vswitch_id = alicloud_vswitch.rds_vswitch5.id
197+
security_group_ids = [alicloud_security_group.security_group.id]
198+
199+
}
200+
201+
resource "alicloud_db_database" "rds_database" {
202+
count = (alicloud_db_instance.rds_instance.engine == "MySQL" ? 1 : 0)
203+
name = var.database_name
204+
description = "${var.database_name} database"
205+
instance_id = alicloud_db_instance.rds_instance.id
206+
character_set = "utf8mb4"
207+
}
208+
209+
resource "alicloud_rds_account" "create_db_user" {
210+
db_instance_id = alicloud_db_instance.rds_instance.id
211+
account_name = var.db_user_name
212+
account_password = var.db_password
213+
account_type = "Super"
214+
}
215+
216+
locals {
217+
prepare_data_script = <<-SHELL
218+
#!/bin/bash
219+
220+
yum install -y mysql
221+
222+
mkdir -p /data
223+
cat <<"EOF" >> /data/script.sql
224+
-- script.sql
225+
USE ${var.database_name};
226+
CREATE TABLE `todo_list` (
227+
`id` bigint NOT NULL COMMENT 'id',
228+
`title` varchar(128) NOT NULL COMMENT 'title',
229+
`desc` text NOT NULL COMMENT 'description',
230+
`status` varchar(128) NOT NULL COMMENT 'status 未开始、进行中、已完成、已取消',
231+
`priority` varchar(128) NOT NULL COMMENT 'priority 高、中、低',
232+
`expect_time` datetime COMMENT 'expect time',
233+
`actual_completion_time` datetime COMMENT 'actual completion time',
234+
`gmt_created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'create time',
235+
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'modified time',
236+
PRIMARY KEY (`id`)
237+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
238+
;
239+
INSERT INTO todo_list
240+
(id, title, `desc`, `status`, priority, expect_time)
241+
value(1, "创建一个应用", "使用阿里云解决方案搭建一个应用", "进行中", "高", "2024-04-01 00:00:00")
242+
EOF
243+
244+
mysql -h${alicloud_db_instance.rds_instance.connection_string} -u${var.db_user_name} -p${var.db_password} < /data/script.sql
245+
SHELL
246+
247+
install_app_script = <<-SHELL
248+
#!/bin/bash
249+
sudo yum -y install java-1.8.0-openjdk-devel.x86_64
250+
251+
cat <<EOT >> ~/.bash_profile
252+
export APPLETS_RDS_ENDPOINT=${alicloud_db_instance.rds_instance.connection_string}
253+
export APPLETS_RDS_USER=${var.db_user_name}
254+
export APPLETS_RDS_PASSWORD=${var.db_password}
255+
export APPLETS_RDS_DB_NAME=${var.database_name}
256+
export APP_MANUAL_DEPLOY=false
257+
EOT
258+
source ~/.bash_profile
259+
wget https://help-static-aliyun-doc.aliyuncs.com/tech-solution/cloud-demo-0.0.2.jar
260+
nohup java -jar cloud-demo-0.0.2.jar > demo.log 2>&1 &
261+
SHELL
262+
}
263+
264+
resource "alicloud_ecs_command" "prepare_data" {
265+
depends_on = [alicloud_db_database.rds_database, alicloud_rds_account.create_db_user]
266+
name = "tf-PrepareData"
267+
command_content = base64encode(local.prepare_data_script)
268+
description = "create tables"
269+
type = "RunShellScript"
270+
working_dir = "/root"
271+
}
272+
273+
resource "alicloud_ecs_invocation" "invoke_script" {
274+
instance_id = [alicloud_instance.ecs_instance1.id]
275+
command_id = alicloud_ecs_command.prepare_data.id
276+
}
277+
278+
279+
resource "alicloud_ecs_command" "install_app" {
280+
depends_on = [alicloud_ecs_invocation.invoke_script]
281+
name = "tf-testAcc"
282+
command_content = base64encode(local.install_app_script)
283+
description = "Install App"
284+
type = "RunShellScript"
285+
working_dir = "/root"
286+
}
287+
288+
resource "alicloud_ecs_invocation" "invoke_app" {
289+
instance_id = [alicloud_instance.ecs_instance1.id, alicloud_instance.ecs_instance2.id]
290+
command_id = alicloud_ecs_command.install_app.id
291+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
output "WebUrl" {
2+
description = <<EOT
3+
{
4+
"zh-cn": "Web 访问地址。",
5+
"en": "The Addresses of Web."
6+
}
7+
EOT
8+
value = format("http://%s", alicloud_alb_load_balancer.alb.dns_name)
9+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
provider "alicloud" {
2+
region = var.region
3+
}

0 commit comments

Comments
 (0)