1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Route 53でレコードを登録する機会があったのでawspecを使ってテストしてみた

Last updated at Posted at 2021-04-18

最近、仕事でRoute 53に対して数十件のレコードをAWSマネジメントコンソールの画面から手動で登録したんですが、登録したレコードの中にはMXレコードやSPFレコードが含まれていたため、ミスってたら怖いなぁと思い、以前から気になっていたawspecを触ってみるよい機会だと思い使ってみました。
ということで、ここではawspecを使ってRoute 53のレコードが正しく設定されているかを確認する手順を示します。

awspecとは?

awspecのGitHubのページを見ると「RSpec tests for your AWS resources.」とのこと。
RSpecの記法で書けるServerspecのAWS版といったところでしょうか。

今回の実行環境

  • macOS Catalina バージョン 10.15.5

必要なパッケージ

  • Ruby
  • Bundler

RubyとBundlerを利用するため、実行環境にインストール済みか確認します。

$ ruby -v
ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-darwin19]
$ bundler -v
Bundler version 2.2.16

事前準備

awspecではAWSの各リソースの読み取り権限のポリシーが付与されたIAMユーザーが必要です。
別の記事で紹介した「SecurityAudit」というIAMポリシーを利用することでAWSの多くのリソースにアクセスすることが可能ですが、今回はRoute 53に対してのみ読み取り権限があれば十分なので、「AmazonRoute53ReadOnlyAccess」のポリシーを付与してIAMユーザーを作成しました。

ユーザー名は「Route53ReadOnly」としました。マネジメントコンソールでは利用しないため、「プログラムによるアクセス」にのみチェックしておきます。
スクリーンショット 2021-04-15 9.55.07.png

「既存のポリシーを直接アタッチ」を選択して、「AmazonRoute53ReadOnlyAccess」にチェックします。
スクリーンショット 2021-04-15 9.55.29.png

「Name」というキー名に「Route53ReadOnly」を設定します。(このステップはスキップしてもOKです)
スクリーンショット 2021-04-15 9.55.53.png

確認画面で内容がOKだったら作成します。
スクリーンショット 2021-04-15 9.56.33.png

上記手順で作成したIAMユーザーの認証情報はあとの手順で利用するので控えておきます。

$ cat ~/Downloads/new_user_credentials.csv
User name,Password,Access key ID,Secret access key,Console login link
Route53ReadOnly,,XXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,https://XXXXXXXXXXXX.signin.aws.amazon.com/console

awspecのインストール

インストール作業用のディレクトリを作成し、そのディレクトリ配下にGemfileを作成します。

$ mkdir awspec_r53
$ cd awspec_r53 
$ bundle init
Writing new Gemfile to /PATH_TO/awspec_r53/Gemfile
$ cat <<EOF >> Gemfile
gem "awspec"
gem "rake"
EOF

カレントディレクトリ配下にインストールするために「bundle config set --local path」を実行した後に「 bundle install」を行います。

$ bundle config set --local path 'vendor/bundle'
$ cat .bundle/config 
---
BUNDLE_PATH: "vendor/bundle"
$ bundle install
Fetching rake 13.0.3
Installing rake 13.0.3
・
・
・
Bundle complete! 2 Gemfile dependencies, 290 gems now installed.
Bundled gems are installed into `./vendor/bundle`

以前は「bundle install --path」のように実行していたと思いますが、この手順は非推奨になっているようです。

$ bundle install --path vendor/bundle
[DEPRECATED] The `--path` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set --local path 'vendor/bundle'`, and stop using this flag

awspecの初期設定

awspecの初期設定を行うために、「bundle exec awspec init」でawspecのファイル群を生成します。
今回はawspecをローカル環境にインストールしたので、「bundle exec awspec init」を実行します。グローバルにインストールした場合は「awspec init」でよいはずです。

$ bundle exec awspec init
 + spec/
 + spec/spec_helper.rb
 + Rakefile
 + spec/.gitignore
 + .rspec

事前に控えておいたIAMユーザーの認証情報を以下のように入力し、「spec/secrets.yml」ファイルを作成します。

$ cat <<EOF > spec/secrets.yml
region: ap-northeast-1
aws_access_key_id: XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
EOF

これで準備が整いました。

specファイルの書き方について

Route 53のホストゾーンに対応するspecファイルの書き方については、ドキュメントがありますので事前に目を通しておきましょう。

Route 53で登録可能なレコードタイプには以下のようなものがあります。
スクリーンショット 2021-04-18 9.03.36.png

「awspec/lib/awspec/matcher/have_record_set.rb」の以下のコードを見ると、対応しているレコードタイプを確認できます。

  %w(soa a txt ns cname mx ptr srv spf aaaa caa).each do |type|
    chain type do |value|
      @type = type
      @value = value
      @options = {} if @options.nil?
    end
  end

ホストゾーンの作成

本番環境で実際に登録したレコード群をここで例示することはできないので、今回は個人で管理しているドメインを元に一時的にRoute 53のホストゾーンとして登録し、テストを書いてみようと思います。

Route 53の画面で「fifty-four.rocks」をホストゾーンとして登録します。

スクリーンショット 2021-04-18 9.19.15.png

初期状態ではNSレコードとSOAレコードが作成されています。

スクリーンショット 2021-04-18 9.21.24.png

specファイルの作成と実行

上記の初期状態のレコードに対してテストを作成します。
まず、「fifty-four.rocks」のホストゾーンが存在しているかを確認します。
次に初期状態のレコード数は2レコードなので、カウントが合致しているかを確認します。
NSレコードはデフォルトで4行登録されているので、ここでは配列の形式で定義し、引数に渡す際に改行を区切り文字として指定しています。
SOAレコードは文字列なので、そのまま引数に渡します。

$ cat spec/route53_spec.rb
require 'spec_helper'

describe route53_hosted_zone('fifty-four.rocks.') do
  it { should exist }

  its(:resource_record_set_count) { should eq 2 }

  ns = [
    'ns-1931.awsdns-49.co.uk.',
    'ns-296.awsdns-37.com.',
    'ns-902.awsdns-48.net.',
    'ns-1286.awsdns-32.org.',
  ]
  it { should have_record_set('fifty-four.rocks.').ns(ns.join("\n")).ttl(172800) }

  soa = 'ns-1931.awsdns-49.co.uk. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400'
  it { should have_record_set('fifty-four.rocks.').soa(soa).ttl(900) }
end

それではテストを実行してみます。
今回はrakeをローカル環境にインストールしたので、「bundle exec rake spec」を実行します。グローバルにインストールした場合は「rake spec」でよいはずです。

$ bundle exec rake spec
route53_hosted_zone 'fifty-four.rocks.'
  is expected to exist
  is expected to have record set "fifty-four.rocks."
  is expected to have record set "fifty-four.rocks."
  resource_record_set_count
    is expected to eq 2

Finished in 1.8 seconds (files took 2.95 seconds to load)
4 examples, 0 failures

4件のテストがすべて成功しました。

次にfifty-four.rocksのAレコードをRoute 53に登録します。
その前に、現状のAレコードをdigコマンドで確認してみましょう。

$ dig fifty-four.rocks a +short    
3.0.239.142
104.248.158.121

上記の2レコードが返ってきましたので、このテストをspecファイルに追加します。変更箇所は以下の通りです。

cat spec/route53_spec.rb 
require 'spec_helper'

describe route53_hosted_zone('fifty-four.rocks.') do
  ・
  ・
  ・
  its(:resource_record_set_count) { should eq 3 }
  ・
  ・
  ・
  a = [
    '3.0.239.142',
    '104.248.158.121',
  ]
  it { should have_record_set('fifty-four.rocks.').a(a.join("\n")).ttl(300) }
  
end

テストを実行して、失敗することを確認します。

$ bundle exec rake spec      
route53_hosted_zone 'fifty-four.rocks.'
  is expected to exist
  is expected to have record set "fifty-four.rocks."
  is expected to have record set "fifty-four.rocks."
  is expected to have record set "fifty-four.rocks."
  resource_record_set_count
    is expected to eq 3 (FAILED - 1)

Failures:

  1) route53_hosted_zone 'fifty-four.rocks.' resource_record_set_count is expected to eq 3
     Failure/Error: its(:resource_record_set_count) { should eq 3 }
     
       expected: 3
            got: 2
     
       (compared using ==)
     # ./spec/route53_spec.rb:6:in `block (2 levels) in <top (required)>'

Finished in 1.76 seconds (files took 4.06 seconds to load)
5 examples, 1 failure

Failed examples:

rspec ./spec/route53_spec.rb:6 # route53_hosted_zone 'fifty-four.rocks.' resource_record_set_count is expected to eq 3

Route 53にAレコードを登録します。
スクリーンショット 2021-04-18 9.44.00.png

テストを再度実行します。

$ bundle exec rake spec

route53_hosted_zone 'fifty-four.rocks.'
  is expected to exist
  is expected to have record set "fifty-four.rocks."
  is expected to have record set "fifty-four.rocks."
  is expected to have record set "fifty-four.rocks."
  resource_record_set_count
    is expected to eq 3

Finished in 1.56 seconds (files took 4.11 seconds to load)
5 examples, 0 failures

5件のテストがすべて成功しました。

こういった感じで、後は「テストを作成 → レコードを登録 → テストを実行」を繰り返すことで安心してDNSの設定変更作業を行うことができるのではないでしょうか。

参考URL

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?