EC2 t2.micro实例没有公共DNS。

64

我启动了一个Amazon Web Service(AWS)EC2实例,t2.micro,必须启动到一个VPC中。

VPC的自动分配公共IP设置为“是”。

DNS解析:是

DNS主机名:是

但在EC2仪表板上,该实例仍然没有公共DNS和公共IP。我已经尝试多次重启该实例,但它仍未被分配公共IP。我们AWS账户中提供的5个弹性IP已经用完了。是否可能在不使用弹性IP的情况下为t2.micro实例分配公共IP?

我阅读了这篇文章:EC2 instance has no public DNS,但我没有足够的声望来添加评论,所以我将其作为新问题发布。


我能够启动另一个实例,t1.micro,而不使用VPC,并且在获取公共IP方面没有任何问题。所以我不知道为什么VPC - 自动分配公共IP没有起作用,但我并不为此失眠。 - J21042
15个回答

81

在VPC管理控制台页面上,右键单击VPC行,选择"编辑DNS主机名"。将其设置为"是"。这是允许具有相同VPC的所有实例必需的。

当您在"第3步:配置实例详细信息"中创建新实例时,需要启用"自动分配公共IP地址"

就这样!:-)


3
确实如此。不得不重新发现它。来这里写答案。看到你已经回答了。点赞。评论这段文字。EOF。 - Maxim Veksler
这个解决了我的问题。感谢您的答案。 - David Jeske
好在即使已经创建的虚拟机没有公共 DNS,只要其他配置正常,它也会被分配。 - kit

56
EC2实例没有公共IP地址最常见的原因是您在私有子网中启动EC2实例。私有子网意味着该子网中的任何EC2实例都无法直接从公共互联网进行寻址。换句话说,根据定义,私有子网中的EC2实例不能具有公共IP地址。
这就解释了为什么勾选“公共IP地址”没有效果,以及为什么您无法分配弹性IP地址。
您无法将实例从一个子网移动到另一个子网。如果您需要这样做,可以创建您实例的AMI(右键单击EC2实例并单击“创建映像”),然后从该AMI在不同的子网中启动新实例。
要确定子网是否为私有,请查看路由表并查看是否有Internet网关路由。转到VPC > 子网 > 选择子网 > 路由表选项卡。查找类似于igw-***的条目。如果您看到这个,那么它就是公共子网。如果看到类似eni-*** / i-***的内容,则是私有子网。

1
我不能百分之百确定那就是发生的事情,因为我已经删除了使用过的VPC和路由表,但这是我听到的最好的解释。此后,我创建了一个新的t2.micro实例,使用了一个新的VPC,并将“自动分配公共IP”设置为“是”,公共IP正如预期的那样工作。谢谢Josh Padnick。 - J21042
互联网网关实际上并不会为您的实例提供公共IP地址。它只是一个资源,通过它您可以发送和接收与互联网之间的网络流量。尝试将您的实例放置在公共子网中,这是一种将0.0.0.0/0路由到互联网网关的子网。 - Josh Padnick

33

还可以检查:

VPC -> Subnets -> Subnet Actions -> Modify Auto-Assign Public IP

这应该被选择为最正确的答案,因为它可以在未来的实例配置中启用“自动”功能。谢谢伙计! - Alaa Salah
猛撞了将近一个小时的墙,这解决了问题。谢谢。 - pveentjer
创建EC2实例时,请确保将“自动分配公共IPv4地址”设置为“已启用”。 - famzah

13

嗯,回复太多了。全部都是“你做错了什么”的问题。

新闻快讯:AWS并不总是正确的。我已经使用AWS很长时间了。我亲眼见过一些实例无法启动、一些实例无法停止、部署的实例磁盘损坏以及正在运行的实例网络故障。

我从来没有见过公共IP未创建的情况。直到今天早上才发生。现在我可以把它加入列表中。

为了记录 - 这是我验证过的:

  • 群集中有三个相同的实例
  • 所有实例都在同一个可用区
  • 所有实例都有相同的VPC
  • VPC DNS设置正确(启用解析/主机名)
  • 所有实例都有相同的子网
  • 子网具有:a) 公共路由表; b) 启用创建公共IP的选项
  • 子网中有足够的IP空间

三个实例中有两个收到了公共IP,第三个则没有。

因此,对于将来阅读这篇文章的其他人:不,你不是疯了。是的,AWS可能出了问题。

在我们的情况下,手动终止了出问题的实例并发起了一个新的群集来“解决”该问题。

我点赞了那个回答,表明从一个已停止的实例启动"类似于此"的操作会影响公共IP。不是因为它是正确的答案(它并不是),而是因为它展示了对于一个难以解释的情况具有令人钦佩的反应:试错/实验。像老生常谈的“咦,如果我试试这个会发生什么…”。作为云计算专业人员:如果所有其他标准故障排除步骤都失败了,唯一的替代方案是销毁实例(或子网、Lambda函数、DynamoDb或SNS队列;无论是哪个出现问题的资源),那么最好考虑从其他角度尝试其它行动。

换句话说:保持开放的心态


感谢您分享这个并拯救了我的理智。 - Neil
我希望我能给这个答案一个奖章。我刚刚终止了我的实例,并使用相同的terraform模板重新启动了完全相同的实例。现在它有公共IP地址了。mofos - Red Bottle

12
今天遇到了同样的问题。我的EC2实例没有公共DNS,因此我无法通过ssh连接。
我尝试并成功执行以下步骤:
- 转至VPC > Internet Gateways:确保已创建Internet Gateway并将其附加到EC2的VPC。 - 转至VPC > Route Tables,选择一个VPC路由,导航到Routes选项卡:添加一个新规则,包括: ++ 目标:0.0.0.0/0 ++ 目标:选择已创建的Internet Gateway - 转至VPC > Subnet > Route Table选项卡:单击编辑,更改为上述目标为0.0.0.0/0的路由表。
完成。

这些是我所采取的唯一步骤,才使它正常工作。如果没有编辑路由表的这一步骤,即使显示实例具有公共DNS地址,也无法连接。+1 - Arnaud A

7

前往VPC -> 子网,并确保自动分配公共IPv4地址设置为“是”


这对我有效。 - fudu

6

有很多可能的原因,请检查以下内容。

您需要创建一个 VPC。

DNS 解析和 DNS 主机名应该已启用。

Choose your VPC -> Actions -> Edit DNS resolution -> enable
Choose your VPC -> Actions -> Edit DNS hostnames -> enable

进入VPC,您可能需要一个私有和公共子网。

在私有子网中,您需要有一个与此相关联的NAT网关。 在公共子网中,您需要有一个与此相关联的Internet网关。

您需要为公共子网启用自动分配IP。

Choose the public subnet -> Actions -> Modify auto-assign IP settings -> enable

在第三步:配置实例详细信息中启动新实例时,您应该选择您的VPC和公共子网。在“自动分配公共IP”部分中选择“使用子网设置(已启用)”

我认为这应该可以解决您的问题...


就是这样了。谢谢。 - coder_3476

3
我遇到了同样的问题。原因是我使用了一个未与子网关联的路由表。
更改子网后,我的实例被分配了公共IP地址。
请参考以下截图:enter image description here

2
当我从一个停止的实例使用“启动更多类似实例”选项时,我会得到一个没有公共IP的新实例。但是如果我从正在运行的实例中使用“启动更多类似实例”,则新实例将具有公共IP。

2

很可能公共子网没有启用“自动分配IPv4”功能。它被选中为“否”。在实例创建过程中,默认选项为“使用子网设置(已启用)”。这就是为什么新发出的实例无法获取公共IP地址的原因。

进入VPC控制台,点击子网。选择一个公共子网并从操作列表中选择修改自动分配IP设置并勾选Auto-assign IPv4。保存更改后,您的实例将自动获得公共IP。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接