Skip to content

Commit 4b2abbd

Browse files
wbw2048shanye997
authored andcommitted
docs:添加10 分钟搭建微信、支付宝小程序的terraform模板
1 parent 9ae3e41 commit 4b2abbd

File tree

4 files changed

+321
-0
lines changed

4 files changed

+321
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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+
45+
## Inputs
46+
47+
| Name | Description | Type | Default | Required |
48+
|------|-------------|------|---------|:--------:|
49+
| <a name="input_db_name"></a> [db\_name](#input\_db\_name) | 请输入数据库名称(由小写字母、数字及特殊字符 -\_ 组成,以字母开头,字母或数字结尾,最多64个字符)。 | `string` | `"wordpress"` | no |
50+
| <a name="input_db_password"></a> [db\_password](#input\_db\_password) | 请输入RDS数据库密码。密码长度为8-32位,需包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*()\_+-=)。如果在本教程中重复配置,请确保 MySQL 数据库密码与模板首次执行时设置的密码完全相同,否则配置结果不可用。 | `string` | n/a | yes |
51+
| <a name="input_db_user"></a> [db\_user](#input\_db\_user) | 请输入RDS数据库用户名(长度为2-16个字符,仅允许小写字母、数字和下划线,必须以字母开头,以字母或数字结尾)。 | `string` | `"dbuser"` | no |
52+
| <a name="input_ecs_instance_password"></a> [ecs\_instance\_password](#input\_ecs\_instance\_password) | 请输入服务器登录密码。密码长度为8-30位,必须包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*\_-+=\|{}[]:;'<>,.?/)。 | `string` | n/a | yes |
53+
| <a name="input_region_id"></a> [region\_id](#input\_region\_id) | 请输入地域ID(例如:cn-hangzhou)。 | `string` | `"cn-hangzhou"` | no |
54+
| <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 |
55+
| <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 |
56+
| <a name="input_word_press_password"></a> [word\_press\_password](#input\_word\_press\_password) | 请输入WordPress管理员密码。密码长度为8-32位,需包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*()\_+-=)。 | `string` | n/a | yes |
57+
| <a name="input_word_press_user_email"></a> [word\_press\_user\_email](#input\_word\_press\_user\_email) | 请输入WordPress管理员邮箱(用于系统通知和找回密码)。 | `string` | `"admin@example.com"` | no |
58+
| <a name="input_word_press_user_name"></a> [word\_press\_user\_name](#input\_word\_press\_user\_name) | 请输入WordPress管理员用户名(建议使用独特的用户名以增强安全性)。 | `string` | `"admin"` | no |
59+
<!-- END_TF_DOCS -->
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
provider "alicloud" {
2+
region = var.region_id
3+
}
4+
resource "random_id" "suffix" {
5+
byte_length = 8
6+
}
7+
8+
locals {
9+
common_name = random_id.suffix.id
10+
ecs_command = <<SHELL
11+
#!/bin/bash
12+
cat << INNER_EOF >> ~/.bash_profile
13+
export DB_NAME=${var.db_name}
14+
export DB_USERNAME=${var.db_user}
15+
export DB_PASSWORD=${var.db_password}
16+
export DB_CONNECTION=${alicloud_db_instance.rds_db_instance.connection_string}
17+
export ROS_DEPLOY=true
18+
INNER_EOF
19+
20+
source ~/.bash_profile
21+
22+
curl -fsSL https://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/install-script/develop-your-wechat-mini-program-in-10-minutes/install.sh|bash
23+
24+
## 调整db连接配置
25+
sed -i 's/localhost/${alicloud_db_instance.rds_db_instance.connection_string}/' /var/www/html/wp-config.php
26+
sed -i 's/username_here/${var.db_user}/' /var/www/html/wp-config.php
27+
sed -i 's/password_here/${var.db_password}/' /var/www/html/wp-config.php
28+
sed -i 's/database_name_here/${var.db_name}/' /var/www/html/wp-config.php
29+
30+
cd /var/www/html
31+
sudo cat << INNER_EOF > .htaccess
32+
# BEGIN WordPress
33+
<IfModule mod_rewrite.c>
34+
RewriteEngine On
35+
RewriteCond \%\{HTTP:Authorization\} ^(.*)
36+
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
37+
RewriteBase /
38+
RewriteRule ^index\.php$ - [L]
39+
RewriteCond \%\{REQUEST_FILENAME\} !-f
40+
RewriteCond \%\{REQUEST_FILENAME\} !-d
41+
RewriteRule . /index.php [L]
42+
</IfModule>
43+
# END WordPress
44+
INNER_EOF
45+
sed -i 's/AllowOverride None/AllowOverride All/g' /etc/httpd/conf/httpd.conf
46+
47+
wget https://downloads.wordpress.org/plugin/jwt-authentication-for-wp-rest-api.zip
48+
yum -y install unzip
49+
unzip jwt-authentication-for-wp-rest-api.zip -d jwt-authentication-for-wp-rest-api
50+
cp -r ./jwt-authentication-for-wp-rest-api/jwt-authentication-for-wp-rest-api /var/www/html/wp-content/plugins
51+
rm -rf jwt-authentication-for-wp-rest-api.zip
52+
rm -rf jwt-authentication-for-wp-rest-api
53+
wget https://gitee.com/qin-yangming/open-tools/raw/master/wp-cli.phar
54+
chmod +x wp-cli.phar
55+
mv wp-cli.phar /usr/local/bin/wp
56+
57+
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
58+
sed -i 's/\r$//' /var/www/html/wp-config.php
59+
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
60+
61+
wp plugin activate jwt-authentication-for-wp-rest-api --allow-root --path=/var/www/html
62+
63+
systemctl restart httpd
64+
SHELL
65+
}
66+
67+
data "alicloud_db_zones" "rds_zones" {
68+
engine = "MySQL"
69+
engine_version = "8.0"
70+
instance_charge_type = "PostPaid"
71+
category = "Basic"
72+
db_instance_storage_type = "cloud_essd"
73+
}
74+
75+
data "alicloud_instance_types" "default" {
76+
system_disk_category = "cloud_essd"
77+
image_id = data.alicloud_images.default.images[0].id
78+
instance_type_family = "ecs.c6"
79+
availability_zone = data.alicloud_db_zones.rds_zones.zones[length(data.alicloud_db_zones.rds_zones.zones) - 1].id
80+
}
81+
82+
data "alicloud_images" "default" {
83+
name_regex = "^centos_7_9_x64_20G_alibase_*"
84+
most_recent = true
85+
owners = "system"
86+
}
87+
88+
data "alicloud_db_instance_classes" "example" {
89+
zone_id = data.alicloud_db_zones.rds_zones.zones[length(data.alicloud_db_zones.rds_zones.zones) - 1].id
90+
engine = data.alicloud_db_zones.rds_zones.engine
91+
engine_version = data.alicloud_db_zones.rds_zones.engine_version
92+
category = data.alicloud_db_zones.rds_zones.category
93+
db_instance_storage_type = data.alicloud_db_zones.rds_zones.db_instance_storage_type
94+
instance_charge_type = data.alicloud_db_zones.rds_zones.instance_charge_type
95+
}
96+
97+
resource "alicloud_vpc" "vpc" {
98+
vpc_name = "vpc"
99+
cidr_block = var.vpc_cidr_block
100+
}
101+
102+
resource "alicloud_vswitch" "vswitch" {
103+
vpc_id = alicloud_vpc.vpc.id
104+
cidr_block = var.vswitch_cidr_block
105+
zone_id = data.alicloud_db_zones.rds_zones.zones[length(data.alicloud_db_zones.rds_zones.zones) - 1].id
106+
vswitch_name = "vsw"
107+
}
108+
109+
# Security Group
110+
resource "alicloud_security_group" "security_group" {
111+
vpc_id = alicloud_vpc.vpc.id
112+
security_group_name = "sg"
113+
security_group_type = "normal"
114+
}
115+
116+
resource "alicloud_security_group_rule" "http" {
117+
type = "ingress"
118+
ip_protocol = "tcp"
119+
port_range = "80/80"
120+
cidr_ip = "0.0.0.0/0"
121+
security_group_id = alicloud_security_group.security_group.id
122+
}
123+
124+
resource "alicloud_security_group_rule" "https" {
125+
type = "ingress"
126+
ip_protocol = "tcp"
127+
port_range = "22/22"
128+
cidr_ip = "0.0.0.0/0"
129+
security_group_id = alicloud_security_group.security_group.id
130+
}
131+
132+
# RDS Resources
133+
resource "alicloud_db_instance" "rds_db_instance" {
134+
engine = data.alicloud_db_instance_classes.example.engine
135+
engine_version = data.alicloud_db_instance_classes.example.engine_version
136+
instance_type = data.alicloud_db_instance_classes.example.instance_classes[0].instance_class
137+
instance_storage = data.alicloud_db_instance_classes.example.instance_classes[0].storage_range.min
138+
db_instance_storage_type = data.alicloud_db_instance_classes.example.db_instance_storage_type
139+
vswitch_id = alicloud_vswitch.vswitch.id
140+
zone_id = data.alicloud_db_zones.rds_zones.zones[length(data.alicloud_db_zones.rds_zones.zones) - 1].id
141+
security_group_ids = [alicloud_security_group.security_group.id]
142+
}
143+
144+
resource "alicloud_db_database" "rds_database" {
145+
instance_id = alicloud_db_instance.rds_db_instance.id
146+
name = var.db_name
147+
character_set = "utf8mb4"
148+
}
149+
150+
resource "alicloud_db_account" "rds_account" {
151+
db_instance_id = alicloud_db_instance.rds_db_instance.id
152+
account_name = var.db_user
153+
account_type = "Normal"
154+
account_password = var.db_password
155+
}
156+
157+
resource "alicloud_db_account_privilege" "rds_account_privilege" {
158+
instance_id = alicloud_db_instance.rds_db_instance.id
159+
account_name = alicloud_db_account.rds_account.account_name
160+
db_names = [alicloud_db_database.rds_database.name]
161+
privilege = "ReadWrite"
162+
}
163+
164+
# ECS Resources
165+
resource "alicloud_instance" "ecs_instance" {
166+
instance_name = "ecs-${local.common_name}"
167+
system_disk_category = data.alicloud_instance_types.default.system_disk_category
168+
image_id = data.alicloud_images.default.images[0].id
169+
vswitch_id = alicloud_vswitch.vswitch.id
170+
password = var.ecs_instance_password
171+
instance_type = data.alicloud_instance_types.default.instance_types[0].id
172+
internet_max_bandwidth_out = 5
173+
security_groups = [alicloud_security_group.security_group.id]
174+
}
175+
176+
resource "alicloud_ecs_command" "run_command" {
177+
name = "commond_install"
178+
description = "commond_install_description"
179+
enable_parameter = false
180+
type = "RunShellScript"
181+
command_content = base64encode(local.ecs_command)
182+
timeout = 3600
183+
working_dir = "/root"
184+
}
185+
186+
resource "alicloud_ecs_invocation" "run_command" {
187+
instance_id = [alicloud_instance.ecs_instance.id]
188+
command_id = alicloud_ecs_command.run_command.id
189+
timeouts {
190+
create = "10m"
191+
}
192+
}
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)