如何为实例使用临时IP更新Google云DNS

如何为实例使用临时IP更新Google云DNS,dns,google-compute-engine,gcloud,google-cloud-dns,Dns,Google Compute Engine,Gcloud,Google Cloud Dns,我在GCE上有几个实例并不需要静态地址,但我仍然需要通过dns名称来访问它们。由于每次实例重新启动时,短暂的外部ip地址都会发生变化,因此我认为可以使用某种启动脚本在Google Cloud dns中更新该实例的dns条目(有点像dyndns) 我是否错过了一些东西,并且有一种更简单的方法可以通过gcloud将短暂的外部ip地址映射到dns记录 如果没有,任何关于如何编写这样的脚本的指点都将不胜感激 以下假设您在与您的虚拟机相同的项目中使用Google Cloud DNS for foo.bar

我在GCE上有几个实例并不需要静态地址,但我仍然需要通过dns名称来访问它们。由于每次实例重新启动时,短暂的外部ip地址都会发生变化,因此我认为可以使用某种启动脚本在Google Cloud dns中更新该实例的dns条目(有点像dyndns)

我是否错过了一些东西,并且有一种更简单的方法可以通过gcloud将短暂的外部ip地址映射到dns记录


如果没有,任何关于如何编写这样的脚本的指点都将不胜感激

以下假设您在与您的虚拟机相同的项目中使用Google Cloud DNS for foo.bar.com(即DNS名称“foo.bar.com”),区域名称为“foo-bar-com”,并且您的虚拟机具有配置选项“此实例具有对所有Google云服务的完全API访问权。”已选中。 您的虚拟机将在DNS中被称为“my VM.foo.bar.com”

我确信可以对其进行适当修改,以便在不同的项目和/或更有限的权限中使用DNS

可能值得注意的是:这假设您使用的是“谷歌云DNS”,而不仅仅是“谷歌域名”注册器,如果您使用后者(托管您的DNS,而不仅仅是注册器),那么它们直接支持合成动态ip地址,并带有一些类似DYNDN的更新机制(但它们在许多其他方面受到限制)

还请注意,要使事务成功,必须有一个具有正确IP和正确TTL的记录(即,第一次运行此操作时,您可能希望通过UI手动删除任何条目,并在注释掉dns_del的情况下运行此代码)


您已经有一段时间没有发布此问题了,但我将在这里发布我的答案,以供将来参考

我也有类似的需求,我不想使用
gcloud
CLI

我创建了一个简单的python脚本,它的功能与上面的bash脚本基本相同,但是使用了Apache LibcloudGoogle Cloud API凭据(服务帐户和密钥)


您可以在中找到代码。

我将对@MaZe中的答案稍作解释。另外,我将展示如何使用systemd,如果您使用的是Ubuntu或其他使用systemd的发行版,那么这个脚本将在启动时自动启动

#!/bin/bash

EXISTING=`gcloud dns record-sets list --zone="{your domain}" | grep xxx.yyyy.com | awk '{print $4}'`
NEW=`gcloud compute instances describe {your instance} --zone={your zone} | grep natIP | awk -F': ' '{print $2}'`
gcloud dns record-sets transaction start -z={your domain}
gcloud dns record-sets transaction remove -z={your domain} \
    --name="xxx.yyyy.com." \
    --type=A \
    --ttl=300 "$EXISTING"
gcloud dns record-sets transaction add -z={your domain} \
   --name="xxx.yyyy.com." \
   --type=A \
   --ttl=300 "$NEW"
gcloud dns record-sets transaction execute -z={your domain}
将其保存到/path/to/script.sh并在systemd中启动:

[Unit]
Description=Set xxx.yyyy.com to the correct external ip address of this instance
After=network.target auditd.service

[Service]
ExecStart=/path/to/script.sh
Type=oneshot

[Install]
WantedBy=multi-user.target
将其作为filename.service保存在/etc/systemd/system中,并通过以下方式启用:

sudo systemctl enable filename.service

与将其作为cron作业相比,这样做有什么好处?我想,如果您可以在启动时运行该作业一次,则没有好处。通常,如果您希望在启动时运行某些内容,您可以使用类似于此的systemd脚本;如果您希望安排某些内容,例如定期作业,则可以使用cron。我发现我只需要运行一次,就可以一直运行到下一次启动。这个systemd脚本一直在为我服务。啊,好吧,有道理。实际上,我打算在非google硬件服务器上使用此功能,动态IP地址相对频繁地更改,但要在google Cloud DNS上更新DNS记录。@paradroid我相信临时IP只在启动时更改,因此您不必使用cron重复运行。@Noserio我还没有尝试过,但是,internet搜索显示,您可以将脚本放在/lib/systemd/system sleep/中并使其可执行,然后在挂起和恢复期间将执行该目录中的任何脚本。对于简历,你需要做如下检查:如果[“${1}”=“post”];那么。有关详细信息,请搜索systemd/system sleep。
sudo systemctl enable filename.service