2016年9月1日木曜日

AWS Route53のDNSレコードをコマンドラインから操作する

Amazon Route 53 Authentication Tool for Curl
https://aws.amazon.com/developertools/Amazon-Route-53/9706686376855511

ダイナミックDNS(DDNS)を実装します。上記ページで公開されているスクリプト dnscurl.pl を使って、AWS Route53のDNSレコードを操作します。
Route53を操作するためのIAMポリシー・ユーザを作成して、DNSレコード更新サンプルを書いていきます。
環境は、CentOS 6です。

AWSコンソールから、Route53編集用のIAMポリシーをつくる

IAM Management Console Policies
https://console.aws.amazon.com/iam/home?region=ap-northeast-1#policies

IAMポリシー設定ページを開く -> Create Policy -> Create Your Own Policy
ポリシー名と、ポリシードキュメントを入力。
ここでは、IPアドレス 153.126.157.62 にRoute53の編集許可を与えます。

Policy Name: Route53-FullAccess-with-valid-IP-address
Policy Document:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "route53:*"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "153.126.157.62/32"
                    ]
                }
            }
        }
    ]
}

IAMユーザをつくる

IAM Management Console Users
https://console.aws.amazon.com/iam/home?region=ap-northeast-1#users

IAMポリシー設定ページを開く -> Create New Users ->
Enter User Names: route53_user -> Create
Access Key ID: AAAAAAAAAAAAAAAAA
Secret Access Key: BBBBBBBBBBBBBBBBB
キーをメモしておく。

先ほど作ったポリシーをひもづける。
-> Attach Policy -> Route53-FullAccess-with-valid-IP-address

dnscurl.plの準備

必須ライブラリをインストール
# yum -y install perl-Digest-HMAC*
.aws-secretsファイルを準備
# emacs .aws-secrets
%awsSecretAccessKeys = (
    "my-aws-account" => {
        id => "AAAAAAAAAAAAAAAAA",
        key => "BBBBBBBBBBBBBBBBB",
    },
);

# chmod 600 .aws-secrets
dnscurl.plをダウンロード
# wget http://awsmedia.s3.amazonaws.com/catalog/attachments/dnscurl.pl
# chmod +x dnscurl.pl
# ./dnscurl.pl --debug

dnscurl.pl接続確認

# ./dnscurl.pl --keyname my-aws-account -- -H "Content-Type: text/xml; charset=UTF-8" https://route53.amazonaws.com/2010-10-01/hostedzone

<?xml version="1.0"?>
<ListHostedZonesResponse xmlns="https://route53.amazonaws.com/doc/2010-10-01/"><HostedZones><HostedZone><Id>/hostedzone/HHHHHHHH</Id><Name>hitokoto.co.</Name><CallerReference>B56A5CA2-7F5D-5183-B014-94C24DE1720B</CallerReference><Config/></HostedZone></HostedZones><IsTruncated>false</IsTruncated><MaxItems>100</MaxItems></ListHostedZonesResponse>
-> Hosted Zone ID:HHHHHHHH をメモしておく。

ドメインからIPアドレスをひいてみる。
hostedzone/ 以下に Hosted Zone ID を指定。
name= に test.hitokoto.co. を指定。
./dnscurl.pl --keyname my-aws-account -- -H "Content-Type: text/xml; charset=UTF-8" "https://route53.amazonaws.com/2010-10-01/hostedzone/HHHHHHHH/rrset?name=test.hitokoto.co.&maxitems=1"

<?xml version="1.0"?>
<ListResourceRecordSetsResponse xmlns="https://route53.amazonaws.com/doc/2010-10-01/"><ResourceRecordSets><ResourceRecordSet><Name>test.hitokoto.co.</Name><Type>A</Type><TTL>300</TTL><ResourceRecords><ResourceRecord><Value>153.126.157.62</Value></ResourceRecord></ResourceRecords></ResourceRecordSet></ResourceRecordSets><IsTruncated>false</IsTruncated><MaxItems>1</MaxItems></ListResourceRecordSetsResponse>
指定したドメインのIPアドレスが返ってきました。

ドメインのIPアドレスを変更

test.hitokoto.co.のIPアドレスを変更します。153.126.157.62 -> 10.0.0.1
XMLファイルを用意。
$ emacs renew_ip_address_test.xml
IPアドレス変更を実行
# ./dnscurl.pl --keyname my-aws-account -- -H "Content-Type: text/xml; charset=UTF-8" -X POST --upload-file ./renew_ip_address_test.xml https://route53.amazonaws.com/2013-04-01/hostedzone/HHHHHHHH/rrset

<?xml version="1.0"?>
<ChangeResourceRecordSetsResponse xmlns="https://route53.amazonaws.com/doc/2013-04-01/"><ChangeInfo><Id>/change/HHHHHHHH</Id><Status>PENDING</Status><SubmittedAt>2016-08-25T06:43:11.590Z</SubmittedAt></ChangeInfo></ChangeResourceRecordSetsResponse>
ステータス PENDING になりました。
数秒待つと設定が反映されます。

無事に設定されました。