[Boto3 Adv-Cal DAY15]Route53Domainsでドメインの移行確認をやってみた

boto3 で楽しむ AWS PythonLife 一人AdventCalendarです。

boto3のドキュメントを通して、サービス別にどういった事が出来るのかを理解したり、管理コンソールを通さずにTerminalだけで完結できるように検証していくことが目的になります。

15日目はRoute53Domainsにてドメインの移行確認操作をやってみます。

目次

boto3を通してRoute53Domainsでできること

ドキュメントは下記リンク先です。

ざっくりと以下のことができます。

  • ドメイン名が有効であるかの確認
  • ドメイン名をAmazon Route53へ移行可能かどうかの確認

対象リージョン

Route53DomainsのAPI動作リージョンが限定されていたため、今回はus-east-1に直接指定しています。

Route53の扱い

AWS管理コンソール上でのドメインに関する扱いはRoute53の中にすべて収められていますが、boto3上では夫々機能毎に分類が行われています。

  • Route53
  • Route53 Domains
  • Route53 Resolver

Route53

Hostやレコード、ヘルスチェックを主に行います。

Route53 Domains

ドメイン名の有効確認、及び移行チェック。

Route53 Resolver

オンプレミスからVPCの名前解決が可能になります。

今回の手順

既存のドメインがRoute53へ移行可能かどうかを確認します。

  1. 対象ドメインの指定
  2. 移行可能チェック

実行手順

% python main.py
Input Profile name [default]>>

Input domain name >> XXXXXXXXXXXX.net
{'ResponseMetadata': {'HTTPHeaders': {'content-length': '53',
                                      'content-type': 'application/x-amz-json-1.1',
                                      'date': 'XXX, XX XXX 2018 21:43:49 GMT',
                                      'x-amzn-requestid': 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'},
                      'HTTPStatusCode': 200,
                      'RequestId': 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
                      'RetryAttempts': 0},
 'Transferability': {'Transferable': 'UNTRANSFERABLE'}}

main.py

import boto3
from pprint import pprint

class Route53DomainsWizard:
    _client_name = 'route53domains'
    _session = None
    _domain_name = None
    
    def __init__(self, profile_name):
        self._session = boto3.Session(profile_name=profile_name, region_name='us-east-1')

    @property
    def session(self):
        return self._session

    def get_client(self, client_name=None):
        if not client_name:
            client_name = self._client_name
        return self.session.client(client_name)

    @property
    def client_name(self):
        return self._client_name

    @property
    def domain_name(self):
        return self._domain_name

    def check_domain_transferability(self):
        params = {
            'DomainName': self.domain_name
        }
        return self.get_client().check_domain_transferability(**params)

    def prompt_base(self, message):
        value = None
        while True:
            value = input("\n{} >> ".format(message))
            if value and len(value) != 0:
                break
        return value

    def prompt_domain_name(self):
        self._domain_name = self.prompt_base('Input domain name')

    @staticmethod
    def prompt():
        default_profile_name = 'default'
        profile_name = input('Input Profile name [{}]>> '.format(default_profile_name))
        if len(profile_name) == 0:
            profile_name = default_profile_name
        wizard = Route53DomainsWizard(profile_name)

        wizard.prompt_domain_name()
        pprint(wizard.check_domain_transferability())

if __name__ == '__main__':
    Route53DomainsWizard.prompt()

まとめ

入力精査も兼ねたために、移行チェック処理としては若干コード量が多くなってしまいました。既存ドメインを管理する際に移行チェックも併せて行う場合等であれば、恐らく実装量も少ない上に役立つと思われます。