はじめに
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でもラズパイでも色んな環境で使えるので、ぜひ試してみてください。