Skip to content

Commit 6d9cd82

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

File tree

4 files changed

+314
-0
lines changed

4 files changed

+314
-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_images.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/images) | data source |
42+
| [alicloud_instance_types.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/instance_types) | data source |
43+
| [alicloud_zones.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/zones) | 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: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
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_instance_types" "default" {
68+
cpu_core_count = 2
69+
memory_size = 2
70+
}
71+
72+
data "alicloud_images" "default" {
73+
name_regex = "^centos_7_9_x64_20G_alibase_*"
74+
most_recent = true
75+
owners = "system"
76+
}
77+
78+
data "alicloud_zones" "default" {
79+
available_resource_creation = "Instance"
80+
available_instance_type = data.alicloud_instance_types.default.instance_types[0].id
81+
}
82+
83+
data "alicloud_db_instance_classes" "example" {
84+
zone_id = data.alicloud_zones.default.zones[0].id
85+
engine = "MySQL"
86+
engine_version = "8.0"
87+
category = "Basic"
88+
db_instance_storage_type = "cloud_essd"
89+
instance_charge_type = "PostPaid"
90+
}
91+
92+
resource "alicloud_vpc" "vpc" {
93+
vpc_name = "vpc"
94+
cidr_block = var.vpc_cidr_block
95+
}
96+
97+
resource "alicloud_vswitch" "vswitch" {
98+
vpc_id = alicloud_vpc.vpc.id
99+
cidr_block = var.vswitch_cidr_block
100+
zone_id = data.alicloud_zones.default.zones[0].id
101+
vswitch_name = "vsw"
102+
}
103+
104+
# Security Group
105+
resource "alicloud_security_group" "security_group" {
106+
vpc_id = alicloud_vpc.vpc.id
107+
security_group_name = "sg"
108+
security_group_type = "normal"
109+
}
110+
111+
resource "alicloud_security_group_rule" "http" {
112+
type = "ingress"
113+
ip_protocol = "tcp"
114+
port_range = "80/80"
115+
cidr_ip = "0.0.0.0/0"
116+
security_group_id = alicloud_security_group.security_group.id
117+
}
118+
119+
resource "alicloud_security_group_rule" "https" {
120+
type = "ingress"
121+
ip_protocol = "tcp"
122+
port_range = "22/22"
123+
cidr_ip = "0.0.0.0/0"
124+
security_group_id = alicloud_security_group.security_group.id
125+
}
126+
127+
# RDS Resources
128+
resource "alicloud_db_instance" "rds_db_instance" {
129+
engine = "MySQL"
130+
engine_version = "8.0"
131+
instance_type = data.alicloud_db_instance_classes.example.instance_classes.0.instance_class
132+
instance_storage = data.alicloud_db_instance_classes.example.instance_classes.0.storage_range.min
133+
db_instance_storage_type = "cloud_essd"
134+
vswitch_id = alicloud_vswitch.vswitch.id
135+
zone_id = data.alicloud_zones.default.zones[0].id
136+
security_group_ids = [alicloud_security_group.security_group.id]
137+
}
138+
139+
resource "alicloud_db_database" "rds_database" {
140+
instance_id = alicloud_db_instance.rds_db_instance.id
141+
name = var.db_name
142+
character_set = "utf8mb4"
143+
}
144+
145+
resource "alicloud_db_account" "rds_account" {
146+
db_instance_id = alicloud_db_instance.rds_db_instance.id
147+
account_name = var.db_user
148+
account_type = "Normal"
149+
account_password = var.db_password
150+
}
151+
152+
resource "alicloud_db_account_privilege" "rds_account_privilege" {
153+
instance_id = alicloud_db_instance.rds_db_instance.id
154+
account_name = alicloud_db_account.rds_account.account_name
155+
db_names = alicloud_db_database.rds_database.*.name
156+
privilege = "ReadWrite"
157+
}
158+
159+
# ECS Resources
160+
resource "alicloud_instance" "ecs_instance" {
161+
instance_name = "ecs-${local.common_name}"
162+
system_disk_category = "cloud_essd"
163+
image_id = "centos_7_9_x64_20G_alibase_20240628.vhd"
164+
vswitch_id = alicloud_vswitch.vswitch.id
165+
password = var.ecs_instance_password
166+
instance_type = data.alicloud_instance_types.default.instance_types[0].id
167+
internet_max_bandwidth_out = 5
168+
security_groups = [alicloud_security_group.security_group.id]
169+
}
170+
resource "alicloud_ecs_command" "run_command" {
171+
name = "commond_install"
172+
description = "commond_install_description"
173+
enable_parameter = false
174+
type = "RunShellScript"
175+
command_content = base64encode(local.ecs_command)
176+
timeout = 3600
177+
working_dir = "/root"
178+
}
179+
resource "alicloud_ecs_invocation" "run_command" {
180+
instance_id = [alicloud_instance.ecs_instance.id]
181+
command_id = alicloud_ecs_command.run_command.id
182+
timeouts {
183+
create = "10m"
184+
}
185+
}
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)