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_VPCwyf_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 直接访问互联网,需要同时满足:

  1. EC2 拥有 Public IPv4。
  2. 子网路由表包含 0.0.0.0/0 → Internet Gateway
  3. Internet Gateway 已连接到当前 VPC。
  4. 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 第一次启动时完成以下工作:

  1. 更新 Ubuntu 软件包索引。
  2. 安装 Apache、PHP 和 WordPress 所需扩展。
  3. 启用 Apache Rewrite 模块。
  4. 下载并解压 WordPress。
  5. 创建 wp-config.php
  6. 写入实验使用的数据库名、用户名和密码。
  7. 生成 WordPress Authentication Keys 和 Salts。
  8. 下载 Apache 网站配置。
  9. 创建 WordPress 上传目录。
  10. 设置 WordPress 文件和目录权限。
  11. 重启 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 默认路由的路由表

连接失败时依次检查:

  1. EC2 是否为 Running。
  2. Status checks 是否全部通过。
  3. EC2 是否有 Public IPv4。
  4. 子网是否关联正确的路由表。
  5. 路由表是否包含 0.0.0.0/0 → Internet Gateway
  6. Internet Gateway 是否连接到正确的 VPC。
  7. Security Group 是否允许 TCP 22,且 Source 是否包含 EC2 Instance Connect 托管前缀列表。
  8. 登录用户名是否为 ubuntu
  9. Network ACL 是否允许请求和返回流量。
  10. 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;

这些命令分别用于:

  1. 创建 wordpress 数据库。
  2. 创建只能从本机连接的 wordpress 用户。
  3. 授予该用户对 wordpress 数据库的权限。
  4. 刷新权限。
  5. 退出 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 本身通常不单独按小时收费,但相关资源及数据传输可能收费。

七、实验结束后的资源清理

实验结束且不再使用时,应检查并清理资源:

  1. 终止 EC2 实例。
  2. 如果创建了 RDS,确认是否需要保留快照,然后删除 RDS 实例。
  3. 删除不再需要的 EBS Volume。
  4. 释放不再使用的 Elastic IP。
  5. 删除 Peering Connection。
  6. 删除不再需要的 Security Group。
  7. 删除 Web 子网。
  8. 断开并删除 Internet Gateway。
  9. 删除 wyf_Web_VPC
  10. 如果 wyf_DB_VPC 不是共享资源,可依次删除 DB Subnet Group、DB 私有子网和 wyf_DB_VPC

删除 VPC 前,必须先删除或解除关联其中依赖的资源。

八、实验总结

正常 RDS 方案包括以下操作:

  1. 创建 wyf_DB_VPC,CIDR 为 10.0.0.0/16
  2. 创建两个跨可用区的 DB 私有子网和 DB Subnet Group。
  3. 创建数据库 Security Group 和 RDS 实例。
  4. 创建 wyf_Web_VPCwyf_WebPublic 子网。
  5. 创建并连接 wyf-WebIG
  6. 创建并接受 DBtoWeb Peering Connection。
  7. 配置两个 VPC 的双向 Peering 路由。
  8. 创建 Ubuntu EC2 及其 Security Group。
  9. 通过 User Data 自动安装 Apache、PHP 和 WordPress。
  10. 将 WordPress 配置为通过 RDS Endpoint 访问数据库。
  11. 通过 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 应用

九、参考资料

posted @ 2026-08-28 16:11  万变不离许嵩  阅读(1)  评论(0)    收藏  举报