如何检测断电的 EC2 实例在重新启动时是否具有 AWS Public 池 IP

How to Detect if a Powered Down EC2 Instance will have an AWS Public Pool IP When Powered Back on

我正在编写一个 Powershell 脚本来定位所有具有 Public IP 的 EC2 实例。我知道如何在网络接口中获取弹性 IP 和 Public 池 IP 关联。但是,当为 Public 池 IP(不是 EIP)配置的 EC2 实例断电时,Public IP 被释放回池中,并且关联从 NetworkInterface 中删除。我似乎无法在任何地方找到任何标志或其他配置,表明当 EC2 重新启动时它会请求一个新的 Public 池 IP。我需要确定关闭的 EC2 实例,这些实例可能会提供 Public IP 用于安全报告,而无需打开它们的电源来找出答案。

例如,此 EC2 在开机时有一个 Public 池 IP。但是,当它断电时,就像现在一样,关联对象已与 IP 一起被删除。是不是某处的某些配置表明它将在启动时获得新的 Public 池 IP?

PS X:\projects\GACM\cloudsecurity> (get-ec2instance -instanceid i-99999999999999999 -region us-east-1).instances.networkinterfaces|select *

    Association        :
    Attachment         : Amazon.EC2.Model.InstanceNetworkInterfaceAttachment
    Description        : Primary network interface
    Groups             : {launch-wizard-4}
    Ipv6Addresses      : {}
    ...

确定实例是否具有共用 public IP 地址的唯一方法是分析 CloudTrail 日志。

创建实例时,会创建一个日志条目。日志中的 requestParameters 有一个名为 networkInterfaceSet 的 JSON 对象,它有一个项目数组,这些项目有键 associatePublicIpAddress 是真或假。

此时您无法确定 EC2 在处于停止状态时是否会有 public IP 地址。除非您已将弹性 IP 链接到实例。

启动 EC2 实例时,它可以从子网设置中继承分配的 public IP 地址,或者您可以将其设置为启用或禁用 [​​=45=] IP。这记录在云踪日志中。

目前无法更改该行为或查看云跟踪日志以外的行为。

例如,如果子网启用了 public ip,并且在启动 EC2 实例时您明确禁用它,那么您的实例可以获得 public IP 地址的唯一方法是从快照重新创建实例,或分配弹性 IP。如果实例最初是使用 public IP 启动的,则无法删除 public IP。

describe-network-interfaces 或 describe-instances 均未提供与启用或禁用的 public IP 地址(不包括弹性 IP)有关的任何元数据。

如您所述,确定实例是否具有 public IP 的唯一方法是启动实例并查看 运行 实例元数据。

Amazon EC2 instance IP addressing 文档指出:

You can control whether your instance receives a public IP address as follows:

  • Modifying the public IP addressing attribute of your subnet. For more information, see Modifying the public IPv4 addressing attribute for your subnet in the Amazon VPC User Guide.

  • Enabling or disabling the public IP addressing feature during launch, which overrides the subnet's public IP addressing attribute. For more information, see Assigning a public IPv4 address during instance launch.

A public IP address is assigned to your instance from Amazon's pool of public IPv4 addresses, and is not associated with your AWS account. When a public IP address is disassociated from your instance, it is released back into the public IPv4 address pool, and you cannot reuse it.

You cannot manually associate or disassociate a public IP address from your instance. Instead, in certain cases, we release the public IP address from your instance, or assign it a new one:

  • We release your instance's public IP address when it is stopped, hibernated, or terminated. Your stopped or hibernated instance receives a new public IP address when it is started.
  • We release your instance's public IP address when you associate an Elastic IP address with it. When you disassociate the Elastic IP address from your instance, it receives a new public IP address.

  • If the public IP address of your instance in a VPC has been released, it will not receive a new one if there is more than one network interface attached to your instance.

  • If your instance's public IP address is released while it has a secondary private IP address that is associated with an Elastic IP address, the instance does not receive a new public IP address.

If you require a persistent public IP address that can be associated to and from instances as you require, use an Elastic IP address instead.

实验

我在启用了 public IP 地址分配的子网中创建了一个 EC2 实例。我将 EC2 实例设置为在启动时分配 public IP 地址。更改子网自动分配值没有影响。这次我重复了这个过程,允许使用子网设置创建 EC2 实例。我禁用了子网内的自动分配。正如预期的那样,创建实例时没有使用 public IP。然后我在子网上启用了自动分配,并停止并启动了实例。未分配 public IP 地址。

因此基于上面的文档和我的实验。共用 public IP 地址的分配在 EC2 实例启动时决定。这是无法更改的。我 运行 [describe-network-interfaces, describe-instances] CLI 命令获取 ENI 的详细信息,没有元数据提供一个标志来指示 Public IP 地址将在实例被分配时分配开始了。我唯一能找到任何信息的地方是 CloudTrail 日志。

如果您使用 AWS 最佳实践,EC2 实例应使用 CloudFormation 启动。在这里您将知道 EC2 实例是否具有 public IP。

或者,您不允许使用服务控制策略或分配给用户的策略来分配共用 public IP 地址。然后使用其他方法使用弹性 IP 地址或负载平衡器公开机器。

我认为重新审视您的用例以了解您想要实现的目标很重要。