![[Boto3 Adv-Cal DAY12]Route53でDNSレコードを設定してみた](https://devio2023-media.developers.io/wp-content/uploads/2018/12/boto3_advent_calendar1.png)
[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に限定しています。
- HostedZoneの作成
- レコードの追加
% 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()
まとめ
今回は検証を手早く済ませるために、パラメータ埋め込みで実施しました。
入力済みのレコードを一覧で取得することも可能なため、既に入力しているレコードを俯瞰確認する際にも便利だと思います。













