コマンドを使ってAmazon Route 53のレコードを変更する


こんにちは。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

record_tokyo_before

サブドメイン名:hoge.nend.net
レコードタイプ:A
IPアドレス:5.6.7.8
TTL:60(秒)
SetID:osaka
重みづけ:0

record_osaka_before

と上記のように重みづけを行った場合、通常はhoge.nend.netに問い合わせを行うと
SetID [tokyo]に設定した1.2.3.4のIPアドレスのみが応答します。

ここから

  • 各レコードの重みづけを50ずつにするとトラフィックを分散することができる。
  • SetID [tokyo]の重みづけを0、SetID [osaka]の重みづけを100にするとフェールオーバができる。

といったことが簡単に実現できたりします。

コマンドによるRoute 53の操作

では本題に入りますがAmazonLinuxに標準でインストールされているroute53コマンドを実行して
重みづけが変更できるか確認したいと思います。

#本頁で使用しているバージョン
$ 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

あれ?エラーになってしまい実行できません。

オプションを間違っているのかと試行錯誤しましたがどうやってもうまくいかないので、いつも大変お世話になっているAWSサポートに質問したところ、「route53コマンドが内部的に使用しているpython用のライブラリ(boto)の問題で失敗している」ようです。また、「Githubにおいても該当のIssueが登録されているものの修正時期は決まっていない」との回答を頂きました。

※注意※
上記botoのバージョンでは本頁でやろうとしている「既存レコードの重みづけだけを変更する」ことができないようですが、route53コマンドを用いた「レコードの追加」や「レコードの削除」は問題なく行えるようです。

route53コマンドが使えなかったので違う方法を探したところ
awsコマンドでもRoute 53の操作ができるようなのでこちらを試してみます。

#本頁で使用しているバージョン
$ 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

 


#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
   }
  }
  ]
}

 


#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
  }
 }
 ]
}

コマンドを実行したところ、以下のように期待通りに更新がかかりました。

SetID [tokyo]のレコード

record_tokyo_after

SetID [osaka]のレコード

record_osaka_after

この方法をうまく使えば監視サーバなどで特定の閾値を超えたレコードに対して
自動的にコマンドを実行して重みづけを変えることができるようになります。

ではまた。

補足

・今回はAレコードを使用しましたがレコードタイプがAliasやCNAMEでも同様のことが実現できます。
・重みづけだけを変えたい場合はjsonに指定するTTLやSetIDが完全に一致している必要があります。
・jsonに記載するキーの説明
http://docs.aws.amazon.com/cli/latest/reference/route53/change-resource-record-sets.html

Add a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*