今回は、Amazon Web Servicesにあるサービスの一つであるRoute53を使ってDDNS(Dynamic Domain Name Service)を実現したいと思います。
一番いいのは、固定IPを利用すれば、接続先が変動しないのでVPNの拠点などにも使いやすいのですが、プロバイダによっては固定IPのサービスを提供していなかったり別料金がかかったりと色々手間がかかります。
そこで、Route53にドメインを預けている人ならAWSのAPIを使って拠点に割り振られたグローバルIPが変動したら対象ドメイン名に紐づくIPを変更することが自動で出来ます。
■用意するもの■
1.AWSのAPIツールがインストールされたLinuxサーバ(CentOS6系)
2.APIにアクセスするためのアクセスキーやシークレットキー
3.もちろんドメインをRoute53上で運用
4.下記で紹介するスクリプト
■スクリプト■
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
#!/bin/sh ## パラメータを設定 CURRENT_FILE="{現在のIPを保存しておくファイル}" R53_RECORD="{DDNSとして使用したいレコード名[FQDNで記載すること]}" RECORD_TTL="{レコードのTTL値(300ぐらいで)}" HOSTED_ZONEID="{Route53のコンパネ上で表示されているZONEID}" ## グローバルIPを外部サイトから取得 MY_PUBLIC_IP=`curl -s ipinfo.io | jq -r '.ip'` ## グローバルIPが取得出来なければエラーとしてログを出力 if [ -z "${MY_PUBLIC_IP}" ] ; then logger -i -s -t "`basename $0`" "Failed to get global IP address." exit 2 fi ## CURRENT_FILEを空で作成 touch -c "${CURRENT_FILE}" ## 今回取得したグローバルIPが前回更新時のものと同じが確認 grep -wc "${MY_PUBLIC_IP}" ${CURRENT_FILE} > /dev/null 2>&1 ret=$? if [ $ret -eq 0 ] ; then ## 同じであれば更新しない exit 1 else ## 異なる場合は更新する ## 更新内容はJSONでプッシュするためファイルを用意する cat <<EOT > /tmp/arecordset.json { "Comment": "${R53_RECORD} is target hosts", "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "${R53_RECORD}", "Type": "A", "TTL": ${RECORD_TTL} , "ResourceRecords": [ { "Value": "${MY_PUBLIC_IP}" } ] } } ] } EOT cat <<EOT > /tmp/txtrecordset.json { "Comment": "${R53_RECORD} is update check record", "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "${R53_RECORD}", "Type": "TXT", "TTL": ${RECORD_TTL} , "ResourceRecords": [ { "Value": "\"Change on `date '+%Y%m%d%H%M%S'`\"" } ] } } ] } EOT ## route53のAPIを用いて更新をプッシュする aws route53 change-resource-record-sets --hosted-zone-id ${HOSTED_ZONEID} --change-batch file:///tmp/arecordset.json aws route53 change-resource-record-sets --hosted-zone-id ${HOSTED_ZONEID} --change-batch file:///tmp/txtrecordset.json ## プッシュに用いたJSONファイルを削除 rm -rf /tmp/arecordset.json rm -rf /tmp/txtrecordset.json ## ログ出力 logger -i -s -t "`basename $0`" "It has been updated since the global IP address has changed. (`cat ${CURRENT_FILE}`)=>(`echo ${MY_PUBLIC_IP}`)" ## 更新時のIPアドレスを控える echo "${MY_PUBLIC_IP}" > "${CURRENT_FILE}" exit 0 fi |
後は、cronで定期実行させれば自動的に処理を行ってくれる。
1 2 |
*/5 * * * * /root/script/route53_autoupdate.sh |
今回のはサーバ上にlogger
コマンドを用いてログを残すようにしている。