EC2ってEIP持たせとかないと、起動する度にIP変わってしまうけど、でもEC2停止すると
EIP分お金かかるし。。。
ってことで、DDNSの仕組みを自作すればいいのでは!?とやってみた結果です。
思い立った理由
自宅ラボネタやってるので、日常環境と開発環境は分けておきたいタイプです。
ただ、ふとしたタイミングとそれぞれの場所で、ちょろっとずつコーディングしてしまうので
Gitなどで管理すればいいじゃないか!なのですが、諸事情から全環境には入れられず・・・。
なので、どこからでもアクセスできる環境をAWS上に作成しよう!と考えたわけです。
環境について
・Route53にホストゾーンがあること
・EC2上のAWS CLI からRoute53に対して操作できるIAMロール
・Route53レコード書き換え用json
・対象のEC2が外部通信用のIPを割り当てられていること
動作概要

<記載すること>
①EC2で実行させるCLIのshell
②EC2に付与するIAMポリシー
③shellをEC2起動時に実行させる方法
<記載しないこと>
①DDNSについて:DDNSって単語でたどり着いたと思うので
②Route53の設定:ホストゾーンの作り方(ボタン押したらできた)
EC2で実行させるCLIのshell
例によって参考にするのは、公式ドキュメント
https://docs.aws.amazon.com/cli/latest/reference/route53/change-resource-record-sets.html
コマンドとしては、[aws route53 change-resource-record-sets] を使えばできそうですな。
別途必要なのが、ホストゾーンIDと変更情報が記載されたjsonファイルが必要になりそう。
ホストゾーンIDの確認(AWSコンソール)
Route53 コンソール > ホストゾーン > 該当ドメイン を追っていくと、右側にぺろっと表示される
Zから始まる長い文字列。これが必要になるのでメモしておく。

ホストゾーンIDの確認(コマンド)
aws route53 list-hosted-zones と実行すると、結果として返ってくる。(手抜きでcloudshell利用)
[cloudshell-user@~]$ aws route53 list-hosted-zones
{
"HostedZones": [
{
"Id": "/hostedzone/Z***************O",
"Name": "*************t.",
"CallerReference": "7b***************************",
"Config": {
"Comment": "****************",
"PrivateZone": false
},
"ResourceRecordSetCount": ****
}
]
}
“Id”: “/hostedzone/Z***************O”
Zから始まる長い文字列。これが必要になるのでメモしておく。
jsonファイルの作成 (record.json)
基本的は事は、公式ドキュメントに書いてありますが、実際作成したものを記載します。
{
"Comment": "************",
"Changes":[
{
"Action":"UPSERT",
"ResourceRecordSet":
{
"Name": "******************t",
"Type": "A",
"TTL" : 300,
"ResourceRecords" :[
{
"Value":"43.**.**.**"
}
]
}
}
]
}
要点だけ記載すると、こんな感じです。
・Actionについては、作成でも削除でもないので、UPSERTを利用
・IPアドレス解決なので、Aレコードを追加
・Name部分には、[ ddns.test.jp ] みたいな感じで追加したいレコード名を記載
※jsonファイルを作成するのは簡単だったんだけども、変更されるIPアドレスに合わせて
jsonファイルを書き換えるように作成するのが面倒でした・・。
実際に作ったshell (ChangeRoute53Rec.sh)
これが最適というわけではなく、あくまで個人的に使えると判断したレベルなので、内容については
各々にあったように作成/適用をお願いいたします。※各コマンドは1行です。
#!/bin/sh
# record.json は固定長なので、13行目指定で削除
sed -i -e '13d' /shell/record.json
# record.json の13行目に"現在のIPアドレス"を追加する
sed -i -e "13i \"Value\":\"`curl http://169.254.169.254/latest/meta-data/public-ipv4`\"" /shell/record.json
# AWS CLIを使用して、レコードを更新する(HostZoneID,jsonファイルを指定)
aws route53 change-resource-record-sets --hosted-zone-id Z************************O
--change-batch file:///shell/record.json
こんな感じを作成しました。
EC2に付与するIAMポリシー
ほんとに書き換えるのに必要なものだけ作成しています。
※Resourceをちゃんと絞る必要もあると思うが、一旦これで・・・。
このポリシーを付与したロールを作成して、EC2に与えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "route53:ChangeResourceRecordSets",
"Resource": "*"
}
]
}
shellをEC2起動時に実行させる方法
先ほど作成したChangeRoute53Rec.shをEC2(AmazonLinux)起動時に実行されるように仕込みます。
Windowsだと、AppData 配下のだいぶ下にある Startupフォルダに仕込めば出来るので
きっと似たようなものがあると信じて調べると、「 /etc/rc.d/rc.local 」なるものがあるらしい!
そこに下記を仕込みました。
※シェバンが #!/bin/bash だったので #!/bin/sh に書き換えてしまったので、何かあるかも・・・。
#!/bin/sh
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
# 2023.10.09 DDNS
sh /shell/ChangeRoute53Rec.sh
結果確認してみよう
まずは現状確認で、第4octは 135 となってます。

EC2をシャットダウン > 起動してみた結果がこちら↓↓ (再起動では変わらないので注意)

良い感じじゃないですか!
まとめ
ってことで、EIPを使うことなく、名前解決が出来るようになりました。これぞ、疑似DDNSって感じ!
変更するのにお金はかからないと思っていますが、そこは要確認ですね。
結構shell作るときに、割と時間かかったのですが、こうやって記載すると、サクッとしてますね。
ただ、記事書く時間が結構かかった。
あとは、EC2をコンソール使わずに起動/停止できれば・・・。ぐふふ。
夢は止まりません。
おわり。
コメント