Infrataster::Plugin::Dns(infrataster-plugin-dns)を活用して、ネームサーバ切り替えを堅実に実施する

# Infrataster::Plugin::Dns(infrataster-plugin-dns)を活用して、ネームサーバ切り替えを堅実に実施する

## したいこと

**example.comのネームサーバを、あるDNSサーバ(currentdns.com / 203.0.113.1)からRoute53に切り替えたい！**

よくありますよね？

そんな切り替え作業のとき、レコードがちゃんとお互いに設定されているかを目視で確認していたり、ネームサーバの切り替え確認を`dig`で実施していたりしているのを、[Infrataster::Plugin::Dns](https://github.com/otahi/infrataster-plugin-dns)を活用して堅実に実施してみます。

## 手順

### Infrataster::Plugin::Dnsのインストール

適当なディレクトリを作成して、

```sh
$ mkdir infraspec/
$ cd infraspec/
```

`Gemfile` を記述します

```ruby
# infraspec/Gemfile
source 'https://rubygems.org'
gem 'infrataster-plugin-dns'
```
で、`bundle install` でインストールします。

最低限の `Rakefile` もつくっておきましょう

```ruby
# infraspec/Rakefile
require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new('spec')
task :default => :spec
```

### 現行のネームサーバの設定のspecを作成

```sh
$ mkdir spec/
```
`spec_helper.rb`を設置します。

```ruby
# infraspec/spec/spec_helper.rb
require 'infrataster/rspec'
require 'infrataster-plugin-dns'

# 現行のネームサーバ設定
Infrataster::Server.define(
  :currentdns,
  '203.0.113.1' # 現行のネームサーバのIPアドレス
)
```

現行のネームサーバの設定を記述します。

```ruby
# infraspec/spec/currentdns_spec.rb
require 'spec_helper'

describe server(:currentdns) do
  describe dns('example.com') do
    it { is_expected.to have_entry.with_type('A').and_address('203.0.113.2') }
    it { is_expected.to have_entry.with_type('MX').and_preference(10).and_exchange('mail.example.com') }
  end
  describe dns('mail.example.com') do
    it { is_expected.to have_entry.with_type('CNAME').and_domainname('foobarmailservice.com') }
  end
end
```

ここで一旦`rake spec`を実行して、 **グリーン** になることを確認します。

```sh
$ cd infraspec/
$ bundle exec rake spec

server 'currentdns'
  dns 'example.com'
    should have the correct dns entries with {:type=>"A", :address=>"203.0.113.2"}
    should have the correct dns entries with {:type=>"MX", :preference=>10, :exchange=>"mail.example.com"}
  dns 'mail.example.com'
    should have the correct dns entries with {:type=>"CNAME", :domainname=>"foobarmailservice.com"}

Finished in 0.17017 seconds (files took 2.48 seconds to load)
3 examples, 0 failures
```

**グリーン** になりました。

### Route53のHosted Zoneにexample.comを追加

追加するとSOAレコードとNSレコードが追加された状態で作成されます。

### Route53の設定を追加

`spec_helper.rb`にRoute53のネームサーバ情報を追記します。

```ruby
# Route53のネームサーバ設定
Infrataster::Server.define(
  :route53dns,
  'XXX.XXX.XXX.XXX' # ns-1234.awsdns-56.org NSレコードに追加されたドメインのIPアドレスを1つ
)
```

### Route53のネームサーバの設定のspecを作成

`infraspec/spec/currentdns_spec.rb`をコピーして作成します。

```ruby
# infraspec/spec/route53dns_spec.rb
require 'spec_helper'

describe server(:route53dns) do
  describe dns('example.com') do
    it { is_expected.to have_entry.with_type('A').and_address('203.0.113.2') }
    it { is_expected.to have_entry.with_type('MX').and_preference(10).and_exchange('mail.example.com') }
  end
  describe dns('mail.example.com') do
    it { is_expected.to have_entry.with_type('CNAME').and_domainname('foobarmailservice.com') }
  end
end
```

ここで一旦`rake spec`を実行して、 **レッド** になることを確認します。

### Route53のネームサーバの設定にレコードを追加していく

`rake spec`の実行結果が **グリーン** になるように、Route53のネームサーバの設定にレコードを追加していきます。

**グリーン** になったらRoute53のネームサーバの設定完了です。

### ネームサーバ切り替え簡易確認用のspecを記述する

Google Public DNSを借ります。`spec_helper.rb`に追記します。

```ruby
# Google Public DNS
Infrataster::Server.define(
  :google,
  '8.8.8.8'
)
```

```ruby
# infraspec/spec/google_spec.rb
require 'spec_helper'

describe server(:google) do
  describe dns('example.com') do
     it { is_expected.to have_entry.with_type('NS').and_domainname('ns-1234.awsdns-56.org') } # Route53のネームサーバ
  end
end
```

ここで一旦`rake spec`を実行して、 **レッド** になることを確認します。

### ネームサーバを切り替える

ネームサーバを切り替えます。

### ネームサーバが切り替わったか確認する

`rake spec`を実行して、**グリーン** になったら少なくともGoogle Public DNSへ切り替え設定が反映されたことが確認できます。

終わり！