1. 概述

网络配置是构建可扩展、高可用云架构的核心部分。理解各类网络组件的作用,有助于我们更高效地配置网络资源。其中,IP 地址的分配是网络配置中极为关键的一环。

本文将介绍 AWS 中 EC2 实例的 IP 地址类型,解释 VPC 的概念,并演示如何防止 EC2 实例重启后 IP 地址发生变动。

2. 什么是 AWS EC2?

EC2 是 AWS 提供的一项计算服务,允许我们按需创建虚拟计算资源。一个 EC2 实例本质上就是一个运行在 AWS 云中的虚拟服务器。

它具备传统服务器的特性,例如硬件资源、操作系统镜像、应用部署和网络配置。不同之处在于,EC2 实例的所有资源都是由虚拟化软件(Hypervisor)创建的,底层物理资源被抽象化。

我们可以使用 AWS CLI 快速创建一个 EC2 实例,并指定其配置:

$ aws ec2 run-instances --image-id ami-0866a3c8686eaeeba --count 1 --instance-type t2.micro --key-name MyKey \
--security-group-ids sg-0610f6319ad5ffb81 --subnet-id subnet-02e1541228f5fd7fb

aws ec2 run-instances 命令用于创建新实例。命令参数说明如下:

  • --image-id:指定实例使用的镜像,如 ami-0866a3c8686eaeeba 是一个 Ubuntu 镜像
  • --instance-type:指定实例类型,决定资源大小(如 CPU、内存)
  • --security-group-ids:绑定一个或多个安全组
  • --subnet-id:指定该实例所在的子网

创建完成后,我们可以在控制台查看该实例的配置信息:

Ec2 instance configuration

如图所示,该 EC2 实例的配置与 CLI 命令中指定的完全一致。

3. 什么是 AWS VPC?

AWS VPC(Virtual Private Cloud)是 AWS 提供的逻辑隔离网络空间,我们可以在其中部署各种资源。

创建 VPC 时,需要指定一个 CIDR 块,所有加入该 VPC 的资源将从这个 CIDR 块中分配 IP 地址。默认情况下,VPC 内的资源在未被安全策略限制时可以互相通信。

一个 VPC 可以包含多个子网(Subnet),每个子网都有自己的 IP 地址范围,必须在 VPC 的 CIDR 块范围内。资源必须挂载到某个子网才能接入 VPC。

以之前创建的 EC2 实例为例,当我们指定子网 subnet-02e1541228f5fd7fb 时,实例自动归属到一个 VPC:

EC2 VPC configuration

该实例属于 VPC vpc-0450420a8fe64bad2,而该 VPC 包含了我们使用的子网:

subnet is associated with VPC

可见,子网是 VPC 的一部分,实例挂载到子网后就自动加入 VPC。

4. EC2 实例的 IP 类型

EC2 实例需要 IP 地址进行网络通信,AWS 提供了多种 IP 地址类型以适应不同场景。

4.1. 私有 IP(Private IP)

私有 IP 用于同一 VPC 内部资源之间的通信。它从 VPC 的 CIDR 块中分配,类似于传统服务器上网络接口的 IP 地址。

私有 IP 在实例启动时自动分配,即使实例重启也不会变化

我们可以在控制台查看实例的私有 IP:

EC2 instance private IP

当前实例的私有 IP 为 172.31.80.128,属于子网 subnet-02e1541228f5fd7fb 的 CIDR 范围。

4.2. 公共 IP(Public IP)

公共 IP 用于让 EC2 实例访问互联网。它在启动实例时,如果启用了 Auto-assign Public IP 选项,就会自动分配。

⚠️ 与私有 IP 不同,公共 IP 是非持久的,当实例被停止再启动时会重新分配。

我们可以在控制台查看实例的公共 IP:

EC2 instance public IP

当前实例的公共 IP 为 3.95.135.253

尝试停止并重启实例:

$ aws ec2 stop-instances --instance-ids i-0b0921561e9b435b1
$ aws ec2 start-instances --instance-ids i-0b0921561e9b435b1

再次查看公共 IP:

Stop and start EC2 changes its public IP

可见,重启后公共 IP 已经改变。

4.3. 弹性 IP(Elastic IP)

弹性 IP 也用于 EC2 实例访问互联网,但由我们手动创建并绑定到指定实例,不会像公共 IP 那样自动分配。

弹性 IP 的最大优势是即使实例重启也不会变化,除非我们主动解除绑定。

分配一个弹性 IP:

$ aws ec2 allocate-address
{
    "AllocationId": "eipalloc-04807c763484bbf59",
    "PublicIpv4Pool": "amazon",
    "NetworkBorderGroup": "us-east-1",
    "Domain": "vpc",
    "PublicIp": "44.218.37.189"
}

输出中包含分配 ID 和 IP 地址 44.218.37.189

将其绑定到实例:

$ aws ec2 associate-address --instance-id i-0b0921561e9b435b1 --allocation-id eipalloc-04807c763484bbf59
{
    "AssociationId": "eipassoc-0ffe47ecfcb0cb990"
}

绑定成功后,控制台显示如下:

Assign elastic IP to EC2

再次停止并启动实例:

$ aws ec2 stop-instances --instance-ids i-0b0921561e9b435b1
$ aws ec2 start-instances --instance-ids i-0b0921561e9b435b1

查看弹性 IP:

Elastic IP doesn't change with reboot

重启后,弹性 IP 依然保持不变,并且替代了原有的自动分配公共 IP。

5. 总结

本文介绍了 AWS EC2 实例的 IP 类型及其特点:

  • 私有 IP:仅用于 VPC 内部通信,重启不变
  • 公共 IP:自动分配,用于访问互联网,但重启后会变化
  • 弹性 IP:手动分配,静态 IP,重启后不变

如果你的应用需要稳定的公网 IP,例如用于 DNS、API 接口等,建议使用弹性 IP。这样即使实例重启,IP 也不会变化,避免服务中断。


原始标题:Prevent EC2 Instance From Changing IP Address After Restart