Skip to content

Commit a827946

Browse files
committed
docs:添加10 分钟搭建微信、支付宝小程序的terraform模板
1 parent 3f9317b commit a827946

File tree

4 files changed

+330
-0
lines changed

4 files changed

+330
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
## Introduction
2+
3+
<!-- DOCS_DESCRIPTION_CN -->
4+
本示例用于实现解决方案[10 分钟搭建微信、支付宝小程序](https://www.aliyun.com/solution/tech-solution/develop-your-wechat-mini-program-in-10-minutes), 涉及到专有网络(VPC)、交换机(VSwitch)、云服务器(ECS)、云数据库(RDS MySQL) 等资源的创建。
5+
<!-- DOCS_DESCRIPTION_CN -->
6+
7+
<!-- DOCS_DESCRIPTION_EN -->
8+
This example demonstrates the implementation of the solution [Develop your weChat mini program in 10 minutes](https://www.aliyun.com/solution/tech-solution/develop-your-wechat-mini-program-in-10-minutes). It involves the creation, and deployment of resources such as Virtual Private Cloud (VPC), VSwitch, Elastic Compute Service (ECS), and ApsaraDB RDS for MySQL.
9+
<!-- DOCS_DESCRIPTION_EN -->
10+
11+
<!-- BEGIN_TF_DOCS -->
12+
## Providers
13+
14+
| Name | Version |
15+
|------|---------|
16+
| <a name="provider_alicloud"></a> [alicloud](#provider\_alicloud) | 1.253.0 |
17+
| <a name="provider_random"></a> [random](#provider\_random) | 3.7.2 |
18+
19+
## Modules
20+
21+
No modules.
22+
23+
## Resources
24+
25+
| Name | Type |
26+
|------|------|
27+
| [alicloud_db_account.rds_account](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/db_account) | resource |
28+
| [alicloud_db_account_privilege.rds_account_privilege](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/db_account_privilege) | resource |
29+
| [alicloud_db_database.rds_database](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/db_database) | resource |
30+
| [alicloud_db_instance.rds_db_instance](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/db_instance) | resource |
31+
| [alicloud_ecs_command.run_command](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_command) | resource |
32+
| [alicloud_ecs_invocation.run_command](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_invocation) | resource |
33+
| [alicloud_instance.ecs_instance](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/instance) | 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.http](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
36+
| [alicloud_security_group_rule.https](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
37+
| [alicloud_vpc.vpc](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vpc) | resource |
38+
| [alicloud_vswitch.vswitch](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
39+
| [random_id.suffix](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/id) | resource |
40+
| [alicloud_db_instance_classes.example](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/db_instance_classes) | data source |
41+
| [alicloud_db_zones.rds_zones](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/db_zones) | data source |
42+
| [alicloud_images.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/images) | data source |
43+
| [alicloud_instance_types.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/instance_types) | data source |
44+
| [alicloud_zones.ecs_zones](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/zones) | data source |
45+
46+
## Inputs
47+
48+
| Name | Description | Type | Default | Required |
49+
|------|-------------|------|---------|:--------:|
50+
| <a name="input_db_name"></a> [db\_name](#input\_db\_name) | 请输入数据库名称(由小写字母、数字及特殊字符 -\_ 组成,以字母开头,字母或数字结尾,最多64个字符)。 | `string` | `"wordpress"` | no |
51+
| <a name="input_db_password"></a> [db\_password](#input\_db\_password) | 请输入RDS数据库密码。密码长度为8-32位,需包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*()\_+-=)。如果在本教程中重复配置,请确保 MySQL 数据库密码与模板首次执行时设置的密码完全相同,否则配置结果不可用。 | `string` | n/a | yes |
52+
| <a name="input_db_user"></a> [db\_user](#input\_db\_user) | 请输入RDS数据库用户名(长度为2-16个字符,仅允许小写字母、数字和下划线,必须以字母开头,以字母或数字结尾)。 | `string` | `"dbuser"` | no |
53+
| <a name="input_ecs_instance_password"></a> [ecs\_instance\_password](#input\_ecs\_instance\_password) | 请输入服务器登录密码。密码长度为8-30位,必须包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*\_-+=\|{}[]:;'<>,.?/)。 | `string` | n/a | yes |
54+
| <a name="input_region_id"></a> [region\_id](#input\_region\_id) | 请输入地域ID(例如:cn-hangzhou)。 | `string` | `"cn-hangzhou"` | no |
55+
| <a name="input_vpc_cidr_block"></a> [vpc\_cidr\_block](#input\_vpc\_cidr\_block) | 请输入VPC的CIDR块(支持的值包括:192.168.0.0/16、172.16.0.0/12、10.0.0.0/8)。这是您的虚拟私有云的地址范围。 | `string` | `"192.168.0.0/16"` | no |
56+
| <a name="input_vswitch_cidr_block"></a> [vswitch\_cidr\_block](#input\_vswitch\_cidr\_block) | 请输入交换机的CIDR块(例如:192.168.0.0/24)。这是您虚拟交换机的地址范围。 | `string` | `"192.168.0.0/24"` | no |
57+
| <a name="input_word_press_password"></a> [word\_press\_password](#input\_word\_press\_password) | 请输入WordPress管理员密码。密码长度为8-32位,需包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*()\_+-=)。 | `string` | n/a | yes |
58+
| <a name="input_word_press_user_email"></a> [word\_press\_user\_email](#input\_word\_press\_user\_email) | 请输入WordPress管理员邮箱(用于系统通知和找回密码)。 | `string` | `"admin@example.com"` | no |
59+
| <a name="input_word_press_user_name"></a> [word\_press\_user\_name](#input\_word\_press\_user\_name) | 请输入WordPress管理员用户名(建议使用独特的用户名以增强安全性)。 | `string` | `"admin"` | no |
60+
<!-- END_TF_DOCS -->
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
provider "alicloud" {
2+
region = var.region_id
3+
}
4+
resource "random_id" "suffix" {
5+
byte_length = 8
6+
}
7+
8+
locals {
9+
common_zones = tolist(setintersection(
10+
data.alicloud_zones.ecs_zones.ids,
11+
data.alicloud_db_zones.rds_zones.ids
12+
))
13+
common_name = random_id.suffix.id
14+
ecs_command = <<SHELL
15+
#!/bin/bash
16+
cat << INNER_EOF >> ~/.bash_profile
17+
export DB_NAME=${var.db_name}
18+
export DB_USERNAME=${var.db_user}
19+
export DB_PASSWORD=${var.db_password}
20+
export DB_CONNECTION=${alicloud_db_instance.rds_db_instance.connection_string}
21+
export ROS_DEPLOY=true
22+
INNER_EOF
23+
24+
source ~/.bash_profile
25+
26+
curl -fsSL https://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/install-script/develop-your-wechat-mini-program-in-10-minutes/install.sh|bash
27+
28+
## 调整db连接配置
29+
sed -i 's/localhost/${alicloud_db_instance.rds_db_instance.connection_string}/' /var/www/html/wp-config.php
30+
sed -i 's/username_here/${var.db_user}/' /var/www/html/wp-config.php
31+
sed -i 's/password_here/${var.db_password}/' /var/www/html/wp-config.php
32+
sed -i 's/database_name_here/${var.db_name}/' /var/www/html/wp-config.php
33+
34+
cd /var/www/html
35+
sudo cat << INNER_EOF > .htaccess
36+
# BEGIN WordPress
37+
<IfModule mod_rewrite.c>
38+
RewriteEngine On
39+
RewriteCond \%\{HTTP:Authorization\} ^(.*)
40+
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
41+
RewriteBase /
42+
RewriteRule ^index\.php$ - [L]
43+
RewriteCond \%\{REQUEST_FILENAME\} !-f
44+
RewriteCond \%\{REQUEST_FILENAME\} !-d
45+
RewriteRule . /index.php [L]
46+
</IfModule>
47+
# END WordPress
48+
INNER_EOF
49+
sed -i 's/AllowOverride None/AllowOverride All/g' /etc/httpd/conf/httpd.conf
50+
51+
wget https://downloads.wordpress.org/plugin/jwt-authentication-for-wp-rest-api.zip
52+
yum -y install unzip
53+
unzip jwt-authentication-for-wp-rest-api.zip -d jwt-authentication-for-wp-rest-api
54+
cp -r ./jwt-authentication-for-wp-rest-api/jwt-authentication-for-wp-rest-api /var/www/html/wp-content/plugins
55+
rm -rf jwt-authentication-for-wp-rest-api.zip
56+
rm -rf jwt-authentication-for-wp-rest-api
57+
wget https://gitee.com/qin-yangming/open-tools/raw/master/wp-cli.phar
58+
chmod +x wp-cli.phar
59+
mv wp-cli.phar /usr/local/bin/wp
60+
61+
SECRET_KEY=$(openssl rand -base64 32) && sed -i "/Database settings/i define('JWT_AUTH_SECRET_KEY', '$SECRET_KEY');\ndefine('JWT_AUTH_CORS_ENABLE', true);\n" /var/www/html/wp-config.php
62+
sed -i 's/\r$//' /var/www/html/wp-config.php
63+
wp core install --url=${alicloud_instance.ecs_instance.public_ip} --title="Hello World" --admin_user=${var.word_press_user_name} --admin_password=${var.word_press_password} --admin_email=${var.word_press_user_email} --skip-email --allow-root
64+
65+
wp plugin activate jwt-authentication-for-wp-rest-api --allow-root --path=/var/www/html
66+
67+
systemctl restart httpd
68+
SHELL
69+
}
70+
71+
data "alicloud_db_zones" "rds_zones" {
72+
engine = "MySQL"
73+
engine_version = "8.0"
74+
instance_charge_type = "PostPaid"
75+
category = "Basic"
76+
db_instance_storage_type = "cloud_essd"
77+
}
78+
79+
data "alicloud_zones" "ecs_zones" {
80+
available_resource_creation = "Instance"
81+
available_instance_type = data.alicloud_instance_types.default.instance_types[0].id
82+
}
83+
84+
data "alicloud_instance_types" "default" {
85+
system_disk_category = "cloud_essd"
86+
image_id = data.alicloud_images.default.images[0].id
87+
instance_type_family = "ecs.c6"
88+
}
89+
90+
data "alicloud_images" "default" {
91+
name_regex = "^centos_7_9_x64_20G_alibase_*"
92+
most_recent = true
93+
owners = "system"
94+
}
95+
96+
data "alicloud_db_instance_classes" "example" {
97+
zone_id = local.common_zones[0]
98+
engine = data.alicloud_db_zones.rds_zones.engine
99+
engine_version = data.alicloud_db_zones.rds_zones.engine_version
100+
category = data.alicloud_db_zones.rds_zones.category
101+
db_instance_storage_type = data.alicloud_db_zones.rds_zones.db_instance_storage_type
102+
instance_charge_type = data.alicloud_db_zones.rds_zones.instance_charge_type
103+
}
104+
105+
resource "alicloud_vpc" "vpc" {
106+
vpc_name = "vpc"
107+
cidr_block = var.vpc_cidr_block
108+
}
109+
110+
resource "alicloud_vswitch" "vswitch" {
111+
vpc_id = alicloud_vpc.vpc.id
112+
cidr_block = var.vswitch_cidr_block
113+
zone_id = local.common_zones[0]
114+
vswitch_name = "vsw"
115+
}
116+
117+
# Security Group
118+
resource "alicloud_security_group" "security_group" {
119+
vpc_id = alicloud_vpc.vpc.id
120+
security_group_name = "sg"
121+
security_group_type = "normal"
122+
}
123+
124+
resource "alicloud_security_group_rule" "http" {
125+
type = "ingress"
126+
ip_protocol = "tcp"
127+
port_range = "80/80"
128+
cidr_ip = "0.0.0.0/0"
129+
security_group_id = alicloud_security_group.security_group.id
130+
}
131+
132+
resource "alicloud_security_group_rule" "https" {
133+
type = "ingress"
134+
ip_protocol = "tcp"
135+
port_range = "22/22"
136+
cidr_ip = "0.0.0.0/0"
137+
security_group_id = alicloud_security_group.security_group.id
138+
}
139+
140+
# RDS Resources
141+
resource "alicloud_db_instance" "rds_db_instance" {
142+
engine = data.alicloud_db_instance_classes.example.engine
143+
engine_version = data.alicloud_db_instance_classes.example.engine_version
144+
instance_type = data.alicloud_db_instance_classes.example.instance_classes[0].instance_class
145+
instance_storage = data.alicloud_db_instance_classes.example.instance_classes[0].storage_range.min
146+
db_instance_storage_type = data.alicloud_db_instance_classes.example.db_instance_storage_type
147+
vswitch_id = alicloud_vswitch.vswitch.id
148+
zone_id = local.common_zones[0]
149+
security_group_ids = [alicloud_security_group.security_group.id]
150+
}
151+
152+
resource "alicloud_db_database" "rds_database" {
153+
instance_id = alicloud_db_instance.rds_db_instance.id
154+
name = var.db_name
155+
character_set = "utf8mb4"
156+
}
157+
158+
resource "alicloud_db_account" "rds_account" {
159+
db_instance_id = alicloud_db_instance.rds_db_instance.id
160+
account_name = var.db_user
161+
account_type = "Normal"
162+
account_password = var.db_password
163+
}
164+
165+
resource "alicloud_db_account_privilege" "rds_account_privilege" {
166+
instance_id = alicloud_db_instance.rds_db_instance.id
167+
account_name = alicloud_db_account.rds_account.account_name
168+
db_names = [alicloud_db_database.rds_database.name]
169+
privilege = "ReadWrite"
170+
}
171+
172+
# ECS Resources
173+
resource "alicloud_instance" "ecs_instance" {
174+
instance_name = "ecs-${local.common_name}"
175+
system_disk_category = data.alicloud_instance_types.default.system_disk_category
176+
image_id = data.alicloud_images.default.images[0].id
177+
vswitch_id = alicloud_vswitch.vswitch.id
178+
password = var.ecs_instance_password
179+
instance_type = data.alicloud_instance_types.default.instance_types[0].id
180+
internet_max_bandwidth_out = 5
181+
security_groups = [alicloud_security_group.security_group.id]
182+
}
183+
184+
resource "alicloud_ecs_command" "run_command" {
185+
name = "commond_install"
186+
description = "commond_install_description"
187+
enable_parameter = false
188+
type = "RunShellScript"
189+
command_content = base64encode(local.ecs_command)
190+
timeout = 3600
191+
working_dir = "/root"
192+
}
193+
194+
resource "alicloud_ecs_invocation" "run_command" {
195+
instance_id = [alicloud_instance.ecs_instance.id]
196+
command_id = alicloud_ecs_command.run_command.id
197+
timeouts {
198+
create = "10m"
199+
}
200+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Outputs
2+
output "wordpress_url" {
3+
description = "Wordpress 博客访问地址。"
4+
value = "http://${alicloud_instance.ecs_instance.public_ip}/wp-admin"
5+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# Parameters
2+
variable "region_id" {
3+
description = "请输入地域ID(例如:cn-hangzhou)。"
4+
default = "cn-hangzhou"
5+
}
6+
7+
variable "vpc_cidr_block" {
8+
description = "请输入VPC的CIDR块(支持的值包括:192.168.0.0/16、172.16.0.0/12、10.0.0.0/8)。这是您的虚拟私有云的地址范围。"
9+
default = "192.168.0.0/16"
10+
validation {
11+
condition = contains(["192.168.0.0/16", "172.16.0.0/12", "10.0.0.0/8"], var.vpc_cidr_block)
12+
error_message = "无效的VPC CIDR块,请检查并重新输入。"
13+
}
14+
}
15+
16+
variable "vswitch_cidr_block" {
17+
description = "请输入交换机的CIDR块(例如:192.168.0.0/24)。这是您虚拟交换机的地址范围。"
18+
default = "192.168.0.0/24"
19+
}
20+
21+
variable "ecs_instance_password" {
22+
description = "请输入服务器登录密码。密码长度为8-30位,必须包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*_-+=|{}[]:;'<>,.?/)。"
23+
type = string
24+
sensitive = true
25+
}
26+
27+
variable "db_name" {
28+
description = "请输入数据库名称(由小写字母、数字及特殊字符 -_ 组成,以字母开头,字母或数字结尾,最多64个字符)。"
29+
default = "wordpress"
30+
validation {
31+
condition = regex("^[a-z][a-z0-9-_]{0,62}[a-z0-9]$", var.db_name) != ""
32+
error_message = "数据库名称格式不正确。名称应由小写字母、数字及特殊字符 -_ 组成,以字母开头,字母或数字结尾,最多64个字符。"
33+
}
34+
}
35+
36+
variable "db_user" {
37+
description = "请输入RDS数据库用户名(长度为2-16个字符,仅允许小写字母、数字和下划线,必须以字母开头,以字母或数字结尾)。"
38+
default = "dbuser"
39+
validation {
40+
condition = regex("^[a-z][a-z0-9_]{1,15}$", var.db_user) != ""
41+
error_message = "用户名格式不正确。用户名长度应为2-16个字符,仅允许小写字母、数字和下划线,必须以字母开头,以字母或数字结尾。"
42+
}
43+
}
44+
45+
variable "db_password" {
46+
description = "请输入RDS数据库密码。密码长度为8-32位,需包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*()_+-=)。如果在本教程中重复配置,请确保 MySQL 数据库密码与模板首次执行时设置的密码完全相同,否则配置结果不可用。"
47+
type = string
48+
sensitive = true
49+
}
50+
51+
variable "word_press_user_name" {
52+
description = "请输入WordPress管理员用户名(建议使用独特的用户名以增强安全性)。"
53+
default = "admin"
54+
}
55+
56+
variable "word_press_password" {
57+
description = "请输入WordPress管理员密码。密码长度为8-32位,需包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*()_+-=)。"
58+
type = string
59+
sensitive = true
60+
}
61+
62+
variable "word_press_user_email" {
63+
description = "请输入WordPress管理员邮箱(用于系统通知和找回密码)。"
64+
default = "admin@example.com"
65+
}

0 commit comments

Comments
 (0)