在 AWS EC2 上自动扩缩容 APISIX 网关
自动扩缩容是一种根据流量负载自动调整网关可用资源的机制,确保在不同的流量负载下保持一致的性能。
本指南将引导你在 EC2 上以 解耦模式 部署 APISIX,为 APISIX 网关(也称为 APISIX 数据平面或 DP)配置自动扩缩容组 (ASG),定义扩缩容策略,并通过简单的负载测试验证扩缩容行为,以便你的网关可以自动响应流量变化。
前置条件
- 一个 AWS 帐户。
- 足够的 IAM 权限来创建和管理以下 AWS 资源:
- EC2 实例
- 自动扩缩容组 (Auto Scaling Groups)
- 启动模板 (Launch Templates)
- 安全组 (Security Groups)
- 确保你在目标 AWS 区域中配置了 VPC,并为你的 EC2 实例配置了必要的子网。
配置安全组
此图直观地显示了 APISIX 及其支持组件之间的流量,突出了每个安全组的目的以及需要配置的规则:
以下安全组配置仅供参考。它们遵循最小权限原则,并假设存在用于向 APISIX DP 实例分发流量的 ALB。你应该根据自己的网络和安全要求调整这些规则。
在 AWS 控制台中,导航到 EC2 > Security Groups。创建以下安全组 (SG) 并配置其入站 和出站规则:
1. 应用负载均衡器 (ALB) 安全组
- 入站
- HTTP
80和 HTTPS443来自0.0.0.0/0(任何地方)
- HTTP
- 出站
- 自定义 TCP
9080到 APISIX DP 安全组
- 自定义 TCP
2. APISIX 控制平面 (CP) 安全组
- 入站
- SSH
22来自受信任的来源,例如堡垒机或你自己的 IP 范围 - TCP
9180来自受信任的来源,例如堡垒机或你自己的 APISIX Admin IP 范围
- SSH
- 出站
- 自定义 TCP
2379到 ETCD 安全组
- 自定义 TCP
3. APISIX 数据平面 (DP) 安全组
- 入站
- SSH
22来自受信任的来源,例如堡垒机或你自己的 IP 范围 - 自定义 TCP
9080来自 ALB 安全组
- SSH
- 出站
- 自定义 TCP
2379到 ETCD 安全组 - HTTP
80和 HTTPS443到0.0.0.0/0(任何地方)
- 自定义 TCP
4. etcd 安全组
- 入站
- SSH
22来自受信任的来源,例如堡垒机或你自己的 IP 范围 - 自定义 TCP
2379来自 APISIX CP 安全组 - 自定义 TCP
2379来自 APISIX DP 安全组
- SSH
- 出站
- 自定义 TCP
2379到 APISIX CP 安全组 - 自定义 TCP
2379到 APISIX DP 安全组
- 自定义 TCP

启动 EC2 实例
在本节中,你将启动 EC2 实例并安装 etcd 和 APISIX CP。
为了简单起见,本节将引导你安装单个 etcd 实例和单个 APISIX CP 实例,因为本指南重点关注 DP 自动扩缩容。在生产环境中,建议在集群中运行多个 etcd 节点以确保高可用性和容错能力。
安装使用 amd64 架构上的 Ubuntu EC2 实例。如果你选择不同的 Linux 发行版或架构,请相应调整安装脚本。
你将在后面定义启动模板并使用 ASG 自动创建和扩展 APISIX DP 实例,而不是手动创建 APISIX DP 实例。
etcd
导航到 EC2 并启动一个 EC2 实例以托管 etcd,配置如下:
- AMI (Amazon Machine Image): 选择 Ubuntu。如果愿意,你可以使用不同的 Linux 发行版,但请确保相应调整安装步骤。
- Instance type: 选择适合你工作负载的大小。
- Key pair: 选择现有的密钥对或创 建一个新的密钥对。通过 SSH 连接到 EC2 实例需要此密钥。如果你在没有密钥对的情况下继续操作,你仍然可以使用 AWS 控制台的“连接”选项连接到实例,但无法从本地计算机进行 SSH 访问。
- Network settings: 选择 VPC 并选择现有的 etcd 安全组。
查看你的配置并启动实例。
实例启动后,记下其私有 IP,etcd 和 APISIX 将使用该 IP 进行通信:
# 替换为你的 etcd 实例的私有 IP
ETCD_INSTANCE_PRIVATE_IP=172.31.19.201
连接到实例(使用 SSH 或 AWS 控制台的“连接”选项)并运行以下命令以安装 etcd:
# 下载并解压 etcd
ETCD_VERSION='3.5.4'
wget https://github.com/etcd-io/etcd/releases/download/v${ETCD_VERSION}/etcd-v${ETCD_VERSION}-linux-amd64.tar.gz
tar -xvf etcd-v${ETCD_VERSION}-linux-amd64.tar.gz
# 复制二进制文件到 /usr/bin
cd etcd-v${ETCD_VERSION}-linux-amd64
sudo cp -a etcd etcdctl /usr/bin/
# 启动 etcd
nohup etcd \
--name s1 \
--data-dir /tmp/etcd-data \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://${ETCD_INSTANCE_PRIVATE_IP}:2379 \
>/tmp/etcd.log 2>&1 &
APISIX CP
导航到 EC2 并启动一个 EC2 实例以托管 APISIX CP,配置如下:
- AMI (Amazon Machine Image): 选择 Ubuntu。如果愿意,你可以使用不同的 Linux 发行版,但请确保相应调整安装步骤。
- Instance type: 选择适合你工作负载的大小。
- Key pair: 选择现有的密钥对或创建一个新的密钥对。通过 SSH 连接到 EC2 实例需要此密钥。如果你在没有密钥对的情况下继续操作,你仍然可以使用 AWS 控制台的“连接”选项连接到实例,但无法从本地计算机进行 SSH 访问。
- Network settings: 选择 VPC 并选择现有的 APISIX CP 安全组。
查看你的配置并启动实例。
连接到实例(使用 SSH 或 AWS 控制台的“连接”选项)。运行以下命令以安装 APISIX:
# 添加密钥和仓库 (amd64)
wget -O - http://repos.apiseven.com/pubkey.gpg | sudo apt-key add -
echo "deb http://repos.apiseven.com/packages/debian bullseye main" | sudo tee /etc/apt/sources.list.d/apisix.list
# 更新包并安装 APISIX
sudo apt update
sudo apt install -y apisix=3.14.0-0
编辑 APISIX 配置文件:
sudo vi /usr/local/apisix/conf/config.yaml
更新配置以将此实例配置为控制平面并将其连接到 etcd:
deployment:
role: control_plane
role_control_plane:
config_provider: etcd
etcd:
host:
- http://172.31.19.201:2379 # 替换为你的 etcd 实例 的私有 IP
admin:
admin_key:
- name: admin
key: 'Sup3rs3cretWr1teK3y' # 替换为你的 admin key
role: admin
初始化配置并启动 APISIX 服务器:
sudo apisix init
sudo apisix start
创建启动模板
在本节中,将使用启动模板来定义如何创建 APISIX DP 实例。它包含 ASG 用于启动和管理 DP 实例的实例配置——例如 AMI、实例类型、安全组和启动脚本。
使用启动模板可确保一致地创建所有 DP 实例,并允许 ASG 随着流量变化自动添加或删除实例。
导航到 EC2 > Launch Templates 并使用以下配置创建启动模板:
- Auto Scaling guidance: 启用此选项以指示该模板将由 ASG 使用。
- AMI (Amazon Machine Image): 选择 Ubuntu。如果愿意,你可以使用不同的 Linux 发行版,但请确保相应调整用户数据脚本。
- Instance type: 选择适合你工作负载的大小。
- Network settings: 选择现有的 APISIX DP 安全组。
- Advanced details > User data: 粘贴以下脚本。
#!/bin/bash
set -e
# 替换为你的 etcd 实例的私有 IP
ETCD_IP="172.31.19.201"
APISIX_VERSION="3.14.0-0"
# 添加 APISIX 仓库 (amd64)
wget -O - http://repos.apiseven.com/pubkey.gpg | apt-key add -
echo "deb http://repos.apiseven.com/packages/debian bullseye main" \
> /etc/apt/sources.list.d/apisix.list
# 安装 APISIX
apt update
apt install -y apisix=${APISIX_VERSION}
# 将 APISIX 配置为 DP
cat >/usr/local/apisix/conf/config.yaml <<EOF
deployment:
role: data_plane
role_data_plane:
config_provider: etcd
etcd:
host:
- http://${ETCD_IP}:2379
EOF
# 初始化并启动 APISIX
apisix init
apisix start
查看你的配置并创建模板。

创建自动扩缩容组 (ASG)
自动扩缩容组 (ASG) 根据需求自动调整部署中的 EC2 实例数量。通过使用 ASG,你可以确保 APISIX DP(网关)在高流量期间横向扩展,并在流量减少时缩减,从而保持一致的 API 性能。
导航到 EC2 > Auto Scaling Groups 并使用以下配置创建 ASG:
- Launch Template: 选择上一步中创建的 APISIX DP 实例的启动模板。
- Network Settings: 选择适当的 VPC、可用区和子网。
- Load Balancer: 如果负载均衡器当前不可用,请选择 No Load Balancer,或者如果已配置,请选择适当的负载均衡器和目标组。
- Group size: 将 Desired capacity 设置为 1(根据你的工作负载根据需要进行调整)。
- Scaling:
- 将 Min desired capacity 设置为 1,将 Max desired capacity 设置为 5(根据你的工作负载根据需要进行调整)。
- 选择 Target tracking scaling policy
- Scaling policy name:
Scale on CPU - Target value:
50。这意味着当 CPU 超过 50% 时,ASG 将添加 APISIX DP 实例,而在 CPU 降至 50% 以下时删除实例。
- Scaling policy name:
查看你的配置并创建 ASG。
创建 ASG 后,你应该会看到 ASG 启动一个新的 EC2 实例用于 APISIX DP,以满足所需的容量。

验证 CP 和 DP 连接性
连接到 APISIX CP 的 EC2 实例(使用 SSH 或 AWS 控制台的“连接”选项)。
在实例中,使用 mocking 插件创建一个示例路由,以便对 /200 的请求始终返回 200 响应,而不转发到任何上游:
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: Sup3rs3cretWr1teK3y" \
-d '{
"id": "mocking200",
"uri": "/200",
"plugins": {
"mocking": {
"response_status": 200,
"response_example": "200 OK from mocking plugin"
}
}
}'
接下来,连接到 APISIX DP 的 EC2 实例(使用 SSH 或 AWS 控制台的“连接”选项)。
在实例中,向 /200 路由发送请求:
curl "http://127.0.0.1:9080/200" -i
你应该收到 HTTP/1.1 200 OK 响应。
/200 端点稍后可用于 ALB 健康检查。或者,你可以启用 APISIX 的 Status API(默认端口 7085)并使用 /status 端点进行健康检查。