Route 53でサブドメインを別のHosted Zoneに権限委譲するシェルを実装しました

2020.07.27

はじめに

好物はインフラとフロントエンドのかじわらゆたかです。 菊池がRoute 53でサブドメインを別のHosted Zoneに権限委譲するの内容をシェルで実装してみました。

ですので、どんなことを実際にやるのかの解説は菊池の記事を参考にしていただければと思います。

実装したシェルについては以下のGithubで公開していますのでそちらからダウンロードして利用してください

CM-Kajiwara/Route53-Subdomain-Transfer

下準備

  • 移譲元AWSアカウントのRoute 53にアクセスできること
  • 移譲先AWSアカウントのRoute 53にアクセスできること
  • 移譲先に設定するサブドメインを決めておくこと

実装内容解説

シェル内部で行っていることとしては上記に書いた菊池のブログの通りになります。 シェル化に際したテクニックとしては以下の2点があります。

jq を用いて配列 から Objectへの変換

aws cli でhosted-zoneを作成したときのレスポンスと、その後移譲元側に登録する際のNS レコードの形式が異なるので変換を行う必要がありました。

具体的には以下のように配列からオブジェクトへの変換を行っています。

変換元JSON

{
    ~中略~
    "DelegationSet": {
        "NameServers": [
            "ns-xxxx.awsdns-xx.co.uk",
            "ns-xx.awsdns-xx.com",
            "ns-xxx.awsdns-xx.net",
            "ns-xxxx.awsdns-xx.org"
        ]
    }
}

変換後JSON

[
  {
    "Value": "ns-xxxx.awsdns-xx.co.uk"
  },
  {
    "Value": "ns-xx.awsdns-xx.com"
  },
  {
    "Value": "ns-xxx.awsdns-xx.net"
  },
  {
    "Value": "ns-xxxx.awsdns-xx.org"
  }
]

こちらはjqで以下のように記載して行っています。

jq -r  '[.DelegationSet.NameServers[]|{"Value":.}]'

取得した配列のJSONへの埋め込む

別JSONから取得した配列をJSONに埋め込むといったことを行っています。

取得した配列 language=${nsRecords}

[
  {
    "Value": "ns-xxxx.awsdns-xx.co.uk"
  },
  {
    "Value": "ns-xx.awsdns-xx.com"
  },
  {
    "Value": "ns-xxx.awsdns-xx.net"
  },
  {
    "Value": "ns-xxxx.awsdns-xx.org"
  }
]

NSRecordTemp.json

{
    "Comment": "Update record set",
    "Changes": [
      {
        "Action": "UPSERT",
        "ResourceRecordSet": {
          "Name": "blogsample.cm.local.",
          "Type": "NS",
          "TTL": 172800,
          "ResourceRecords": []
        }
      }
    ]
  }

代入後

{
  "Comment": "Update record set",
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "blogsample.cm.local,",
        "Type": "NS",
        "TTL": 172800,
        "ResourceRecords": [
            {
                "Value": "ns-xxxx.awsdns-xx.co.uk"
            },
            {
                "Value": "ns-xx.awsdns-xx.com"
            },
            {
                "Value": "ns-xxx.awsdns-xx.net"
            },
            {
                "Value": "ns-xxxx.awsdns-xx.org"
            }
        ]
      }
    }
  ]
}

こちらは以下のようなコマンドで実装しています。

cat NSRecordTemp.json | jq ".Changes[0].ResourceRecordSet.ResourceRecords |= .+${nsRecords}" > NSRecord.json

結論

行っていることとしては菊池のブログをシェルでなぞっただけではあるのですが、jqを用いたJSONの変換テクニックの勉強等にもなりました。 このブログを読んだ人の中で、Route 53の異なるアカウントへのサブドメインの移譲がよりやりやすくなったのであれば幸いです。