13

GCE には、実際には静的アドレスを必要としないインスタンスがいくつかありますが、DNS 名を介してそれらにアクセスできるようにする必要があります。インスタンスが再起動されるたびに一時的な外部 IP アドレスが変更されるため、何らかの起動スクリプトを使用して、Google Cloud DNS でそのインスタンスの dns エントリを更新できると考えました (dyndns に少し似ています)。

gcloud を介してエフェメラル外部 IP アドレスを DNS レコードにマッピングする簡単な方法はありますか?

そうでない場合は、そのようなスクリプトを作成する方法についての指針をいただければ幸いです。

4

3 に答える 3

7

以下は、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
}
于 2016-01-14T15:16:57.900 に答える