2017年6月27日火曜日

AWS SDK Ruby を使ってニフティクラウド DNS を操作してみた

概要

久しぶりの連投です
前回ニフティクラウド DNS に A レコードを追加してみました
アプリケーションで使う場合、手動で毎回 A レコードを登録するのは現実的ではありません
ニフティクラウド DNS の API は AWS の Route53 に互換してるらしいので AWS の Ruby SDK を使ってニフティクラウド DNS が制御できるか試してみました

環境

  • CentOS 7.3.1611
  • Ruby 2.3.3p222
  • aws-sdk-v1 1.67.0

事前作業

ニフティクラウド API のアクセスキーとシークレットキーを事前に取得しておいてください
あとはニフティクラウド DNS に適当にゾーン登録しておくと今回紹介する Ruby のサンプルも動くの良いかと思います

ライブラリインストール

執筆時現在 AWS の Ruby SDK には v1 と v2 があります
今回は v1 を使います
ちなみに v1 は duplicated になっているので、普通に AWS を使う場合は v2 を使ってください
また今回のコードは v2 との互換がないので v2 だと動作しないのでご注意ください

  • bundle init
  • vim Gemfile
gem "aws-sdk-v1"
  • bundle install –path vendor/bundle

グローバルにインストールしても良いですが今回はカレントにインストールします

書き換え

実はそのままでは使えません
ニフティクラウド DNS の API バージョンは 2012-12-12N2013-12-16 となっています
AWS の Route53 のバージョンは 2012-12-12 と 2013-04-01 がありますが、どちらもニフティクラウド DNS のバージョンとは異なります
当然 SDK も 2012-12-12N2013-12-16 のバージョンを受けることができないので、このバージョンを受けれるように修正する必要があります

  • vim vendor/bundle/ruby/2.3.0/gems/aws-sdk-v1-1.67.0/lib/aws/route_53/client.rb
class Client::V20121212N20131216 < Client
  define_client_methods('2012-12-12N2013-12-16')
end

で新しいバージョン用の class を作成します
このコードは行数が少ないので書き換えやすいと思います

  • cp vendor/bundle/ruby/2.3.0/gems/aws-sdk-v1-1.67.0/lib/aws/api_config/Route53-2012-12-12.yml vendor/bundle/ruby/2.3.0/gems/aws-sdk-v1-1.67.0/lib/aws/api_config/Route53-2012-12-12N2013-12-16.yml

次にバージョン用の API 定義ファイルを作成します
まず既存のファイルからコピーします
そしてファイルを開いて「2012-12-12」の部分を「2012-12-12N2013-12-16」にすべて置換します

  • vim vendor/bundle/ruby/2.3.0/gems/aws-sdk-v1-1.67.0/lib/aws/api_config/Route53-2012-12-12N2013-12-16.yml
    • %s/2012-12-12/2012-12-12N2013-12-16/

エンドポイントの部分もありますが、これも変更しておきましょう

route53.amazonaws.com -> dns.api.cloud.nifty.com

そして最後に Core のコードを書き換えます
名前からしてかなり行数が長いです
606 行目あたりにある operations メソッドを書き換えます

  • vim vendor/bundle/ruby/2.3.0/gems/aws-sdk-v1-1.67.0/lib/aws/core/client.rb
def operations(options = {})
  if name.match(/V\d{8}$/)
  then
    @operations ||= []
  elsif name.match(/V\d{8}N\d{8}$/)
  then
    @operations ||= []
  else
    client_class(options).operations
  end
end

elsif が追加されています
要するに「2012-12-12N2013-12-16」のフォーマットを受け付けるようにします
これを追加しないと無限ループが起き「stack level too deep (SystemStackError)」が発生します

これで書き換えは完了です
実際に使ってみます

サンプルスクリプト

  • vim dns.rb
require 'aws-sdk-v1'

AWS.config(
           :route_53 => {
             :endpoint => 'dns.api.cloud.nifty.com',
             :api_version => '2012-12-12N2013-12-16'
           },
           :access_key_id => 'your-niftycloud-access-key-id',
           :secret_access_key => 'your-niftycloud-secret-access-key'
)

r53 = AWS::Route53.new

hosted_zone = r53.hosted_zones.find {|z|
  p z.name
}

ゾーンの一覧を取得するスクリプトです

動作確認

  • bundle exec ruby dns.rb –path vendor/bundle/

で実行できます
成功すると登録してあるゾーンの一覧を取得することができます

あとは AWS の Ruby SDK のリファレンスを参考にレコードを登録する関数などを呼び出せば動作すると思います
http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/Route53.html
(と思ったんですが、hosted_zone.rrsets.create を実行してみたら Inappropriate XML でエラーになってしまいました、、、)

最後に

AWS SDK Ruby の v1 を使ってニフティクラウド DNS をコールしてみました
ゾーンの一覧の取得はできたんですが、レコードの登録でつまづきました
たぶん同じように SDK を修正すれば動くようになるとは思いますが、ちょっと辛そうな感じがするのでこれくらいにしておこうと思います

2017年6月26日月曜日

ニフティクラウド DNS にゾーン登録して A レコードで名前解決してみる

概要

適当なドメインを取得してそのドメインをニフティクラウド DNS のゾーンとして登録してみます
その後登録したゾーンに対して A レコードを登録してドメインから IP が引けるか試してみます
今回使用するドメインは無料で取得できるドメインにしました

環境

  • ニフティクラウド (2016/12/25 時点)
    • Region: east-1 (Zone: east-12)

ドメインの取得

ニフティクラウド DNS ではゾーンを登録をする際に認証処理があります
要するにそのドメインがちゃんと自分のものであるかどうかを判断します

今回は whois 認証という方式を使うのですがニフティクラウド DNS の whois 認証で使えるドメインは以下の通りとなっています
http://cloud.nifty.com/spec/dns/dns_zone.htm

ここに記載のドメイン以外で認証することはおそらくできないのでここに記載のドメインを取得してください
今回は無料で取得できる「.tk」ドメインを取得しました

もちろん無料のドメインではなく「お名前.com」などのドメインサービスで取得しても OK です

ネームサーバの登録

取得したドメインのネームサーバを設定します
大抵の場合は取得したドメインサービスの機能でネームサーバを設定することができます
ニフティクラウド DNS の場合認証用のネームサーバ 1 台とリゾルバの 2 台のネームサーバを登録します

niftycloud_dns1.png
※画面は自分が使っているドメインサービスのネームサーバの設定画面です

ここで入力しているネームサーバは次のゾーン登録の手順で表示されるので、それを入力します

ニフティクラウド DNS で認証を行いゾーン登録する

ニフクラコンパネにログインして DNS の画面に進みます

DNS ゾーン管理 -> DNS ゾーン登録

でゾーン名に今回取得したドメインを入力します
niftycloud_dns2.png

すると認証画面になります
ここでネームサーバ 3 台の情報が表示されるのでドメインサービス側の設定でネームサーバを設定してください
niftycloud_dns3.png

そして「認証処理を実行する」をクリックするのですが、DNS の伝搬に少し時間がかかるので待ちましょう
ボタンを押しても伝搬できていない場合は失敗するだけなので、何度もトライすれば OK です
自分の場合 5 分ほどかかりました

で認証が完了するとランダムの文字列が付与されたネームサーバは削除してくださいという旨が表示されるので削除してください
問題なくゾーン登録が出来ると一覧画面に表示されます
niftycloud_dns4.png

A レコードを登録してみる

試しにて自分のサーバをドメインで引けるようにしてみましょう
サーバは何でも OK ですがグローバル IP を持っているサーバが良いかなと思います
登録したドメインを選択し「レコード新規作成」を選択します
タイプを A にし必要な情報を入力していきます
niftycloud_dns5.png

ポリシーには「重み付け」と「フェイルオーバー」の機能がありますがとりあえず今回は 1 台なので特に設定しません
問題なければ確認してレコードを登録します

ニフティクラウド DNS の場合、ゾーン登録は無料です
が、レコード登録は有料で 500円/10レコードになっていました
そして 11 レコード目からの 10 レコードは更に料金が発生します
また、先ほど紹介したレコードのポリシー機能は各レコードを追加する毎に料金が発生するようです
http://cloud.nifty.com/price/ep.htm#dns

とりあえずレコードが登録できれば完成です

動作確認

登録したレコードで IP が引けるか確認してみましょう
かつ、ネームサーバがニフティクラウド DNS のものになっているか確認します
確認は Mac 上の dig コマンドを使っています
また、IP の部分は一部情報をマスクしています

  • dig test.free-registry.tk
; <<>> DiG 9.8.3-P1 <<>> test.free-registry.tk
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65377
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;test.free-registry.tk.         IN      A

;; ANSWER SECTION:
test.free-registry.tk.  86400   IN      A       111.xxx.xxx.xxx

;; Query time: 182 msec
;; SERVER: 192.168.100.1#53(192.168.100.1)
;; WHEN: Mon Jun 26 12:15:19 2017
;; MSG SIZE  rcvd: 55

ANSWER SECTION の部分で登録した IP が引けているのがわかると思います

  • dig free-registry.tk NS
; <<>> DiG 9.8.3-P1 <<>> free-registry.tk NS
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51457
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;free-registry.tk.              IN      NS

;; ANSWER SECTION:
free-registry.tk.       3600    IN      NS      cdns1.nifty.ad.jp.
free-registry.tk.       3600    IN      NS      cdns0.nifty.ad.jp.

;; Query time: 194 msec
;; SERVER: 192.168.100.1#53(192.168.100.1)
;; WHEN: Mon Jun 26 12:16:50 2017
;; MSG SIZE  rcvd: 85

ANSWER SECTION の部分でニフティクラウド DNS のネームサーバが表示されていることがわかると思います

最後に

ニフティクラウド DNS を使ってドメインから IP が引けるところまでやってみました
ゾーン登録をするのに認証処理が必要なのでハマるとしたらそこかなと思います

スペック表を見る限りレコード数に上限はないので、料金さえ払えば無限にレコードは登録できそうです
一応 API もあるのでこれを使えばプログラムからでもゾーンやレコード登録ができると思います