我正在编写一个Powershell脚本,用一个公共IP来定位所有EC2实例。我知道如何在NetworkInterfaces中获得弹性IP和公共池IP关联。但是,当为公共池IP (而不是EIP)配置的EC2实例被关闭时,公共IP将被释放回池中,并且关联将从NetworkInterface中删除。我似乎在任何地方都找不到任何标志或其他配置来表明,当EC2恢复供电时,它将请求一个新的公共池IP。我需要识别关闭电源的EC2实例,这些实例可能会为安全报告提供公共IP,而不必为它们供电才能找到答案。
例如,这个EC2有一个公用池IP,当它被打开时。然而,当它被关闭时,就像现在一样,关联对象已经和IP一起被删除了。是不是有什么配置会表明它会在启动后获得一个新的公共池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 : {}
...发布于 2020-06-03 20:03:03
确定实例是否具有池式公共ip地址的唯一方法是分析CloudTrail日志。
在创建实例时,将创建一个日志条目。日志中的requestParameters有一个名为networkInterfaceSet的JSON对象,它有一个条目数组,这些条目的键associatePublicIpAddress为true或false。
此时,您无法确定当EC2处于已停止状态时,它是否具有公共IP地址。除非您已经将一个弹性IP链接到实例。
当启动EC2实例时,它可以从子网设置继承公共IP地址的分配,也可以将其设置为启用公共IP,或者禁用。这被记录在云跟踪日志中。
目前,除了云跟踪日志之外,没有其他方法可以更改该行为或查看该行为。
例如,如果子网启用了公共IP,并且在启动EC2实例并显式禁用它时,那么您的实例获得公共ip地址的唯一方法是从快照重新创建实例,或者分配一个弹性IP。如果实例最初是使用公共IP启动的,则无法删除该公共IP。
没有描述-网络接口或描述-实例提供任何元数据与启用或禁用的公共IP地址,不包括弹性IP。
如前所述,确定实例是否具有公共IP的唯一方法是启动实例并查看正在运行的实例元数据。
亚马逊EC2实例IP地址文档声明:
您可以按照以下方式控制实例是否接收公共IP地址:
公共IP地址是从亚马逊的公共IPv4地址池分配给您的实例的,并且不与您的AWS帐户相关联。当公共IP地址与实例断开关联时,它将被释放回公共IPv4地址池,并且不能重用它。
您不能手动关联或断开公共IP地址与实例的关联。相反,在某些情况下,我们从实例中释放公共IP地址,或者为其分配一个新的IP地址:
如果您需要一个可以根据需要与实例相关联的持久公共IP地址,则可以使用弹性IP地址。
实验
我在子网中创建了一个EC2实例,其中启用了公共IP地址的分配。我将EC2实例设置为在启动时分配公共IP地址。更改子网自动赋值没有任何影响。我重复了这个过程,这一次允许使用子网的设置来创建EC2实例。我禁用了子网中的自动分配。该实例是在没有公共IP的情况下创建的。然后,我在子网上启用了自动分配,并停止并启动了实例。没有分配公共IP地址。
因此,基于上述文件和我的实验。池公共IP地址的分配是在EC2实例启动时决定的。这是不能改变的。我运行了“描述-网络-接口”、“描述-实例CLI”命令来获取ENI的详细信息,而且没有元数据提供标志来指示在实例启动时将分配公共IP地址。我唯一能找到任何信息的地方就是CloudTrail日志。
如果您正在使用AWS最佳实践,则应该使用EC2启动CloudFormation实例。在这里,您将知道EC2实例是否具有公共IP。
或者,您不允许通过使用分配给用户的服务控制策略或策略分配池公用IP地址。然后使用其他方法暴露机器,要么使用弹性IP地址,要么使用负载平衡器。
我认为重新审视您的用例,以了解您正在努力实现的目标是非常重要的。
https://stackoverflow.com/questions/62180815
复制相似问题