読者です 読者をやめる 読者になる 読者になる

Route 53 の管理を自動化できる Roadworker を試して GeoLocation のエクスポートを直した

最近試していた Piculet に続き,Codenize.tools の中でも特によく使われてそうな Roadworker を試した.セキュリティグループほどの複雑さはないけど,ドメイン設定も管理コンソールで運用するのではなく,宣言的にコード化を進めて,レビュープロセスを通してから反映するべきだなと考えていて,既に稼働しているシステムに導入するのに適切なツールだなと感じている.

github.com

今年7月に開催された Infrastructure as Code 勉強会でも DNS 設定を Reproducible(再現可能) に管理する事例として Roadworker が紹介されていた.

kakakakakku.hatenablog.com

エクスポート

既に Route 53 に適用されている設定を簡単にエクスポートすることができる.Roadworker では冪等性が保証されているため,エクスポートした直後に反映しても,変更点がないため,副作用が起きないという点に良さがある.

$ roadwork --export --output Routefile
Export Route53 to `Routefile`

エクスポートされる Routefile は以下のような DSL となる.宣言的になっているため,読んで理解できるのは素晴らしい.

# -*- mode: ruby -*-
# vi: set ft=ruby :
hosted_zone "kakakakakku.com." do
  rrset "blog.kakakakakku.com.", "A" do
    ttl 300
    resource_records(
      "127.0.0.1",
      "127.0.0.2"
    )
  end
end

反映

Routefile を修正して簡単に反映することができる.以下は最初に --dry-run で確認した後に反映した.

$ roadwork --apply --dry-run
Apply `Routefile` to Route53 (dry-run)
Update ResourceRecordSet: blog.kakakakakku.com. A (dry-run)
  resource_records:
    -[{:value=>"127.0.0.1"}, {:value=>"127.0.0.2"}]
    +[{:value=>"127.0.0.1"}, {:value=>"127.0.0.2"}, {:value=>"127.0.0.3"}] (dry-run)
No change

$ roadwork --apply
Apply `Routefile` to Route53
Update ResourceRecordSet: blog.kakakakakku.com. A
  resource_records:
    -[{:value=>"127.0.0.1"}, {:value=>"127.0.0.2"}]
    +[{:value=>"127.0.0.1"}, {:value=>"127.0.0.2"}, {:value=>"127.0.0.3"}]

冪等性も保証されている.

$ roadwork --apply
Apply `Routefile` to Route53
No change

GeoLocation レコードのエクスポートに問題があった

GeoLocation レコードをエクスポートしたときに,以下のように geo_location の部分に Ruby の struct がそのまま出力されてしまっていることに気付いた.

# -*- mode: ruby -*-
# vi: set ft=ruby :
hosted_zone "kakakakakku.com." do
  rrset "geo.kakakakakku.com.", "A" do
    set_identifier "1234"
    ttl 300
    geo_location #<struct Aws::Route53::Types::GeoLocation continent_code="AS", country_code=nil, subdivision_code=nil>
    resource_records(
      "127.0.0.1"
    )
  end
end

デバッグしながら修正して,プルリクを送って,無事にマージしてもらうことができた(クローズになるかもなーと予想していたけど).簡単に言うと,GeoLocation の場合は value のクラスが Hash ではなく Aws::Route53::Types::GeoLocation になるため,その部分をハンドリングできるようにした.ハッシュ化された文字列から {} を除去するロジックはそのまま残している.

現在 v0.5.8.beta2 に暫定的に取り込まれていて,以下のように出力できるようになっている.

# -*- mode: ruby -*-
# vi: set ft=ruby :
hosted_zone "kakakakakku.com." do
  rrset "geo.kakakakakku.com.", "A" do
    set_identifier "1234"
    ttl 300
    geo_location :continent_code=>"AS"
    resource_records(
      "127.0.0.1"
    )
  end
end

github.com

なぜ GeoLocation に気付いたかというと,前に AWS 認定を勉強していたとき に Route 53 の機能をいろいろと試していて,そのときに作った GeoLocation レコードがたまたま残っていたという感じ.

RSpec を流す前に気を付けること

プルリクを送る前に一度テストを通してみようと思って RSpec を流したら,個人の AWS アカウントの Route 53 設定が全て吹っ飛んで焦った!!!検証用のドメインだから問題なかったし,エクスポートした Routefile をすぐ反映して戻せたから良かったけど,気を付けないと事故に繋がりそう.

ちなみに spec_helper.rb を見ればわかる通り,テスト用の環境変数を設定しないと流せないため,デフォルトの状態で RSpec を流しても副作用は起きなかった.プルリクを送ったときに TravisCI で流れたテストも落ちていたけど,マージされていたし,テスト用の AWS アカウントを用意して安全に運用するのも結構大変だなぁ...という印象だった.

まとめ

Piculet と同様に AWS リソースを部分的にコード化していく中で,Route 53 を管理する Roadworker は凄く便利だと思った.CircleCI 経由で自動的に反映する運用も含めて整理して,チームに提案してみようと思う.

関連記事

roadwork --test で実際にレコードのテストができるのは凄く良いな!参考になる記事だった.

tech.feedforce.jp

前に Piculet を試したときにまとめた記事も合わせて見てもらえると良さそう.

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

Codenize Meetup

絶対に参加したかった Codenize Meetup の抽選に当たって参加できることになった!来週楽しみ!

codenize.connpass.com