Help us understand the problem. What is going on with this article?

aws-cliをつかってDynamic DNSサービス

More than 5 years have passed since last update.

はじめに

Route53はAWSのサービスですので、APIが存在します。またawsコマンドで操作も出来ます。
固定IPをもっていないマシンでもDNSで検索できるようなDynamic DNSサービスも簡単に作れます。
ということで、コマンドラインでの設定方法を説明します。cron等にいれればIPが更新されても
大丈夫です。

前提条件

  • ドメインは既にRoute53に登録してあること
  • aws-cliが利用できること(aws-cli 1.4.3で確認しています)
  • jq,curlが利用できること

Hosted Zone IDの取得

まずは登録しているドメインのHosted Zone IDを調べます。以下のようなコマンドで調べられます。

aws route53 list-hosted-zones | jq '.HostedZones[] |  {Name , Id } '

実行すると下記のように出力されます。

$ aws route53 list-hosted-zones | jq '.HostedZones[] |  {Name , Id } '{
  "Id": "/hostedzone/ZZZZZXXXX3333",
  "Name": "xxxxxxx.com."
}

この例だと ZZZZZXXXX3333 が hosted zone ID、ドメインは xxxxxxx.com になります。

レコード登録スクリプト

こちら登録スクリプトになります。スクリプト中に3つのシェル変数を設定してください。

#!/bin/sh

R53_ZONE_NAME= #ドメイン名 (example.com等)
R53_HOSTNAME=  #ホスト名 (testserver等)
HOSTED_ZONEID= #Hosted zone ID

R53_CALLER="${R53_ZONE_NAME}-`date +%Y%m%d-%H%M%S`"
R53_COMMENT="dynamic dns record set"
MY_DDNS_RECORD=${R53_HOSTNAME}.${R53_ZONE_NAME}

MY_PUBLIC_IP=`curl -s ifconfig.me`
if [ -z $MY_PUBLIC_IP ] ;  then
    MY_PUBLIC_IP=`curl -s ipinfo.io | jq -r '.ip'`
fi

if [ -z $MY_PUBLIC_IP ] ;  then
    echo "failed to get global IP address"
    exit 1
fi
cat <<EOT > /tmp/recordset.json
{
  "Comment": "create A record",
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "${MY_DDNS_RECORD}",
        "Type": "A",
        "TTL": 3600 ,
        "ResourceRecords": [
         {
           "Value": "${MY_PUBLIC_IP}"
         }
        ]
      }
    }
  ]
}
EOT

aws route53 change-resource-record-sets --hosted-zone-id $HOSTED_ZONEID --change-batch file:///tmp/recordset.json 

rm -rf /tmp/recordset.json

ポイントとしてはグローバルIPを調べるために二つサービスを利用している点と、レコードセット登録にinsertではなくupsert(あれば更新、なければ追加)です。

実行するとこんな感じで出力されます。

$ ./upsert_dns.sh
{
    "ChangeInfo": {
        "Status": "PENDING", 
        "SubmittedAt": "2014-10-06T13:44:34.264Z", 
        "Id": "/change/ZZZZZXXXX3333", 
        "Comment": "create A record"
    }
}

分散サービスなので登録されるまで少し時間がかかりますが、登録されるとホスト名が引けるようになります。

まとめ

Route53のレコードセットを登録するスクリプトを作成しました。波田野さんの主催する
JAWS-UG CLI専門支部 #1 - Route53でドメインホスティング
を元にしています。この勉強会は役に立つのでおすすめです。

ではでは。

tt2004d
AWSの構築の仕事をしています。
cloudpack
Amazon Web Services (AWS) の導入設計、環境構築、運用・保守をサポートするマネジドホスティングサービス
https://cloudpack.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away