25

亚马逊只给你一定数量的静态 IP 地址,每个 EC2 实例的本地(私有)IP 可以在机器重启时改变。据我所知,这使得创建一个 EC2 实例相互依赖的稳定平台非常难以使用。

我在网上搜索了很多关于各种解决方案的信息,到目前为止,除了在 EC2 上分配弹性 IP 地址之外,没有任何合理的发现,即使它不是面向公众的。有没有人有任何其他实际上很容易执行的好主意?

谢谢!

请参阅 AWS 团队对问题Static local IP的回复:

EC2 实例的内部 IP 地址是通过 DHCP 分配的。在实例关闭或 DHCP 租约到期时,IP 地址将返回到可用于其他实例的通用 EC2 DHCP 地址池。

无法保证您将在重新启动后获得相同的 DHCP 地址。

编辑:答案是使用 Amazon VPC。除了微不足道的额外设置外,没有任何缺点,因为现在您可以控制路由器。这是一个不同于 AWS 上普通旧 EC2 实例的世界。事实上,VPC 将默认为所有未来的 AWS 设置启用,这是非常必要的。有关更多信息,请参阅此帖子:http ://www.reddit.com/r/aws/comments/1a3n0r/ec2_update_virtual_private_clouds_for_everyone/

4

5 回答 5

16

股票答案是:

  1. 使用AWS VPC,您可以完全控制实例寻址
  2. 使用弹性 IP,当用于 EC2 实例之间的通信时,它将解析为实例的本地地址(不是您所期望的公共地址)
于 2012-05-24T22:49:56.667 回答
13

我偶然发现了第三种选择。Instragram 的人有ec2-ssh 。它是一个全局安装的 python shell 脚本,它可以让你通过标签名称查询你的 ec2 实例的公共 dns,也可以ssh通过标签名称查询。

它的文档几乎不存在。我在下面写下了安装步骤:

要安装 ec2-ssh:

  1. sudo yum install python-boto(ec2 api 的 python 包装器)
  2. git 克隆https://github.com/Instagram/ec2-ssh
  3. 在您的 ~/.bash_profile 中设置您的 AWS 访问密钥和秘密,如下所示:

    导出 AWS_ACCESS_KEY_ID=XYZ123

    导出 AWS_SECRET_ACCESS_KEY=XYZ123

  4. cd进入binrepo的文件夹,会有两个文件:

    ec2-hostec2-ssh

将它们复制到您的/usr/bin/usr/local/bin.

现在你可以做一些很棒的事情,比如:

$ ec2-host ZenWorker
ec2-999-xy-999-99.compute-1.amazonaws.com

$ ec2-ssh ZenWorker
Connecting to ec2-999-xy-999-99.compute-1.amazonaws.com.

请注意,在您的常规 shell 脚本中,您可以使用反引号来调用这些全局工具。我已经对这些调用进行了计时,使用 EC2 实例它们需要 0.25 到 0.5 秒,所以这确实是唯一的缺点。也许您可以忍受延迟,或者使用公共 DNS 仅在重新启动时更改实例的事实来制定解决方案。

请注意,这两个程序是命令行脚本,您不需要任何 Python 知识即可使用它们。对于 PHP 爱好者,或者那些想要在scp不知道更改的公共 DNS 的情况下轻松获取文件的人,您可以查看 ec2dns

于 2012-11-22T07:03:55.727 回答
1

我曾经处于同样的境地。我仍然没有专业知识来正确解决它。我丑陋的解决方案是使用 elb 不是真正用于负载平衡,而只是用于端点。

但我认为使用aws vpc可以获得一个很好的解决方案。

于 2012-05-24T15:57:04.430 回答
1

这是另一个用于从 AWS 上的实例更新 Route 53 DNS的 Ruby 解决方案。您不应在应用程序或服务器配置中引用原始的第 3 方系统 IP 地址。

于 2013-05-18T23:42:56.530 回答
0

您可以使用弹性 IP 更改 IP 地址:您可以使用 C# 代码进行操作:

 var associateRequest = new AssociateAddressRequest
            {
                 PublicIp = your Elastic Ip,
                 InstanceId = Your Instance Id Which You Assign
            };    
        amazonEc2Client.AssociateAddress(associateRequest);

在那之后取消关联它。

        var disAssociateRequest = new isassociateAddressRequest(publicIp.ElasticIpAddress1);
  AmazonEc2Client.DisassociateAddress(your Elastic Ip);

您的公共 IP 将改变

于 2016-02-12T08:12:14.983 回答