元パチ屋店員NWエンジニアの技術ブログ

元パチ屋店員NWエンジニアが技術のアウトプット化を目的に、好き勝手な事を書いてるブログです

Route53をなんちゃってダイナミックDNSに仕立てみた

  f:id:hayato-ota-rf:20170909203539p:plain

最近、SSL-VPNで使用しているEC2(Linux)にSSHにする際に、毎回変動したIP打ち込むのが怠いと感じてきた
けどON/OFF繰り返すからElastic IPは使えない
なんか良い方法ないかGoogle先生に聞いてみたところ
Route53をなんちゃってダイナミックDNSに仕立てあげる方法があったのでやってみた

構成

EC2が起動するタイミングで、Route53のレコードを更新するAPIを叩くcliスクリプトで実行させることによって、Route53をなんちゃってダイナミックDNSに仕立てあげる

※構築が終わった後で気が付いたんだけど、わざわざ自分でスプリクト作らなくても、route53ddnsといったスクリプトリポジトリにあったという

手順

ドメインの取得とゾーンの作成を既に完了している前提で進めます

①Route53のAPIを叩く用のユーザを作成

raptor-falcon.hatenablog.com

手順①を参考して下さい

今回設定したユーザは以下となります

ユーザ名:Route53

ポリシー:AmazonRoute53FullAccess

ポリシーは権限が必要最低限になるようにするのがスマートなんでしょうが・・・

 

f:id:hayato-ota-rf:20170907034814j:plain

AWS CLIで使うユーザの認証設定する

1.EC2上のLinuxサーバにログイン

 

2.認証情報の設定

aws configure --profile Route53

AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX 

AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXX 

Default region name [None]: us-east-1

Default output format [None]:

3.設定の確認

aws configure list --profile Route53

シェルスクリプトおよび設定ファイルの作成と設定

1.作業ディレクトリを作成

mkdir /home/hayato/Route53

2.jsonファイルを作成

vi /home/hayato/Route53/dyndns.tmpl

{

     "Changes":

     [

          {

          "Action": "UPSERT",

          "ResourceRecordSet":

               {

               "Name": "{%HOST%}.raptor-aws.net.",

               "Type": "A",

               "TTL": 300,

               "ResourceRecords":

                    [

                         {

                         "Value": "{%IP%}"

                         }

                    ]

                }

           }

     ]

}

※パラメータ補足

・"Action": "UPSERT"

レコードに対して行うアクションを指定

UPSERT=更新  

CREATE=作成

DELETE=削除

・"Name": "{%HOST%}.raptor-aws.net."

FQDNを指定

・"Value": "{%IP%}"

IPを指定

 

3.シェルスクリプトを作成

vi /home/hayato/Route53/dyndns.sh

#!/bin/bash

 

#VariableDefine

PROFILE=Route53

ROUTE53_PATH=/home/hayato/Route53/

ZONEID=XXXXXXXXXXX

IP=$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4)

HOSTNAME=$(hostname)

 

#filecreate

sed -e "s/{%IP%}/${IP}/g;s/{%HOST%}/${HOSTNAME}/g" ${ROUTE53_PATH}dyndns.tmpl > ${ROUTE53_PATH}${HOSTNAME}.json

 

#CLI

aws route53 change-resource-record-sets --profile ${PROFILE} --hosted-zone-id ${ZONEID} --change-batch file://${ROUTE53_PATH}${HOSTNAME}.json

※変数補足

・PROFILE

CLIで使用するプロファイルを指定

・ROUTE53_PATH

③の2で作成したjsonファイルがあるディレクトリを指定

・ZONEID

対象のゾーンIDを指定

f:id:hayato-ota-rf:20170907034825p:plain

・IP

EC2に割り当てられているパブリックIPを指定

・HOSTNAME

サーバ名を指定

④シェルスプリクトの動作確認と自動実行設定

1.シェルスプリクトの動作確認

sh /home/hayato/Route53/dyndns.sh

設定ファイル等に誤りがなければ、次のような結果が返ってきます

{

    "ChangeInfo": {

        "Status": "PENDING",

        "SubmittedAt": "2017-09-06T17:34:26.414Z",

        "Id": "/change/C21B4F9LM6BATC"

     }

}

しばらくするとRoute53のレコードが更新されます

 

2.シェルスプリクトの権限設定

sudo chmod 755 /home/hayato/Route53/dyndns.sh

3.cronの設定

cronの時間指定する部分に@rebootと指定してやると

サーバ起動時にスプリクトが実行されます

ただ今回何故かcrontab -eだと上手く設定されなかったので、cronファイルを直接編集しました

ルートに移行し、cronファイルを直接編集

su

 vi /var/spool/cron/hayato

cronファイルに下記の一文を追加

@reboot /home/hayato/Route53/dyndns.sh

結果

EC2のON/OFFを行っても、毎回同じFQDNsshが出来るようになりました

ちなみにオンプレのサーバとかでも可能なので、他のダイナミックDNSサービスの代用になるかもしれませんね

Route53はそんなに高くないし

参考サイト

blog.rocaz.net

www.mtcms.jp

qiita.com