如何在Google Compute Engine中以编程方式获取实例IP?

时间:2014-12-13 00:18:45

标签: google-compute-engine

我需要在我的应用程序中连接到mongodb的副本集,所以我需要在代码的配置中提供副本集的mongo实例的ip地址。 Ips是短暂的,所以他们将来可能会改变。如何以编程方式获取mongo实例的ips,以便配置可以推断出它们,而无需在每次ip更改时更新代码。

或者是将ips放入代码并手动更新的方法?

我认为这是做到这一点的方法: https://cloud.google.com/compute/docs/metadata#querying

但是这个网址http://metadata.google.internal/computeMetadata/v1/似乎不存在我无法查询任何内容......

我可以使用gcloud compute instances list从代码执行shell命令并手动过滤以获取ips,但我想知道是否有更清洁的方法。

我的应用程序将在与mongo实例分开的实例中运行。

2 个答案:

答案 0 :(得分:4)

是的,最好的方法是使用gcloud compute命令。

您只能从实例查询元数据服务器,而不能从Google云服务外部查询。

您应该考虑执行以下命令的实例中的cron作业,返回外部IP并将其发送到您的应用程序:

curl "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip" -H "Metadata-Flavor: Google"

答案 1 :(得分:4)

您提到您的应用程序在单独的实例中运行,但您没有提及有关网络的信息。所以,我的建议是:

如果您的应用实例和mongo实例在同一个专用网络中运行:

  • 请注意,默认情况下, GCE会将您的专用网络中的所有实例名称解析为相应的专用IP。例如,如果您有一些实例: instance-1 instance-2 instance-3 ,它们都是 on相同的网络,那么您的应用只需连接到名称而不是IP(这是您在创建实例时选择的名称)。
  • 如果您的任何mongo实例重新启动并更改其私有IP,您的实例名称将继续解析为当前(可能不同的)私有IP,因此您不必担心。

如果您的应用实例和mongo实例 NOT 在同一个专用网络中运行:

  • 您可以随时制作公开的短暂IP,即静态IP。只需转到您的虚拟机实例详细信息页面,找到"外部IP"部分,单击"编辑",选择"新的静态IP地址",并将其附加到您的服务器。只要他们介意,只要他们被使用,他们就是免费的。
  • 即使您的mongo实例中可能有静态IP,我仍然建议您设置一个指向这些静态IP的域,这样您的应用就可以指向这些域。这对以后如果有一天你需要移动你的mongo服务器非常有用,你可以在域中设置不同的IP,你的应用甚至不会注意到。 (当然,在您迁移mongo数据之后......)

在这两种情况下,您应始终使用名称来配置mongo副本集(而不是IP),原因与上述相同:如果您的实例重新启动并更改其IP,则您的mongo RS在你重新配置它之前不会工作。

希望它有所帮助。