契約先のホスティングで利用しているサーバーを利用し続けることが困難になってしまったため、新仕様のサーバーへ移行しますという連絡がありました。
ネームサーバーをレンタルサーバーに設定しており、DNSレコードの設定を行っていないような通常のウェブサイトであれば問題はありませんが、CDNを設定しているような場合はDNSレコード設定の変更が必要です。
今回はホスティング先で新サーバーに移行後にできるだけダウンタイムを避けるため、DNSのAレコードが設定変更されたか自動でチェックし、変更された場合にSlackのWebhookを利用して特定のチャンネルに通知するプログラムをご紹介します。
目次
CDNを利用している場合、新サーバーへの移行後にCDN側の設定変更をしないといけない
新サーバーへの移行はホスティング側で実施されるため、こちらでは特にウェブサイトの移行作業(マイグレーション)等は必要ありません。新サーバーに移行後、SSHやFTP等接続方法は変更の必要があります。
CDNを利用してAレコードを設定している場合、新サーバーへ移行後はIPアドレスが変わるため、変更後のタイミングで新しいサーバーのIPアドレスに変更する必要があります。結構手間なんですよね……。
IPアドレスが変更されているかを自動でチェックする
ホスティング側でおおよその移行スケジュールが発表されていたとしても、正式に切り替わるタイミングはわかりません。
そこで、DNSのAレコードに設定されているIPアドレスが変わったかどうかを定期的に自動でチェックして、もし変更されていたら通知されたら便利だなと思い、そのコードをご紹介します。今回はローカルマシン(mac)で実行します。プログラム言語はPythonを利用しました。
import dns.resolver
previous_value = "既存のIPアドレス"
def check_dns_change():
domain = "example.com"
record_type = "A"
result = dns.resolver.resolve(domain, record_type)
for val in result:
if val.to_text() != previous_value:
return False
return True
Pythonで名前解決するにはdnspythonモジュールをインストール
上記を実行する前に、Pythonのdnspythonモジュールをインストールしておきましょう。
pip install dnspython
インストール後、上記コード内の「既存のIPアドレス」に現在設定されているIPアドレスを設定し、”domain”箇所に参照したいドメインを設定します。
自動で実行されるようにcronジョブに登録する
cronに登録することで、自動でDNSの変更がされているかの監視ができます。今回はローカルのマシン(mac)上で実行するためcronを利用しましたが、Windowsの場合はタスクスケジューラを利用すれば同じことが実現できます。
Macでcronジョブを設定するには、ターミナルを開いて以下の手順に行います。
crontab -e
コマンドを実行してcronジョブを編集する。- ターミナル上でエディタが開いたら、iを押して編集モードに変更し以下を入力
- * * * * /usr/bin/python3 /path_to_your_script/your_script.py
- “/usr/bin/python3″はPythonの実行環境を設定します。この場合はシステムのPythonを利用します。
- “/path_to_your_script/your_script.py”は実行したいPythonファイルのフルパスを設定します。
これにより、cronが1分ごとに実行されます。もし5分ごとに実行したい場合は以下のように設定すればOKです。
*/5 * * * * /usr/bin/python3 /path_to_your_script/your_script.py
cronが動かない場合
cronを設定したにも関わらず動かない場合、ログをチェックします。macの場合、/var/log/system.log
にcronジョブのログが記録されます。ターミナルから grep cron /var/log/system.log
とコマンドを叩くと、cronジョブのログを検索できます。
今回は You have new mail in /var/mail/ユーザー名
と表示されました。よって、cat
コマンドで表示させてみます。ログファイルには該当のpythonファイルに対して、[Errno 1] Operation not permitted
とありました。これはcronに権限がないためエラーとなっています。macの場合、フルディスクアクセスをcronに対して設定することで解消できます。
- システム環境設定→プライバシーとセキュリティ→フルディスクアクセス
- 「+」より追加し、
/usr/sbin/cron
を設定する。
これでcronから1分ごとに自動実行できるようになりました。
IPアドレスが変更されていた場合Slackに通知するように設定
IPアドレスが変更されていた場合、通知してもらうようにしたいです。すぐに知れないと意味ないですからね。今回はSlackを設定します。Slackには便利なWebhook URLが用意されており、これを利用してSlackへ通知します。
Slack からアプリ作成しWebhook URLを取得
Slackの公式ページから、Webhook URLを取得します。アプリがまだ未作成の場合は「Create your Slack app」からアプリを作成します。アプリ作成時にはアプリ名とアプリを連携するワークスペースを選択します。
アプリ作成後、Webhook URLが自動的に作られました。めっちゃ簡単。
このURLをコピーしておきましょう。
Slack に通知を行うコード
PythonでSlackに通知を行うコードは以下です。
import requests
import json
def send_slack_message(webhook_url, message):
payload = {"text": message}
requests.post(webhook_url, json.dumps(payload), headers={'Content-Type': 'application/json'})
if not check_dns_change():
send_slack_message("YOUR_SLACK_WEBHOOK_URL", "DNS has changed!")
「YOUR_SLACK_WEBHOOK_URL」に先程コピーしたWebhook URLを入れます。早速実行してみると、Slackに正しく通知されました!
Aレコードの変更があったらSlackに通知する
先程コードと組み合わせてみます。さらに、変更したIPアドレスも表示するようにしました。
import dns.resolver
import requests
import json
previous_value = "既存のIPアドレス"
def check_dns_change():
domain = "example.com"
record_type = "A"
result = dns.resolver.resolve(domain, record_type)
for val in result:
current_ip = val.to_text()
if current_ip != previous_value:
return current_ip
return None
def send_slack_message(webhook_url, message):
payload = {"text": message}
requests.post(webhook_url, json.dumps(payload), headers={'Content-Type': 'application/json'})
new_ip = check_dns_change()
if new_ip:
send_slack_message("YOUR_SLACK_WEBHOOK_URL", f"DNS has changed! New IP: {new_ip}")
cronジョブで自動実行され、画像のようにIPアドレスも一緒に変更してくれるようになりました。
サーバー変更の度にIPアドレスを変更しなくていいようにCNAMEの運用が望ましい
ここまでして準備していたのですが、CDNにCloudflareを利用している場合はCNAME Flattening機能が利用できるため、そもそもAレコードを利用せずにCNAMEを利用しておくことで、IPアドレスが変わっても自動的にサーバーが参照され手間がないということがわかりました。早く知りたかった……笑
参照: CNAME flattening · Cloudflare DNS docs
ということで、Cloudflareを利用している場合はAレコードを削除してCNAMEレコードを利用するようにしましょう。
それ以外のCDNで直接Aレコードを設定しないといけない場合は今回のように自動チェックシステムを構築し、変更があったら即手動で新規IPアドレスに変更するという方法が無難です。
ちなみに、今回作成したコードはすべてChatGTPに作成してもらいました。ChatGPT凄すぎる……。
追記: サーバー移行時、IPアドレスが変わったタイミングで正しく通知に成功
サーバー移行の当日、予定時間の数分前にcronが動くようにこのプログラムを起動させました。作業開始時刻から約3時間程度経過し、無事通知が届きました。書いたプログラムは正しく動作したこととなります。
ただ、そのタイミングではまだ完全にサーバー移行は完了しておらず、ウェブサイト上のJSが正しく参照できていない状況。各ページへのリンクも機能しておらず404でした。
その後夕方頃にホスティング会社からメールがあり、無事移行完了したとのこと。動作確認を行い問題有りませんでした。その後FTPやSSHの設定とアクセス確認を行い、移行完了。お疲れ様でした。
コメントを残す