はじめに
Google Domainのサービスが終了するので、私もCloudFlareに移行してみました。
もし移行先を探しているようであれば、CloudFlareも候補の1つとして考えてみるのはいかがでしょうか?
今回は移行手順は省略しますが、必要な設定やプログラムを公開するので、参考にどうぞ。
事前作業(この手順については省略します。)
- CloudFlareのアカウントを作成してください。
- 自動的に変更するDNSレコードを登録しておく。
必要な情報の取得
CloudFlareより、「Global API key」を取得する。
- 「APIキー」>「Global API Key」で、「表示」を選択して取得。
CloudFlareより、「API トークン」を作成する。
1.「トークンを作成」>「ゾーンDNSを編集する」
2.下記のとおり設定し、トークンを作成する。
アクセス許可 - ゾーン -> DNS -> 編集 - ゾーン -> ゾーン -> 読み込み ゾーンリソース - 包含 -> 特定のゾーン -> ドメイン名
3.作成後、トークンが表示されるので、メモっておく。
ゾーンIDを取得する。
以下のCURLコマンドを実行して、Resultに表示されるidの値をメモっておく。
curl -w "\n" --request GET \ --url https://api.cloudflare.com/client/v4/zones?name=ドメイン \ --header 'Content-Type: application/json' \ --header 'X-Auth-Email: CloudFlareのメールアドレス'\ --header 'X-Auth-Key: 取得したGlobal API key'
DNSレコードを取得する。
以下のCURLコマンドを実行して、結果のjsonの値に、変更したいレコードのIDをメモっておく。
curl -w "\n" --request GET \ --url https://api.cloudflare.com/client/v4/zones/取得したゾーンID/dns_records \ --header 'Content-Type: application/json' \ --header 'X-Auth-Email: CloudFlareのメールアドレス'\ --header 'X-Auth-Key: 取得したGlobal API key'
変更するPythonプログラムの作成
メインプログラム(update_dns.py)
import os import requests import re from datetime import datetime import configparser # 現在のスクリプトのディレクトリを取得 current_directory = os.path.dirname(os.path.abspath(__file__)) # 設定ファイルを読み込む config = configparser.ConfigParser() config_file = os.path.join(current_directory, 'config.ini') config.read(config_file) # 設定値の取得 MY_DOMAIN = config['DEFAULT']['MY_DOMAIN'] ZONE_ID = config['DEFAULT']['ZONE_ID'] RECORD_ID = config['DEFAULT']['RECORD_ID'] AUTH_EMAIL = config['DEFAULT']['AUTH_EMAIL'] API_TOKEN = config['DEFAULT']['API_TOKEN'] # IPアドレス取得サービスのリスト services = [ "https://api.ipify.org/", ] def get_ip_address(url): """ 指定されたURLからIPアドレスを取得します。 """ try: response = requests.get(url) response.raise_for_status() return response.text.strip() except requests.RequestException: return None def is_valid_ip(ip_address): """ IPアドレスが正しい形式かどうかをチェックします。 """ pattern = r"^([0-9]{1,3}\.){3}[0-9]{1,3}$" return re.match(pattern, ip_address) is not None # IPアドレスを取得するループ ip_address = None for service in services: ip_address = get_ip_address(service) if ip_address and is_valid_ip(ip_address): break if ip_address is None: raise Exception("有効なIPアドレスを取得できませんでした。") # 今日の日付を取得 current_datetime = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # CloudFlare APIによるAレコードの更新 update_url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records/{RECORD_ID}" headers = { 'Content-Type': 'application/json', 'X-Auth-Email': AUTH_EMAIL, 'Authorization': f'Bearer {API_TOKEN}' } data = { "content": ip_address, "name": MY_DOMAIN, "proxied": False, "type": "A", "comment": f"DDNS record updated on {current_datetime}" } response = requests.put(update_url, headers=headers, json=data) response.raise_for_status() # エラーが発生した場合、例外を発生させます print("IPアドレスが更新されました。") print('response',response)
設定ファイル(config.ini)
必要に応じて書き直してください。
[DEFAULT] MY_DOMAIN= ZONE_ID= RECORD_ID= AUTH_EMAIL= API_TOKEN=
ラズパイで動くように設定
- デフォルトではpipが入っていないので、インストール
sudo apt install pip
- 必要なパッケージをインストール
pip install requests pip install configparser
- 作成したプログラムをラズパイにコピーする。
- Cronで登録して定期実行する。
crontab -e
を実行する。
* */1 * * * python3 /home/pi/update_dns.py
まとめ
いかがだったでしょうか?
更新プログラムはPythonなので、Windowsでもラズパイでも色んな環境で使えるので、ぜひ試してみてください。