梅雨も明け、
VPSやクラウドサービスが気軽に使えるようになりましたが、
インターネットから自宅内部へアクセスするためには、
そこで登場するのがダイナミックDNSです。ダイナミックDNSは、
Route 53でダイナミックDNS
ダイナミックDNS自体は、
- 決められたドメインのサブドメインとして登録されるため、
自分のドメインが使えない - それなりにお金がかかる
(場合がある) (注2)
というデメリットもあります。
そこで筆者はAWSのDNSサービスであるRoute 53を使い、
ゾーンの作成
まずドメインのゾーンを作成しましょう。既存のドメインのサブドメインとして運用する場合のように、
AWSにログインし、

ユーザーの作成とポリシーの定義
AWSのAPIを叩くには、
Console Homeから
%awsSecretAccessKeys = (
"任意の名前" => {
id => "アクセスキーID",
key => "シークレットキーID",
},
);

作成したばかりのユーザーには、
「Policy Generator」
Effect | Allow |
---|---|
AWS Service | Route 53 |
Actions | ChangeResourceRecordSets, ListResourceRecordSets |
ARN | arn:aws:route53:::hostedzone/ゾーン作成時にメモしたゾーンID |
「Add Statement」


dnscurl.plを使う
これでゾーンと、
コマンドからAWSのAPIを叩くためにはAWSコマンドラインインターフェイスが存在しますが、
- Digest::HMAC_
SHA1 - FindBin
- MIME::Base64
- Getopt::Long
- File::Temp
- File::Basename
- Fcntl
- IO::Handle
$ sudo apt-get install libdigest-hmac-perl
以下のようにdnscurl.
$ wget http://awsmedia.s3.amazonaws.com/catalog/attachments/dnscurl.pl $ chmod +x dnscurl.pl
リソースの一覧を取得する
dnscurl.
$ dnscurl.pl --keyname (鍵の名前) -- -H "Content-Type: text/xml; charset=UTF-8" -X GET https://route53.amazonaws.com/2013-04-01/hostedzone/(ゾーンID)/rrset <?xml version="1.0"?> <ListResourceRecordSetsResponse xmlns="https://route53.amazonaws.com/doc/2013-04-01/"><ResourceRecordSets><ResourceRecordSet><Name>example.com.</Name><Type>A</Type><TTL>300</TTL><ResourceRecords><ResourceRecord><Value> (省略)
レコードを登録する
前述のコマンドが問題なく動作していることが確認できたら、
$ dnscurl.pl --keyname (鍵の名前) -- -H "Content-Type: text/xml; charset=UTF-8" -X POST --upload-file (XMLファイル) https://route53.amazonaws.com/2013-04-01/hostedzone/(ゾーンID)/rrset
リソースの取得と異なるのは、
<?xml version="1.0" encoding="UTF-8"?>
<ChangeResourceRecordSetsRequest xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
<ChangeBatch>
<Changes>
<Change>
<Action>CREATE</Action>
<ResourceRecordSet>
<Name>home.example.com.</Name> ← ドメイン名
<Type>A</Type> ← レコードのタイプ
<TTL>300</TTL> ← レコードのTTL
<ResourceRecords>
<ResourceRecord>
<Value>aaa.bbb.ccc.ddd</Value> ← IPアドレス
</ResourceRecord>
</ResourceRecords>
</ResourceRecordSet>
</Change>
</Changes>
</ChangeBatch>
</ChangeResourceRecordSetsRequest>
dnscurl.
<?xml version="1.0"?>
<ChangeResourceRecordSetsResponse xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
<ChangeInfo>
<Id>/change/C2RAxxxxxxxxxx</Id>
<Status>PENDING</Status>
<SubmittedAt>2014-07-20T08:25:15.480Z</SubmittedAt>
</ChangeInfo>
</ChangeResourceRecordSetsResponse>
レコードを変更する
ダイナミックDNSを実現するためには、
<?xml version="1.0" encoding="UTF-8"?>
<ChangeResourceRecordSetsRequest xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
<ChangeBatch>
<Changes>
<Change>
<Action>DELETE</Action> ← 古いレコードを削除する
<ResourceRecordSet>
<Name>home.example.com.</Name>
<Type>A</Type>
<TTL>300</TTL>
<ResourceRecords>
<ResourceRecord>
<Value>aaa.bbb.ccc.ddd</Value> ← 現在DNSに登録されている古いIPアドレス
</ResourceRecord>
</ResourceRecords>
</ResourceRecordSet>
</Change>
<Change>
<Action>CREATE</Action> ← レコードを作り直す
<ResourceRecordSet>
<Name>home.example.com.</Name>
<Type>A</Type>
<TTL>300</TTL>
<ResourceRecords>
<ResourceRecord>
<Value>www.xxx.yyy.zzz</Value> ← 新しいIPアドレス
</ResourceRecord>
</ResourceRecords>
</ResourceRecordSet>
</Change>
</Changes>
</ChangeBatch>
</ChangeResourceRecordSetsRequest>
シェルスクリプトで自動化する
これでコマンドラインからレコードの登録と、
- 自分のグローバルIPアドレスを調べる。
- Route 53に登録されているレコードを調べる。
- レコードが存在しなかった場合は、
新規作成用のXMLを作成してアップロードする。 - レコードが存在し、
かつ新旧のIPアドレスが同一だった場合は、 何もせず終了する。 - IPアドレスが変更されていた場合は、
更新用のXMLを作成してアップロードする。
筆者は自宅で使用するために、
$ sudo apt-get install html-xml-utils
まずddns-route53.
# Please check and set your global IP address by any method.
# (e.g. http://ipcheck.ieserver.net/)
NEW_RR_VALUE=$(curl -s -4 http://ipcheck.ieserver.net/)
# Please set the following variables to your environment.
DNSCURL=./dnscurl.pl # path of dnscurl.pl
KEYNAME=your-key-name # your key name in .aws-secrets
TTL=300 # TTL of this record
NAME=www.example.com. # Target A record
ZONEID=YOURZONEID # your zone ID
LOGGER=echo # send messages program
HOSTEDZONE=https://route53.amazonaws.com/2013-04-01/hostedzone
スクリプト本体であるupdate_
$ /home/mizuno/bin/update_record.sh /home/mizuno/ddns_route53.conf.mine IP address did not change.
AWSのサービスは非常に多岐にわたりますが、