Skip to content

Commit 3380fcf

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

File tree

4 files changed

+302
-0
lines changed

4 files changed

+302
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
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) | n/a |
17+
| <a name="provider_random"></a> [random](#provider\_random) | n/a |
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+
41+
## Inputs
42+
43+
| Name | Description | Type | Default | Required |
44+
|------|-------------|------|---------|:--------:|
45+
| <a name="input_db_instance_class"></a> [db\_instance\_class](#input\_db\_instance\_class) | 请输入RDS实例规格(例如:mysql.n2m.medium.2c)。根据您的数据库负载选择合适的规格。 | `string` | `"mysql.n2m.medium.2c"` | no |
46+
| <a name="input_db_name"></a> [db\_name](#input\_db\_name) | 请输入数据库名称(由小写字母、数字及特殊字符 -\_ 组成,以字母开头,字母或数字结尾,最多64个字符)。 | `string` | `"wordpress"` | no |
47+
| <a name="input_db_password"></a> [db\_password](#input\_db\_password) | 请输入RDS数据库密码。密码长度为8-32位,需包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*()\_+-=)。如果在本教程中重复配置,请确保 MySQL 数据库密码与模板首次执行时设置的密码完全相同,否则配置结果不可用。 | `string` | n/a | yes |
48+
| <a name="input_db_user"></a> [db\_user](#input\_db\_user) | 请输入RDS数据库用户名(长度为2-16个字符,仅允许小写字母、数字和下划线,必须以字母开头,以字母或数字结尾)。 | `string` | `"dbuser"` | no |
49+
| <a name="input_ecs_instance_password"></a> [ecs\_instance\_password](#input\_ecs\_instance\_password) | 请输入服务器登录密码。密码长度为8-30位,必须包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*\_-+=\|{}[]:;'<>,.?/)。 | `string` | n/a | yes |
50+
| <a name="input_ecs_instance_type"></a> [ecs\_instance\_type](#input\_ecs\_instance\_type) | 请输入ECS实例类型(例如:ecs.e-c1m2.large)。请根据实际需求选择合适的实例规格。 | `string` | `"ecs.e-c1m2.large"` | no |
51+
| <a name="input_region_id"></a> [region\_id](#input\_region\_id) | 请输入地域ID(例如:cn-hangzhou)。 | `string` | `"cn-hangzhou"` | no |
52+
| <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 |
53+
| <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 |
54+
| <a name="input_word_press_password"></a> [word\_press\_password](#input\_word\_press\_password) | 请输入WordPress管理员密码。密码长度为8-32位,需包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*()\_+-=)。 | `string` | n/a | yes |
55+
| <a name="input_word_press_user_email"></a> [word\_press\_user\_email](#input\_word\_press\_user\_email) | 请输入WordPress管理员邮箱(用于系统通知和找回密码)。 | `string` | `"admin@example.com"` | no |
56+
| <a name="input_word_press_user_name"></a> [word\_press\_user\_name](#input\_word\_press\_user\_name) | 请输入WordPress管理员用户名(建议使用独特的用户名以增强安全性)。 | `string` | `"admin"` | no |
57+
| <a name="input_zone_id"></a> [zone\_id](#input\_zone\_id) | 请输入可用区ID(例如:cn-hangzhou-k)。请确保该可用区支持您要创建的ECS资源规格。 | `string` | `"cn-hangzhou-k"` | no |
58+
<!-- END_TF_DOCS -->
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
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+
}
11+
# VPC Resources
12+
resource "alicloud_vpc" "vpc" {
13+
vpc_name = "vpc"
14+
cidr_block = var.vpc_cidr_block
15+
}
16+
17+
resource "alicloud_vswitch" "vswitch" {
18+
vpc_id = alicloud_vpc.vpc.id
19+
cidr_block = var.vswitch_cidr_block
20+
zone_id = var.zone_id
21+
vswitch_name = "vsw"
22+
}
23+
24+
# Security Group
25+
resource "alicloud_security_group" "security_group" {
26+
vpc_id = alicloud_vpc.vpc.id
27+
security_group_name = "sg"
28+
security_group_type = "normal"
29+
}
30+
31+
resource "alicloud_security_group_rule" "http" {
32+
type = "ingress"
33+
ip_protocol = "tcp"
34+
port_range = "80/80"
35+
cidr_ip = "0.0.0.0/0"
36+
security_group_id = alicloud_security_group.security_group.id
37+
}
38+
39+
resource "alicloud_security_group_rule" "https" {
40+
type = "ingress"
41+
ip_protocol = "tcp"
42+
port_range = "22/22"
43+
cidr_ip = "0.0.0.0/0"
44+
security_group_id = alicloud_security_group.security_group.id
45+
}
46+
47+
# RDS Resources
48+
resource "alicloud_db_instance" "rds_db_instance" {
49+
engine = "MySQL"
50+
engine_version = "8.0"
51+
instance_type = var.db_instance_class
52+
instance_storage = 50
53+
db_instance_storage_type = "cloud_essd"
54+
vswitch_id = alicloud_vswitch.vswitch.id
55+
zone_id = var.zone_id
56+
security_group_ids = [alicloud_security_group.security_group.id]
57+
}
58+
59+
resource "alicloud_db_database" "rds_database" {
60+
instance_id = alicloud_db_instance.rds_db_instance.id
61+
name = var.db_name
62+
character_set = "utf8mb4"
63+
}
64+
65+
resource "alicloud_db_account" "rds_account" {
66+
db_instance_id = alicloud_db_instance.rds_db_instance.id
67+
account_name = var.db_user
68+
account_type = "Normal"
69+
account_password = var.db_password
70+
}
71+
72+
resource "alicloud_db_account_privilege" "rds_account_privilege" {
73+
instance_id = alicloud_db_instance.rds_db_instance.id
74+
account_name = alicloud_db_account.rds_account.account_name
75+
db_names = alicloud_db_database.rds_database.*.name
76+
privilege = "ReadWrite"
77+
}
78+
79+
# ECS Resources
80+
resource "alicloud_instance" "ecs_instance" {
81+
instance_name = "ecs-${local.common_name}"
82+
system_disk_category = "cloud_essd"
83+
image_id = "centos_7_9_x64_20G_alibase_20240628.vhd"
84+
vswitch_id = alicloud_vswitch.vswitch.id
85+
password = var.ecs_instance_password
86+
instance_type = var.ecs_instance_type
87+
internet_max_bandwidth_out = 5
88+
security_groups = [alicloud_security_group.security_group.id]
89+
}
90+
resource "alicloud_ecs_command" "run_command" {
91+
name = "commond-install"
92+
command_content = base64encode(<<OUTER_EOF
93+
#!/bin/bash
94+
cat << INNER_EOF >> ~/.bash_profile
95+
export DB_NAME=${var.db_name}
96+
export DB_USERNAME=${var.db_user}
97+
export DB_PASSWORD=${var.db_password}
98+
export DB_CONNECTION=${alicloud_db_instance.rds_db_instance.connection_string}
99+
export ROS_DEPLOY=true
100+
INNER_EOF
101+
102+
source ~/.bash_profile
103+
104+
curl -fsSL https://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/install-script/develop-your-wechat-mini-program-in-10-minutes/install.sh|bash
105+
106+
## 调整db连接配置
107+
sed -i 's/localhost/${alicloud_db_instance.rds_db_instance.connection_string}/' /var/www/html/wp-config.php
108+
sed -i 's/username_here/${var.db_user}/' /var/www/html/wp-config.php
109+
sed -i 's/password_here/${var.db_password}/' /var/www/html/wp-config.php
110+
sed -i 's/database_name_here/${var.db_name}/' /var/www/html/wp-config.php
111+
112+
cd /var/www/html
113+
sudo cat << INNER_EOF > .htaccess
114+
# BEGIN WordPress
115+
<IfModule mod_rewrite.c>
116+
RewriteEngine On
117+
RewriteCond \%\{HTTP:Authorization\} ^(.*)
118+
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
119+
RewriteBase /
120+
RewriteRule ^index\.php$ - [L]
121+
RewriteCond \%\{REQUEST_FILENAME\} !-f
122+
RewriteCond \%\{REQUEST_FILENAME\} !-d
123+
RewriteRule . /index.php [L]
124+
</IfModule>
125+
# END WordPress
126+
INNER_EOF
127+
sed -i 's/AllowOverride None/AllowOverride All/g' /etc/httpd/conf/httpd.conf
128+
129+
wget https://downloads.wordpress.org/plugin/jwt-authentication-for-wp-rest-api.zip
130+
yum -y install unzip
131+
unzip jwt-authentication-for-wp-rest-api.zip -d jwt-authentication-for-wp-rest-api
132+
cp -r ./jwt-authentication-for-wp-rest-api/jwt-authentication-for-wp-rest-api /var/www/html/wp-content/plugins
133+
rm -rf jwt-authentication-for-wp-rest-api.zip
134+
rm -rf jwt-authentication-for-wp-rest-api
135+
wget https://gitee.com/qin-yangming/open-tools/raw/master/wp-cli.phar
136+
chmod +x wp-cli.phar
137+
mv wp-cli.phar /usr/local/bin/wp
138+
139+
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
140+
sed -i 's/\r$//' /var/www/html/wp-config.php
141+
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
142+
143+
wp plugin activate jwt-authentication-for-wp-rest-api --allow-root --path=/var/www/html
144+
145+
systemctl restart httpd
146+
OUTER_EOF
147+
)
148+
working_dir = "/root"
149+
type = "RunShellScript"
150+
timeout = 3600
151+
}
152+
resource "alicloud_ecs_invocation" "run_command" {
153+
instance_id = [alicloud_instance.ecs_instance.id]
154+
command_id = alicloud_ecs_command.run_command.id
155+
timeouts {
156+
create = "10m"
157+
}
158+
}
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: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# Parameters
2+
variable "region_id" {
3+
description = "请输入地域ID(例如:cn-hangzhou)。"
4+
default = "cn-hangzhou"
5+
}
6+
7+
variable "zone_id" {
8+
type = string
9+
description = "请输入可用区ID(例如:cn-hangzhou-k)。请确保该可用区支持您要创建的ECS资源规格。"
10+
default = "cn-hangzhou-k"
11+
}
12+
13+
variable "vpc_cidr_block" {
14+
description = "请输入VPC的CIDR块(支持的值包括:192.168.0.0/16、172.16.0.0/12、10.0.0.0/8)。这是您的虚拟私有云的地址范围。"
15+
default = "192.168.0.0/16"
16+
validation {
17+
condition = contains(["192.168.0.0/16", "172.16.0.0/12", "10.0.0.0/8"], var.vpc_cidr_block)
18+
error_message = "无效的VPC CIDR块,请检查并重新输入。"
19+
}
20+
}
21+
22+
variable "vswitch_cidr_block" {
23+
description = "请输入交换机的CIDR块(例如:192.168.0.0/24)。这是您虚拟交换机的地址范围。"
24+
default = "192.168.0.0/24"
25+
}
26+
27+
variable "ecs_instance_type" {
28+
description = "请输入ECS实例类型(例如:ecs.e-c1m2.large)。请根据实际需求选择合适的实例规格。"
29+
default = "ecs.e-c1m2.large"
30+
}
31+
32+
variable "ecs_instance_password" {
33+
description = "请输入服务器登录密码。密码长度为8-30位,必须包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*_-+=|{}[]:;'<>,.?/)。"
34+
type = string
35+
sensitive = true
36+
}
37+
38+
variable "db_instance_class" {
39+
description = "请输入RDS实例规格(例如:mysql.n2m.medium.2c)。根据您的数据库负载选择合适的规格。"
40+
default = "mysql.n2m.medium.2c"
41+
}
42+
43+
variable "db_name" {
44+
description = "请输入数据库名称(由小写字母、数字及特殊字符 -_ 组成,以字母开头,字母或数字结尾,最多64个字符)。"
45+
default = "wordpress"
46+
validation {
47+
condition = regex("^[a-z][a-z0-9-_]{0,62}[a-z0-9]$", var.db_name) != ""
48+
error_message = "数据库名称格式不正确。名称应由小写字母、数字及特殊字符 -_ 组成,以字母开头,字母或数字结尾,最多64个字符。"
49+
}
50+
}
51+
52+
variable "db_user" {
53+
description = "请输入RDS数据库用户名(长度为2-16个字符,仅允许小写字母、数字和下划线,必须以字母开头,以字母或数字结尾)。"
54+
default = "dbuser"
55+
validation {
56+
condition = regex("^[a-z][a-z0-9_]{1,15}$", var.db_user) != ""
57+
error_message = "用户名格式不正确。用户名长度应为2-16个字符,仅允许小写字母、数字和下划线,必须以字母开头,以字母或数字结尾。"
58+
}
59+
}
60+
61+
variable "db_password" {
62+
description = "请输入RDS数据库密码。密码长度为8-32位,需包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*()_+-=)。如果在本教程中重复配置,请确保 MySQL 数据库密码与模板首次执行时设置的密码完全相同,否则配置结果不可用。"
63+
type = string
64+
sensitive = true
65+
}
66+
67+
variable "word_press_user_name" {
68+
description = "请输入WordPress管理员用户名(建议使用独特的用户名以增强安全性)。"
69+
default = "admin"
70+
}
71+
72+
variable "word_press_password" {
73+
description = "请输入WordPress管理员密码。密码长度为8-32位,需包含大写字母、小写字母、数字和特殊字符(如:!@#$%^&*()_+-=)。"
74+
type = string
75+
sensitive = true
76+
}
77+
78+
variable "word_press_user_email" {
79+
description = "请输入WordPress管理员邮箱(用于系统通知和找回密码)。"
80+
default = "admin@example.com"
81+
}

0 commit comments

Comments
 (0)