问题描述
我在GCE上有几个实例,我确实不需要静态地址,但是我仍然需要通过dns名称访问它们.由于短暂的外部ip地址每次重新启动实例时都会更改,因此我认为我可以使用某种启动脚本来更新该实例在Google Cloud DNS中的dns条目(有点像dyndns).
I have couple of instances on GCE that I don't really need static addresses for, but I still need to make them accessible via dns name. Since ephemeral external ip addresses change every time an instance is restarted, I thought that I could use some sort of startup script to update dns entry for that instance in Google Cloud DNS (a bit like dyndns).
我是否错过了某件事,并且有一种更简便的方法可以通过gcloud将短暂的外部ip地址映射到dns记录?
Did I miss something and there is an easier way to map ephemeral external ip addresses to a dns record via gcloud?
否则,将不胜感激有关如何编写此类脚本的任何指针!
If not, any pointers on how to write such script would be highly appreciated!
推荐答案
以下内容假设您使用的是具有区域名称的foo.bar.com(即dns名称"foo.bar.com.")的Google Cloud DNS.与您的VM在同一项目中的"foo-bar-com",并且您的VM具有配置选项此实例具有对所有Google Cloud服务的完全API访问权限".已选择.您的VM在DNS中将称为"my-vm.foo.bar.com".
The following assumes that you are using Google Cloud DNS for foo.bar.com (ie. dns name "foo.bar.com.") with zone name "foo-bar-com" in the same project as your VM and that your VM has configuration option "This instance has full API access to all Google Cloud services." selected.Your VM will be called "my-vm.foo.bar.com" in DNS.
我确信可以对它进行适当的修改以在其他项目中使用DNS和/或使用更多受限权限.
I'm sure this could be appropriately modified to work with DNS in a different project and/or more limited permissions.
可能值得注意的是:这假设您使用的是"Google Cloud DNS",而不是(仅)"Google Domains"注册商,如果您使用的是后者(托管DNS,而不仅仅是作为注册商),则它们通过一些机制(例如更新机制)直接支持合成动态ip地址(但在其他方面受到更多限制).
Probably worth noting: this assumes you are using 'Google Cloud DNS' and not (just) 'Google Domains' registrar, if you're using the latter (to host your DNS, and not just as a registrar) then they have direct support for synthetic dynamic ip address with some dyndns like update mechanism (but they're more limited in a bunch of other ways).
还请注意,要使交易成功,必须已经有一条具有正确IP和正确TTL的记录(即,第一次运行该记录时,您可能希望通过UI手动删除任何条目,然后运行该记录dns_del被注释掉的代码).
Also note that for transaction to succeed there already has to be a record with the right IP and the right TTL (ie. the first time you run this you may want to delete any entry by hand via the UI, and run this code with dns_del commented out).
#!/bin/bash
ttlify() {
local i
for i in "$@"; do
[[ "${i}" =~ ^([0-9]+)([a-z]*)$ ]] || continue
local num="${BASH_REMATCH[1]}"
local unit="${BASH_REMATCH[2]}"
case "${unit}" in
weeks|week|wee|we|w) unit=''; num=$[num*60*60*24*7];;
days|day|da|d) unit=''; num=$[num*60*60*24];;
hours|hour|hou|ho|h) unit=''; num=$[num*60*60];;
minutes|minute|minut|minu|min|mi|m) unit=''; num=$[num*60];;
seconds|second|secon|seco|sec|se|s) unit=''; num=$[num];;
esac
echo "${num}${unit}"
done
}
dns_start() {
gcloud dns record-sets transaction start -z "${ZONENAME}"
}
dns_info() {
gcloud dns record-sets transaction describe -z "${ZONENAME}"
}
dns_abort() {
gcloud dns record-sets transaction abort -z "${ZONENAME}"
}
dns_commit() {
gcloud dns record-sets transaction execute -z "${ZONENAME}"
}
dns_add() {
if [[ -n "$1" && "$1" != '@' ]]; then
local -r name="$1.${ZONE}."
else
local -r name="${ZONE}."
fi
local -r ttl="$(ttlify "$2")"
local -r type="$3"
shift 3
gcloud dns record-sets transaction add -z "${ZONENAME}" --name "${name}" --ttl "${ttl}" --type "${type}" "$@"
}
dns_del() {
if [[ -n "$1" && "$1" != '@' ]]; then
local -r name="$1.${ZONE}."
else
local -r name="${ZONE}."
fi
local -r ttl="$(ttlify "$2")"
local -r type="$3"
shift 3
gcloud dns record-sets transaction remove -z "${ZONENAME}" --name "${name}" --ttl "${ttl}" --type "${type}" "$@"
}
lookup_dns_ip() {
host "$1" | sed -rn 's@^.* has address @@p'
}
my_ip() {
ip -4 addr show dev eth0 | sed -rn 's@^ inet ([0-9.]+).*@\1@p'
}
doit() {
ZONE=foo.bar.com
ZONENAME=foo-bar-com
dns_start
dns_del my-vm 5min A `lookup_dns_ip "my-vm.${ZONE}."`
dns_add my-vm 5min A `my_ip`
dns_commit
}
这篇关于如何使用实例的临时IP更新Google Cloud DNS的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!