こんにちは。nendインフラ担当のm_kiyotaです。
最近Amazon Web Service (以下AWS)を使い、Amazon Route 53(以下Route 53)をコマンドで操作することがあったのですが検索してみると思ったより日本語情報が少なかったのでせっかくなので書いてみようと思います。
Route 53を使うメリット
Route 53とはAWSが提供しているDNSサービスです。
Route 53を使った個人的な感想としては、bindなどを使いDNSサーバを構築した場合と比べて"レコードの重みづけ"ができることがメリットだと思っています。(もちろんDNSサーバが冗長化かつ分散されていて、SLA100%であるとかは言わずもがなです。)
例えばhoge.nend.netというレコードに対して
サブドメイン名:hoge.nend.net レコードタイプ:A IPアドレス:1.2.3.4 TTL:60(秒) SetID:tokyo 重みづけ:100
サブドメイン名:hoge.nend.net レコードタイプ:A IPアドレス:5.6.7.8 TTL:60(秒) SetID:osaka 重みづけ:0
と上記のように重みづけを行った場合、通常はhoge.nend.netに問い合わせを行うと SetID [tokyo]に設定した1.2.3.4のIPアドレスのみが応答します。
ここから
- 各レコードの重みづけを50ずつにするとトラフィックを分散することができる。
- SetID [tokyo]の重みづけを0、SetID [osaka]の重みづけを100にするとフェールオーバができる。
といったことが簡単に実現できたりします。
コマンドによるRoute 53の操作
では本題に入りますがAmazonLinuxに標準でインストールされているroute53コマンドを実行して 重みづけが変更できるか確認したいと思います。
[shell]
本頁で使用しているバージョン
$ python >>> import boto >>> boto.Version '2.23.0'
$ /usr/bin/route53 change_record "hosted_zone_id" hoge.nend.net. A 1.2.3.4 60 tokyo 0 Tried to create resource record set [name='hoge.nend.net.', type='A', set-identifier='hoge1'] but it already exists [/shell]
あれ?エラーになってしまい実行できません。
オプションを間違っているのかと試行錯誤しましたがどうやってもうまくいかないので、いつも大変お世話になっているAWSサポートに質問したところ、「route53コマンドが内部的に使用しているpython用のライブラリ(boto)の問題で失敗している」ようです。また、「Githubにおいても該当のIssueが登録されているものの修正時期は決まっていない」との回答を頂きました。
※注意※ 上記botoのバージョンでは本頁でやろうとしている「既存レコードの重みづけだけを変更する」ことができないようですが、route53コマンドを用いた「レコードの追加」や「レコードの削除」は問題なく行えるようです。
route53コマンドが使えなかったので違う方法を探したところ awsコマンドでもRoute 53の操作ができるようなのでこちらを試してみます。
[shell]
本頁で使用しているバージョン
$ rpm -qa | grep aws aws-cli-1.2.13-1.0.amzn1.noarch
$ aws route53 change-resource-record-sets --hosted-zone-id "hosted_zone_id" --change-batch file:///home/m_kiyota/hoge.nend.net.tokyo.json
$ aws route53 change-resource-record-sets --hosted-zone-id "hosted_zone_id" --change-batch file:///home/m_kiyota/hoge.nend.net.osaka.json
[/shell]
[shell]
cat /home/m_kiyota/hoge.nend.net.tokyo.json
{ "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "hoge.nend.net.", "ResourceRecords": [ { "Value": "1.2.3.4" } ], "SetIdentifier": "tokyo", "TTL": 60, "Type": "A", "Weight": 0 } } ] }
[/shell]
[shell]
cat /home/m_kiyota/hoge.nend.net.osaka.json
{ "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "hoge.nend.net.", "ResourceRecords": [ { "Value": "5.6.7.8" } ], "SetIdentifier": "osaka", "TTL": 60, "Type": "A", "Weight": 100 } } ] } [/shell]
コマンドを実行したところ、以下のように期待通りに更新がかかりました。
SetID [tokyo]のレコード
SetID [osaka]のレコード
この方法をうまく使えば監視サーバなどで特定の閾値を超えたレコードに対して 自動的にコマンドを実行して重みづけを変えることができるようになります。
ではまた。
補足
・今回はAレコードを使用しましたがレコードタイプがAliasやCNAMEでも同様のことが実現できます。 ・重みづけだけを変えたい場合はjsonに指定するTTLやSetIDが完全に一致している必要があります。 ・jsonに記載するキーの説明 http://docs.aws.amazon.com/cli/latest/reference/route53/change-resource-record-sets.html