[AWS]Route53でDDNSを自作してみた

AWS

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をコンソール使わずに起動/停止できれば・・・。ぐふふ。
夢は止まりません。

おわり。

コメント

タイトルとURLをコピーしました