AWS EC2のパブリックIPはElasticIPにより固定IPアドレスを割り当てることができますが、本執筆時点(2025年7月)ではインスタンスの起動停止に関わらず料金が発生してしまいます。
そこでElasticIPは起動せず、EC2起動時に割り当てられたパブリックIPを自動的に取得してRoute53へ登録する方法をご紹介します。
前提条件
- Route53で利用可能なドメインおよびホストゾーンが登録されていること
- awscliが実行可能であること(インストール、設定は下記マニュアルを参照ください)
Route53更新スクリプトの作成
まずはパブリックIPをRoute53へ登録するスクリプトを作成します。
updateDDNS.sh
#!/bin/bash
# [Step1] 環境変数設定
DOMAIN_NAME="<ドメイン名>"
SUB_NAME="<サブドメイン名>"
INSTANCE_ID=`aws ec2 describe-instances --query 'Reservations[].Instances[].InstanceId' --output text`
IP_ADDRESS=`aws ec2 describe-instances \
--instance-ids ${INSTANCE_ID} \
--query "Reservations[].Instances[].PublicIpAddress" \
--output text `
HOSTED_ZONE_ID="<ホストゾーンID>"
# [Step2] route53へ登録する情報をJSON形式で作成
BATCH_JSON='{
"Changes": [
{ "Action": "UPSERT",
"ResourceRecordSet": {
"Name": "'${SUB_NAME}'.'${DOMAIN_NAME}'",
"Type": "A",
"TTL" : 300,
"ResourceRecords": [
{ "Value": "'${IP_ADDRESS}'" }
]
}
}
]
}'
# [Step3] aws route53 change-resource-record-setsでDNSレコードを更新
aws route53 change-resource-record-sets --hosted-zone-id ${HOSTED_ZONE_ID} --change-batch "${BATCH_JSON}"
このスクリプトは次のように動作しています。
[Step1] route53へ登録するために必要なドメイン、サブドメイン、パブリックIP、ホストゾーンIDを取得します
[Step2] Step1で取得した情報を元にroute53へ登録する情報をJSON形式で作成します
[Step3] Step2で作成したJSON形式データをaws route53 change-resource-record-setsに渡してroute53のDNSレコードを更新します
なお、パブリックIPはawscliで取得しています。
aws ec2 describe-instances \
--instance-ids <EC2インスタンスID> \
--query "Reservations[].Instances[].PublicIpAddress" \
--output text
スクリプトが完成したら実行して、route53のDNSレコードが正常に更新されることを確認してください。
EC2起動時の自動実行を設定
route53のDNSレコードを正常に更新できることが確認できたら、次はEC2起動時にスクリプトを自動実行するよう設定します。
EC2起動時の自動実行はユーザーデータ入力を使用します。なお、ユーザーデータ入力を設定するにはEC2インスタンスが停止している状態で実行する必要があります。
(1) ユーザーデータ入力の画面を開く
インスタンスを停止した状態で、EC2コンソール右上にある「アクション」>「インスタンスの設定」>「ユーザーデータを編集」を選択します
(2) ユーザーデータを更新する
新しいユーザーデータのテキストボックスにスクリプトを貼り付けて保存します。
なお、スクリプトをそのまま登録するとEC2を作成した初回起動時しか実行されません。
そこで、EC2起動ごとに毎回実行するにはスクリプト先頭に下記を記述します。
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
#cloud-config
cloud_final_modules:
- [scripts-user, always]
--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
# ここからシェルスクリプトを記述していく
#!/bin/bash
……
(3) EC2インスタンスを起動する
ユーザーデータの保存が完了したらEC2インスタンスを起動して、route53のDNSレコードが更新されていることを確認します
本稿ではEC2インスタンスのパブリックIPをRoute53に登録するスクリプトと、それをEC2起動時に自動実行する手順を解説しました。
これによりElastic IPの月額利用料(約500円)が不要となり、個人ユーザーにとってはコスト節約が実現できるでしょう。
これからもTipsを次々と紹介していきますので、良かったらXアカウントもフォローしてみてください。