以下は、VM と同じプロジェクトで、ゾーン名「foo-bar-com」で foo.bar.com (つまり、DNS 名「foo.bar.com」) に Google Cloud DNS を使用していること、およびVM には、「このインスタンスにはすべての Google Cloud サービスへの完全な API アクセス権があります」という構成オプションがあります。選択されました。VM は DNS で「my-vm.foo.bar.com」と呼ばれます。
これを適切に変更して、別のプロジェクトやより制限された権限で DNS を操作できると確信しています。
おそらく注目に値する: これは、(単に) 「Google Domains」レジストラではなく、「Google Cloud DNS」を使用していることを前提としています。後者を (単なるレジストラとしてではなく、DNS をホストするために) 使用している場合は、直接サポートされています。更新メカニズムのようないくつかのdyndnsを備えた合成動的IPアドレス用(ただし、他の多くの方法でより制限されています)。
また、トランザクションが成功するには、適切な IP と適切な TTL を持つレコードが既に存在している必要があることに注意してください (つまり、これを初めて実行するときは、UI を介して手動でエントリを削除し、dns_del でこのコードを実行することができます)。コメントアウトしています)。
#!/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
}