はじめに
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でドメインホスティング
を元にしています。この勉強会は役に立つのでおすすめです。
ではでは。