AWS-VPC-EC2-WordPress实践记录
从零搭建 AWS VPC、EC2 并部署 WordPress:实验记录
一、实验目标
本次实验将在 AWS 中手动创建两套 VPC 网络,通过 VPC Peering 打通网络,然后在 Ubuntu EC2 上部署 WordPress。

涉及的主要资源包括:
- VPC
- Subnet
- Internet Gateway
- Route Table
- VPC Peering
- Security Group
- EC2
- RDS(正常方案)
- MySQL(无法创建 RDS 时安装在 EC2 上)
二、实验网络结构
计划搭建的网络结构如下:
Internet
│
Internet Gateway:wyf-WebIG
│
wyf_Web_VPC(192.168.0.0/16)
│
wyf_WebPublic(192.168.0.0/24)
│
EC2:wyf-web-wordpress
│
VPC Peering:DBtoWeb
│
wyf_DB_VPC(10.0.0.0/16)
├── wyf-DB-subnet1(10.0.1.0/24,不同可用区)
├── wyf-DB-subnet2(10.0.2.0/24,不同可用区)
└── DB Subnet Group:wyf-db-subnet-group
│
RDS:wyf-wordpress-db
由于本账号没有创建或修改 RDS 数据库实例的权限,实验最后改为在 WordPress 所在的 EC2 上安装 MySQL:
Internet
│
EC2
├── Apache
├── PHP
├── WordPress
└── MySQL
这可以让 WordPress 正常运行,但它与“EC2 通过 VPC Peering 访问 RDS”不是同一种架构。改用本地 MySQL 后,WordPress 实际上不再使用 VPC Peering。
教程中的 RDS 实例已经提前准备好。为了让流程更完整,下面先按使用 RDS 的正常方案记录全部步骤,并补充 DB 私有子网、DB Subnet Group 和 RDS 的创建过程。如果没有权限创建 RDS,可以改用后文的 EC2 本地 MySQL 方案。
三、正常操作步骤(RDS 方案)
第 1 步:创建 wyf_DB_VPC
选择“仅创建 VPC”,填写:
Name tag:wyf_DB_VPC
IPv4 CIDR:10.0.0.0/16
AWS 会同时为 VPC 创建一些默认网络资源,包括:
- Main Route Table
- Default Network ACL
- Default Security Group
- 一条
10.0.0.0/16 → local的本地路由
local 路由用于当前 VPC 内部的网络通信。
如果使用 RDS,数据库实例及其 DB Subnet Group 应位于 wyf_DB_VPC 中。数据库通常放在私有子网中,不直接暴露到互联网。
第 2 步:创建 DB 私有子网
在 wyf_DB_VPC 中创建两个位于不同可用区的私有子网:
Subnet name:wyf-DB-subnet1
Availability Zone:任选
IPv4 subnet CIDR block:10.0.1.0/24
Subnet name:wyf-DB-subnet2
Availability Zone:选择与第一个子网不同的可用区
IPv4 subnet CIDR block:10.0.2.0/24
Auto-assign public IPv4:Disable
这两个子网不配置指向 Internet Gateway 的默认路由,因此作为 RDS 私有子网使用。
第 3 步:创建 DB Subnet Group
创建 RDS DB Subnet Group,填写:
Name:wyf-db-subnet-group
Description:Private subnets for WordPress RDS
VPC:wyf_DB_VPC
Subnets:wyf-DB-subnet1、wyf-DB-subnet2
DB Subnet Group 决定 RDS 可以使用哪些子网。组内子网需要覆盖至少两个不同的可用区。
第 4 步:创建数据库 Security Group
在 wyf_DB_VPC 中创建 Security Group,填写:
Security group name:wyf-DB-SG
Description:Allow MySQL access from Web VPC
VPC:wyf_DB_VPC
添加 Inbound rule:
Type:MySQL/Aurora
Protocol:TCP
Port:3306
Source:192.168.0.0/16
该规则允许来自 wyf_Web_VPC 网段的流量访问 MySQL 3306 端口。不要将数据库端口直接开放给 0.0.0.0/0。
第 5 步:创建 RDS 实例
教程中的 RDS 实例已经提前准备好。如果从零搭建,可创建 MySQL RDS 并填写:
Engine:MySQL
DB instance identifier:wyf-wordpress-db
Master username:自行设置并记录
Master password:自行设置并记录
Initial database name:wordpress
VPC:wyf_DB_VPC
DB Subnet Group:wyf-db-subnet-group
Public access:No
VPC Security Group:wyf-DB-SG
Port:3306
实例规格和存储容量根据预算选择。创建完成后记录 RDS Endpoint,后续需要将其写入 WordPress 配置。
第 6 步:创建 Web VPC
填写:
Name tag:wyf_Web_VPC
IPv4 CIDR:192.168.0.0/16
wyf_DB_VPC 和 wyf_Web_VPC 的 CIDR 不重叠:
wyf_DB_VPC: 10.0.0.0/16
wyf_Web_VPC:192.168.0.0/16
因此,这两个 VPC 可以建立 VPC Peering。
第 7 步:创建 Web 公有子网
填写:
VPC:wyf_Web_VPC
Subnet name:wyf_WebPublic
Availability Zone:任选
IPv4 subnet CIDR block:192.168.0.0/24
刚创建的子网还不一定是公有子网。它是否属于公有子网,取决于其关联的路由表中是否存在指向 Internet Gateway 的默认路由。
第 8 步:创建并连接 Internet Gateway
填写:
Name tag:wyf-WebIG
创建后,将 wyf-WebIG 连接到 wyf_Web_VPC。
Internet Gateway 是 VPC 与互联网之间的通道,但仅仅创建并连接 Internet Gateway 还不够,还需要在路由表中添加相应路由。
第 9 步:配置 Web 公有路由表
找到 wyf_Web_VPC 的 Main Route Table。
添加以下路由:
Destination:0.0.0.0/0
Target:Internet Gateway
Internet Gateway:wyf-WebIG
保存后,路由表中至少应包含:
192.168.0.0/16 → local
0.0.0.0/0 → wyf-WebIG
两条路由分别表示:
- 访问
192.168.0.0/16时,在当前 VPC 内部转发。 - 访问其他 IPv4 地址时,通过
wyf-WebIG前往互联网。
本实验修改的是 wyf_Web_VPC 的 Main Route Table,wyf_WebPublic 会自动使用该路由表,无需额外关联。
子网未显式关联其他路由表时,会使用所属 VPC 的 Main Route Table。只有使用自定义路由表时,才需要手动将其关联到对应子网。
第 10 步:创建 VPC Peering Connection
填写:
Name:DBtoWeb
Requester VPC:wyf_DB_VPC
Accepter VPC:wyf_Web_VPC
创建后,接受 DBtoWeb Peering 请求。
为什么 Requester 是 wyf_DB_VPC?
Requester 代表发起 Peering 请求的一方,Accepter 代表接受请求的一方。
连接被接受后,Peering Connection 本身不是单向连接。最终能否双向通信,由两边的路由表、Security Group 和 Network ACL 决定。
因此,下面两种方式在连接建立后的网络能力没有本质区别:
Requester:wyf_DB_VPC
Accepter:wyf_Web_VPC
或者:
Requester:wyf_Web_VPC
Accepter:wyf_DB_VPC
本实验使用 wyf_DB_VPC 作为 Requester,只是创建请求时选择由数据库网络一方发起,不是 AWS 的强制要求。
第 11 步:配置 Peering 双向路由
Peering Connection 创建并接受后,不会自动修改两个 VPC 的路由表,需要分别配置去程和回程路由。
11.1 配置 wyf_Web_VPC 路由
在 wyf_Web_VPC 的 Main Route Table 中添加:
Destination:10.0.0.0/16
Target:Peering Connection
Peering Connection:DBtoWeb
这条路由表示:
访问 wyf_DB_VPC 网段时,通过 DBtoWeb。
Web 公有路由表最终可能包含:
192.168.0.0/16 → local
10.0.0.0/16 → DBtoWeb
0.0.0.0/0 → wyf-WebIG
AWS 会优先匹配更具体的路由:
- 访问
10.0.0.0/16时,流量通过 Peering。 - 访问
192.168.x.x时,流量留在 Web VPC 内。 - 访问其他 IPv4 地址时,流量通过 Internet Gateway。
11.2 配置 wyf_DB_VPC 路由
本实验中的两个 DB 私有子网使用 wyf_DB_VPC 的 Main Route Table。在该路由表中添加:
Destination:192.168.0.0/16
Target:Peering Connection
Peering Connection:DBtoWeb
这条路由负责让 wyf_DB_VPC 中的返回流量通过 Peering 回到 Web VPC。
Peering Connection 只提供网络路径。数据库访问还依赖第 4 步创建并关联到 RDS 的 wyf-DB-SG。
第 12 步:创建 Ubuntu EC2
12.1 基本配置
填写:
Name:wyf-web-wordpress
Quick Start:Ubuntu
AMI:Ubuntu Server 24.04 LTS
Instance type:t3.micro
12.2 Key Pair
本实验可以选择不创建 Key Pair,但需要通过 EC2 Instance Connect、Session Manager 或其他已经配置好的方式登录。
如果需要从本地终端使用传统 SSH,通常应该创建并保存 Key Pair。
12.3 Network Settings
填写:
VPC:wyf_Web_VPC
Subnet:wyf_WebPublic
Auto-assign public IP:Enable
启用自动分配公网 IP 后,EC2 会获得一个 Public IPv4。
EC2 若要通过 Internet Gateway 直接访问互联网,需要同时满足:
- EC2 拥有 Public IPv4。
- 子网路由表包含
0.0.0.0/0 → Internet Gateway。 - Internet Gateway 已连接到当前 VPC。
- Security Group 和 Network ACL 允许相关流量。
12.4 创建 Security Group
创建 Security Group,并在 Inbound Security Group Rules 中增加:
Type:HTTP
Source type:Custom
Source:0.0.0.0/0
这条规则表示所有 IPv4 地址都可以访问该网站的 HTTP 80 端口。
(EC2 创建完成后,本次实验中这条 Security Group 的名称为 launch-wizard-6。)
如果通过 AWS 控制台使用 EC2 Instance Connect,还需要允许 TCP 22,Source 使用当前区域的 com.amazonaws.<region>.ec2-instance-connect 托管前缀列表。从本地终端使用 SSH 时,Source 使用本机公网 IP。
为了安全,不建议长期将 SSH 端口对 0.0.0.0/0 开放。
12.5 添加 User Data
注意:以下脚本中的弱密码和明文数据库凭据仅用于本次实验,不应直接用于生产环境。
在 Advanced details 的 User data 中上传 wordpress-user-data.sh,内容如下:
#!/bin/bash
sudo apt update
sudo apt install apache2 php libapache2-mod-php php-mysql php-curl php-gd php-mbstring php-xml php-xmlrpc php-soap php-intl php-zip unzip -y
sudo ufw allow in "Apache"
sudo a2enmod rewrite
systemctl restart apache2
cd /tmp/ && wget https://wordpress.org/latest.zip
unzip latest.zip -d /var/www
mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php
cd /var/www/wordpress/
perl -pi -e "s/database_name_here/wordpress/g" wp-config.php
perl -pi -e "s/username_here/wordpress/g" wp-config.php
perl -pi -e "s/password_here/wordpress/g" wp-config.php
perl -i -pe'
BEGIN {
@chars = ("a" .. "z", "A" .. "Z", 0 .. 9);
push @chars, split //, "!@#$%^&*()-_ []{}<>~\`+=,.;:/?|";
sub salt { join "", map $chars[rand @chars], 1 .. 64 }
}
s/put your unique phrase here/salt()/ge
' wp-config.php
wget https://raw.githubusercontent.com/ACloudGuru-Resources/course-aws-certified-solutions-architect-associate/main/lab/5/000-default.conf
mkdir -p wp-content/uploads
chown -R www-data:www-data /var/www/wordpress/
chmod 775 wp-content/uploads
mv 000-default.conf /etc/apache2/sites-enabled/
systemctl restart apache2
该脚本会在 EC2 第一次启动时完成以下工作:
- 更新 Ubuntu 软件包索引。
- 安装 Apache、PHP 和 WordPress 所需扩展。
- 启用 Apache Rewrite 模块。
- 下载并解压 WordPress。
- 创建
wp-config.php。 - 写入实验使用的数据库名、用户名和密码。
- 生成 WordPress Authentication Keys 和 Salts。
- 下载 Apache 网站配置。
- 创建 WordPress 上传目录。
- 设置 WordPress 文件和目录权限。
- 重启 Apache。
User Data 默认由 cloud-init 以 root 身份执行,通常只在实例首次启动时自动运行。
EC2 启动后,可以通过下面的命令检查脚本执行状态:
cloud-init status
sudo less /var/log/cloud-init-output.log
脚本会在创建上传目录后统一设置 WordPress 目录的所有者,确保 Apache 有权写入上传目录。
确认所有配置后启动实例。
第 13 步:连接 EC2
等待 EC2 显示:
Instance state:Running
Status checks:全部通过
选择 wyf-web-wordpress,使用 EC2 Instance Connect 连接。
Ubuntu AMI 的默认用户名通常是:
ubuntu
ec2-user 通常用于 Amazon Linux。如果 Ubuntu 实例错误地使用 ec2-user,可能会导致连接失败。
如果页面提示:
Instance is not in a public subnet
需要检查 EC2 所在子网实际关联的路由表:
Subnet:wyf_WebPublic
Route table:选择包含 IGW 默认路由的路由表
连接失败时依次检查:
- EC2 是否为 Running。
- Status checks 是否全部通过。
- EC2 是否有 Public IPv4。
- 子网是否关联正确的路由表。
- 路由表是否包含
0.0.0.0/0 → Internet Gateway。 - Internet Gateway 是否连接到正确的 VPC。
- Security Group 是否允许 TCP 22,且 Source 是否包含 EC2 Instance Connect 托管前缀列表。
- 登录用户名是否为
ubuntu。 - Network ACL 是否允许请求和返回流量。
- IAM 身份是否具有 EC2 Instance Connect 权限。
第 14 步:配置 WordPress 连接 RDS
连接 EC2 后,进入 WordPress 目录:
cd /var/www/wordpress
打开配置文件:
sudo vim wp-config.php
User Data 已经将数据库配置替换为:
define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpress');
define('DB_PASSWORD', 'wordpress');
define('DB_HOST', 'localhost');
正常方案使用 RDS,因此需要将数据库地址、用户名和密码修改为创建 RDS 时设置并记录的值:
define('DB_NAME', 'wordpress');
define('DB_USER', 'RDS数据库用户名');
define('DB_PASSWORD', 'RDS数据库密码');
define('DB_HOST', 'RDS数据库的Endpoint');
RDS Endpoint 可在数据库的 Connectivity & security 中查看。
同时确认:
- RDS 中已经存在
wordpress数据库。 - 数据库用户名和密码正确。
- RDS Security Group 允许 EC2 访问数据库端口。
- 两边 Peering 路由配置正确。
- Network ACL 没有阻止流量。
第 15 步:访问 WordPress
使用 EC2 的公网 IPv4 地址在浏览器中访问:
http://<EC2的Public-IPv4>
如果 Apache、PHP、WordPress 和 RDS MySQL 均正常运行,将看到 WordPress 初始化页面。
按照页面提示填写:
- 网站标题
- 管理员用户名
- 管理员密码
- 管理员邮箱
完成后即可进入 WordPress。
四、无法创建 RDS 时的替代方案
如果账号没有权限创建或配置 RDS,可以在 WordPress 所在的 EC2 上安装 MySQL。此时 WordPress 不再通过 VPC Peering 访问数据库,wyf_DB_VPC、DB Subnet Group、RDS Security Group 和双向 Peering 路由不会参与实际的数据库连接。
更新软件包索引:
sudo apt update
安装 MySQL:
sudo apt install mysql-server -y
设置 MySQL 开机启动,并立即启动:
sudo systemctl enable --now mysql
查看 MySQL 状态:
sudo systemctl status mysql --no-pager
看到下面的状态,说明 MySQL 正常运行:
active (running)
进入 MySQL:
sudo mysql
在 mysql> 提示符中依次执行:
CREATE DATABASE wordpress;
CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'wordpress';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'localhost';
FLUSH PRIVILEGES;
EXIT;
这些命令分别用于:
- 创建
wordpress数据库。 - 创建只能从本机连接的
wordpress用户。 - 授予该用户对
wordpress数据库的权限。 - 刷新权限。
- 退出 MySQL。
由于 MySQL 和 WordPress 位于同一台 EC2,所以 wp-config.php 保持以下配置:
define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpress');
define('DB_PASSWORD', 'wordpress');
define('DB_HOST', 'localhost');
重启 Apache:
sudo systemctl restart apache2
完成后,仍然按照第 15 步使用 EC2 的公网 IPv4 地址访问 WordPress。
五、常见问题
1. EC2 有公网 IP但无法连接
重点检查:
子网实际关联的路由表
路由表应包含:
0.0.0.0/0 → wyf-WebIG
同时确认:
- Internet Gateway 已连接到
wyf_Web_VPC。 - Security Group 允许 SSH。
- Ubuntu 登录用户名为
ubuntu。
2. 可以连接 EC2,但网页无法打开
查看 Apache 状态:
sudo systemctl status apache2 --no-pager
检查 80 端口:
sudo ss -lntp | grep ':80'
查看 Apache 错误日志:
sudo tail -n 100 /var/log/apache2/error.log
同时确认 launch-wizard-6 中包含:
HTTP TCP 80,Source 0.0.0.0/0
3. WordPress 显示数据库连接错误
确认 wp-config.php 中的数据库名、用户名、密码和 Host 与实际数据库配置一致。
如果使用 EC2 本地 MySQL,查看服务状态:
sudo systemctl status mysql --no-pager
如果使用 RDS,还要检查:
- RDS Endpoint
- RDS 端口
- RDS Security Group
- Peering 状态
- 双向路由
4. WordPress 无法上传文件
执行:
sudo chown -R www-data:www-data /var/www/wordpress/wp-content/uploads
sudo chmod 775 /var/www/wordpress/wp-content/uploads
六、安全与费用注意事项
本实验用于学习,以下配置不适合直接用于生产环境:
- User Data 和本地 MySQL 替代方案使用固定弱密码
wordpress。 - 本地 MySQL 的数据库凭据以明文写在 User Data 中。
- 网站只使用 HTTP,没有配置 HTTPS。
- SSH 端口不应长期向
0.0.0.0/0开放。 - 本地 MySQL 替代方案将 Apache、WordPress 和 MySQL 全部运行在同一台 EC2,缺少故障隔离。
- WordPress 和外部配置文件没有锁定下载版本。
生产环境建议:
- 使用强密码或 AWS Secrets Manager。
- 使用 RDS,并将数据库放入私有子网。
- RDS Security Group 只允许应用服务器访问。
- 使用 HTTPS。
- 使用 Session Manager 或严格限制 SSH 来源。
- 配置备份、日志、监控和系统更新。
下列资源可能产生费用:
- EC2
- EBS
- Public IPv4 或 Elastic IP
- RDS
- 跨可用区或跨 VPC 的数据传输
VPC、Subnet、Route Table、Security Group 和普通 Internet Gateway 本身通常不单独按小时收费,但相关资源及数据传输可能收费。
七、实验结束后的资源清理
实验结束且不再使用时,应检查并清理资源:
- 终止 EC2 实例。
- 如果创建了 RDS,确认是否需要保留快照,然后删除 RDS 实例。
- 删除不再需要的 EBS Volume。
- 释放不再使用的 Elastic IP。
- 删除 Peering Connection。
- 删除不再需要的 Security Group。
- 删除 Web 子网。
- 断开并删除 Internet Gateway。
- 删除
wyf_Web_VPC。 - 如果
wyf_DB_VPC不是共享资源,可依次删除 DB Subnet Group、DB 私有子网和wyf_DB_VPC。
删除 VPC 前,必须先删除或解除关联其中依赖的资源。
八、实验总结
正常 RDS 方案包括以下操作:
- 创建
wyf_DB_VPC,CIDR 为10.0.0.0/16。 - 创建两个跨可用区的 DB 私有子网和 DB Subnet Group。
- 创建数据库 Security Group 和 RDS 实例。
- 创建
wyf_Web_VPC和wyf_WebPublic子网。 - 创建并连接
wyf-WebIG。 - 创建并接受
DBtoWebPeering Connection。 - 配置两个 VPC 的双向 Peering 路由。
- 创建 Ubuntu EC2 及其 Security Group。
- 通过 User Data 自动安装 Apache、PHP 和 WordPress。
- 将 WordPress 配置为通过 RDS Endpoint 访问数据库。
- 通过 EC2 公网 IPv4 访问 WordPress。
如果无法创建 RDS,可以在 EC2 上安装 MySQL,并将 DB_HOST 保持为 localhost。本账号实际采用了这一替代方案,因此数据库连接未使用 VPC Peering。
整个实验中最关键的网络关系是:
VPC 提供网络边界
Subnet 划分网络范围
Route Table 决定流量去向
Internet Gateway 提供互联网通路
Security Group 决定流量是否放行
Public IPv4 使 EC2 可以在互联网中被寻址
VPC Peering 为两个 VPC 提供私网通信路径
EC2 负责运行 WordPress 应用

浙公网安备 33010602011771号