Skip to content

Commit fd3d89c

Browse files
author
shaobolin
committed
feat: 解决方案speeding-up-app-based-on-caching tf文件完成
1 parent 5ab7b50 commit fd3d89c

File tree

5 files changed

+392
-0
lines changed

5 files changed

+392
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
## Introduction
2+
<!-- DOCS_DESCRIPTION_CN -->
3+
本示例用于实现解决方案[自建数据库迁移到云数据库](https://www.aliyun.com/solution/tech-solution/redis-cache-speedup), 涉及到专有网络(VPC)、交换机(VSwitch)、云服务器(ECS)、云数据库(RDS)MySQL版、云数据库 Tair(兼容 Redis)等资源的部署。
4+
<!-- DOCS_DESCRIPTION_CN -->
5+
6+
<!-- DOCS_DESCRIPTION_EN -->
7+
This example is used to implement solution [Migrate Self-Built Database to Cloud Database](https://www.aliyun.com/solution/tech-solution/redis-cache-speedup), which involves the creation and deployment of resources such as Virtual Private Cloud (VPC), VSwitch, Elastic Compute Service (ECS), ApsaraDB RDS, Tair (Redis OSS-compatible).
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+
| <a name="provider_random"></a> [random](#provider\_random) | n/a |
17+
18+
## Modules
19+
20+
No modules.
21+
22+
## Resources
23+
24+
| Name | Type |
25+
|------|------|
26+
| [alicloud_db_database.rds_database](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/db_database) | resource |
27+
| [alicloud_db_instance.rds_instance](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/db_instance) | resource |
28+
| [alicloud_ecs_command.install_web_command](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_command) | resource |
29+
| [alicloud_ecs_invocation.install_web_invocation](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_invocation) | resource |
30+
| [alicloud_instance.ecs_instance](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/instance) | resource |
31+
| [alicloud_kvstore_account.redis_account](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/kvstore_account) | resource |
32+
| [alicloud_kvstore_instance.redis_instance](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/kvstore_instance) | resource |
33+
| [alicloud_rds_account.rds_account](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/rds_account) | resource |
34+
| [alicloud_security_group.security_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group) | resource |
35+
| [alicloud_security_group_rule.security_group_rule_http](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
36+
| [alicloud_security_group_rule.security_group_rule_https](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
37+
| [alicloud_security_group_rule.security_group_rule_mysql](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
38+
| [alicloud_security_group_rule.security_group_rule_ssh](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
39+
| [alicloud_vpc.vpc](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vpc) | resource |
40+
| [alicloud_vswitch.vswitch](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
41+
| [random_id.suffix](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/id) | resource |
42+
| [alicloud_db_instance_classes.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/db_instance_classes) | data source |
43+
| [alicloud_images.ecs_image](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/images) | data source |
44+
| [alicloud_instance_types.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/instance_types) | data source |
45+
| [alicloud_kvstore_zones.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/kvstore_zones) | data source |
46+
| [alicloud_regions.current](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/regions) | data source |
47+
48+
## Inputs
49+
50+
| Name | Description | Type | Default | Required |
51+
|------|-------------|------|---------|:--------:|
52+
| <a name="input_db_password"></a> [db\_password](#input\_db\_password) | RDS数据库密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 !@#$%^&*()\_+-= 中的特殊符号)。 | `string` | n/a | yes |
53+
| <a name="input_db_user_name"></a> [db\_user\_name](#input\_db\_user\_name) | RDS数据库账号,由 2 到 32 个小写字母组成,支持小写字母、数字和下划线,以小写字母开头。 | `string` | `"rds"` | no |
54+
| <a name="input_ecs_instance_password"></a> [ecs\_instance\_password](#input\_ecs\_instance\_password) | 实例密码,服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)。` | `string` | n/a | yes |
55+
| <a name="input_redis_account_name"></a> [redis\_account\_name](#input\_redis\_account\_name) | Redis数据库账号,由 2 到 32 个小写字母组成,支持小写字母、数字和下划线,以小写字母开头。 | `string` | `"redis"` | no |
56+
| <a name="input_redis_account_password"></a> [redis\_account\_password](#input\_redis\_account\_password) | Redis数据库密码,数据库账号密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)。` | `string` | n/a | yes |
57+
| <a name="input_region"></a> [region](#input\_region) | 地域 | `string` | `"cn-hangzhou"` | no |
58+
<!-- END_TF_DOCS -->
Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
2+
locals {
3+
zone_id = data.alicloud_kvstore_zones.default.ids[length(data.alicloud_kvstore_zones.default.ids) - 1]
4+
}
5+
6+
data "alicloud_kvstore_zones" "default" {
7+
instance_charge_type = "PostPaid"
8+
engine = "Redis"
9+
product_type = "OnECS"
10+
}
11+
12+
data "alicloud_db_instance_classes" "default" {
13+
zone_id = local.zone_id
14+
engine = "MySQL"
15+
engine_version = "8.0"
16+
category = "Basic"
17+
db_instance_storage_type = "cloud_essd"
18+
instance_charge_type = "PostPaid"
19+
}
20+
21+
# Declare the data source
22+
data "alicloud_instance_types" "default" {
23+
availability_zone = local.zone_id
24+
instance_type_family = "ecs.c7"
25+
}
26+
27+
resource "random_id" "suffix" {
28+
byte_length = 4
29+
}
30+
locals {
31+
common_name = "cache-${random_id.suffix.hex}"
32+
}
33+
# VPC 网络资源
34+
resource "alicloud_vpc" "vpc" {
35+
vpc_name = "${local.common_name}-vpc"
36+
cidr_block = "192.168.0.0/16"
37+
}
38+
39+
resource "alicloud_vswitch" "vswitch" {
40+
vpc_id = alicloud_vpc.vpc.id
41+
cidr_block = "192.168.0.0/24"
42+
zone_id = local.zone_id
43+
vswitch_name = "${local.common_name}-vsw"
44+
}
45+
46+
# 安全组
47+
resource "alicloud_security_group" "security_group" {
48+
security_group_name = "${local.common_name}-sg"
49+
vpc_id = alicloud_vpc.vpc.id
50+
}
51+
52+
resource "alicloud_security_group_rule" "security_group_rule_ssh" {
53+
security_group_id = alicloud_security_group.security_group.id
54+
type = "ingress"
55+
ip_protocol = "tcp"
56+
port_range = "22/22"
57+
cidr_ip = "0.0.0.0/0"
58+
}
59+
60+
resource "alicloud_security_group_rule" "security_group_rule_http" {
61+
security_group_id = alicloud_security_group.security_group.id
62+
type = "ingress"
63+
ip_protocol = "tcp"
64+
port_range = "80/80"
65+
cidr_ip = "0.0.0.0/0"
66+
}
67+
68+
resource "alicloud_security_group_rule" "security_group_rule_https" {
69+
security_group_id = alicloud_security_group.security_group.id
70+
type = "ingress"
71+
ip_protocol = "tcp"
72+
port_range = "443/443"
73+
cidr_ip = "0.0.0.0/0"
74+
}
75+
76+
resource "alicloud_security_group_rule" "security_group_rule_mysql" {
77+
security_group_id = alicloud_security_group.security_group.id
78+
type = "ingress"
79+
ip_protocol = "tcp"
80+
port_range = "3306/3306"
81+
cidr_ip = "0.0.0.0/0"
82+
}
83+
84+
# 镜像数据源
85+
data "alicloud_images" "ecs_image" {
86+
name_regex = "^aliyun_3_x64_20G_alibase_.*"
87+
most_recent = true
88+
owners = "system"
89+
instance_type = data.alicloud_instance_types.default.instance_types[0].id
90+
}
91+
92+
# ECS 实例
93+
resource "alicloud_instance" "ecs_instance" {
94+
instance_name = "${local.common_name}-ecs"
95+
image_id = data.alicloud_images.ecs_image.images[0].id
96+
instance_type = data.alicloud_instance_types.default.instance_types[0].id
97+
security_groups = [alicloud_security_group.security_group.id]
98+
vswitch_id = alicloud_vswitch.vswitch.id
99+
system_disk_category = "cloud_essd"
100+
internet_max_bandwidth_out = 5
101+
password = var.ecs_instance_password
102+
}
103+
104+
# RDS 数据库实例
105+
resource "alicloud_db_instance" "rds_instance" {
106+
engine = "MySQL"
107+
engine_version = "8.0"
108+
instance_type = data.alicloud_db_instance_classes.default.instance_classes.0.instance_class
109+
instance_storage = data.alicloud_db_instance_classes.default.instance_classes.0.storage_range.min
110+
db_instance_storage_type = "cloud_essd"
111+
category = "Basic"
112+
vpc_id = alicloud_vpc.vpc.id
113+
vswitch_id = alicloud_vswitch.vswitch.id
114+
security_group_ids = [alicloud_security_group.security_group.id]
115+
security_ips = ["192.168.0.0/24"]
116+
zone_id = local.zone_id
117+
zone_id_slave_a = "Auto"
118+
}
119+
120+
# RDS 账户
121+
resource "alicloud_rds_account" "rds_account" {
122+
db_instance_id = alicloud_db_instance.rds_instance.id
123+
account_name = var.db_user_name
124+
account_password = var.db_password
125+
account_type = "Super"
126+
}
127+
128+
# RDS 数据库
129+
resource "alicloud_db_database" "rds_database" {
130+
instance_id = alicloud_db_instance.rds_instance.id
131+
name = "biz"
132+
character_set = "utf8mb4"
133+
depends_on = [alicloud_rds_account.rds_account]
134+
}
135+
136+
# Redis 实例
137+
resource "alicloud_kvstore_instance" "redis_instance" {
138+
db_instance_name = "${local.common_name}-redis"
139+
instance_class = "redis.shard.small.2.ce"
140+
instance_type = "Redis"
141+
engine_version = "6.0"
142+
vswitch_id = alicloud_vswitch.vswitch.id
143+
zone_id = local.zone_id
144+
password = var.redis_account_password
145+
security_ips = ["192.168.0.0/24"]
146+
}
147+
148+
# Redis 账户
149+
resource "alicloud_kvstore_account" "redis_account" {
150+
instance_id = alicloud_kvstore_instance.redis_instance.id
151+
account_name = var.redis_account_name
152+
account_password = var.redis_account_password
153+
account_privilege = "RoleReadWrite"
154+
account_type = "Normal"
155+
}
156+
157+
158+
# 本地变量 - 安装脚本
159+
locals {
160+
install_script = <<-SHELL
161+
#!/bin/bash
162+
163+
# 环境变量配置
164+
export PATH=/usr/local/bin:$PATH
165+
166+
function log_info() {
167+
printf "%s [INFO] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$1"
168+
}
169+
170+
function log_error() {
171+
printf "%s [ERROR] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$1"
172+
}
173+
174+
function log_fatal() {
175+
printf "\n========================================================================\n"
176+
printf "%s [FATAL] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$2"
177+
printf "\n========================================================================\n"
178+
exit $1
179+
}
180+
181+
function debug_exec(){
182+
local cmd="$@"
183+
log_info "$cmd"
184+
eval "$cmd"
185+
ret=$?
186+
echo ""
187+
log_info "$cmd, exit code: $ret"
188+
return $ret
189+
}
190+
191+
function install_web() {
192+
yum install nginx -y
193+
yum install java-1.8.0-openjdk.x86_64 -y
194+
sed -i 's/ _;/ domain.not.exists;/' /etc/nginx/nginx.conf
195+
curl -o AppWithRedisDemo.jar 'https://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/demos/AppWithRedisDemo.jar'
196+
}
197+
198+
if ! debug_exec install_web; then
199+
log_fatal 3 "install web failed"
200+
fi
201+
202+
cat << 'EOF' > /etc/nginx/conf.d/app_with_redis.conf
203+
server {
204+
listen 80 default_server;
205+
server_name _;
206+
207+
location / {
208+
proxy_pass http://localhost:8080;
209+
proxy_set_header Host $host;
210+
proxy_set_header X-Real-IP $remote_addr;
211+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
212+
proxy_set_header X-Forwarded-Proto $scheme;
213+
}
214+
}
215+
216+
EOF
217+
218+
nohup java -DMYSQL_HOST="${alicloud_db_instance.rds_instance.connection_string}" -DMYSQL_PASSWORD="${var.db_password}" -DREDIS_HOST="${alicloud_kvstore_instance.redis_instance.connection_domain}" -DREDIS_PASSWORD="redis:${var.redis_account_password}" -DAPP_MANUAL_DEPLOY="false" -jar AppWithRedisDemo.jar > output.log 2>&1 &
219+
/bin/systemctl start nginx.service
220+
SHELL
221+
}
222+
223+
# ECS 命令
224+
resource "alicloud_ecs_command" "install_web_command" {
225+
name = "install-web-command"
226+
description = "Install web application with Redis demo"
227+
enable_parameter = false
228+
type = "RunShellScript"
229+
command_content = base64encode(local.install_script)
230+
timeout = 3600
231+
working_dir = "/root"
232+
}
233+
234+
# 在ECS中执行命令
235+
resource "alicloud_ecs_invocation" "install_web_invocation" {
236+
instance_id = [alicloud_instance.ecs_instance.id]
237+
command_id = alicloud_ecs_command.install_web_command.id
238+
239+
depends_on = [
240+
alicloud_db_database.rds_database,
241+
alicloud_kvstore_account.redis_account
242+
]
243+
244+
timeouts {
245+
create = "10m"
246+
}
247+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
## here are the updates to merge:
2+
# ECS相关输出
3+
output "ecs_login_address" {
4+
description = "ECS登录地址"
5+
value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs&regionId=${data.alicloud_regions.current.regions[0].id}&instanceId=${alicloud_instance.ecs_instance.id}"
6+
}
7+
8+
output "ecs_public_ip_address" {
9+
description = "ECS公网IP地址"
10+
value = alicloud_instance.ecs_instance.public_ip
11+
}
12+
13+
# RDS相关输出
14+
output "rds_database_endpoint" {
15+
description = "RDS数据库连接地址"
16+
value = alicloud_db_instance.rds_instance.connection_string
17+
}
18+
19+
output "rds_database_name" {
20+
description = "RDS数据库名称"
21+
value = alicloud_db_database.rds_database.name
22+
}
23+
24+
output "rds_database_user_name" {
25+
description = "RDS数据库用户名"
26+
value = var.db_user_name
27+
}
28+
29+
# Redis相关输出
30+
output "redis_account_name" {
31+
description = "Redis数据库用户名"
32+
value = var.redis_account_name
33+
}
34+
35+
output "redis_endpoint" {
36+
description = "Redis数据库连接地址"
37+
value = alicloud_kvstore_instance.redis_instance.private_connection_prefix
38+
}
39+
40+
# 获取当前区域信息的数据源
41+
data "alicloud_regions" "current" {}
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)