[Boto3 Adv-Cal DAY12]Route53でDNSレコードを設定してみた

boto3 で楽しむ AWS PythonLife 一人AdventCalendarです。12日目はRoute53にてDNSレコードの設定をやってみました。
2018.12.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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

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

12日目はRoute53でDNSレコードの作成をやってみました。

目次

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

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

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

  • hosted_zoneの操作(作成・削除)
  • レコードの変更
  • ヘルスチェック

今回の操作

HostedZoneを作成し、レコードを追加します。今回はALIASに限定しています。

  1. HostedZoneの作成
  2. レコードの追加
% python main.py
Input Profile name [default]>>

Input hosted_zone name >> XXXXXXX.com

Input resource >> 172.0.0.1

main.py

import boto3
import datetime
import re
from pprint import pprint

class Route53Wizard:
    _client_name = 'route53'
    _session = None
    _hosted_zone_name = None
    _resource = None
    
    def __init__(self, profile_name):
        self._session = boto3.Session(profile_name=profile_name)

    @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 resource(self):
        return self._resource

    @property
    def hosted_zone_name(self):
        return self._hosted_zone_name

    def create_hosted_zone(self):
        params = {
            'Name': self.hosted_zone_name,
            'CallerReference': str(datetime.datetime.now().timestamp()),
        }
        return self.get_client().create_hosted_zone(**params)

    def create_record_set(self, host):
        params = {
            'HostedZoneId': host['HostedZone']['Id'],
            'ChangeBatch': {
                'Changes': [
                    {
                        'Action': 'CREATE',
                        'ResourceRecordSet': {
                            'Name': host['HostedZone']['Name'],
                            'Type': 'A',
                            'TTL': 3600,
                            'ResourceRecords': [
                                {
                                    'Value': self.resource
                                }
                            ]
                        }
                    }
                ]
            }
        }
        return self.get_client().change_resource_record_sets(**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_hosted_zone_name(self):
        self._hosted_zone_name = self.prompt_base('Input hosted_zone name')

    def prompt_resource(self):
        self._resource = self.prompt_base('Input resource')

    @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 = Route53Wizard(profile_name)

        wizard.prompt_hosted_zone_name()
        wizard.prompt_resource()
        host = wizard.create_hosted_zone()
        wizard.create_record_set(host)

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

まとめ

今回は検証を手早く済ませるために、パラメータ埋め込みで実施しました。

入力済みのレコードを一覧で取得することも可能なため、既に入力しているレコードを俯瞰確認する際にも便利だと思います。