最近試していた Piculet に続き,Codenize.tools の中でも特によく使われてそうな Roadworker を試した.セキュリティグループほどの複雑さはないけど,ドメイン設定も管理コンソールで運用するのではなく,宣言的にコード化を進めて,レビュープロセスを通してから反映するべきだなと考えていて,既に稼働しているシステムに導入するのに適切なツールだなと感じている.
今年7月に開催された Infrastructure as Code 勉強会でも DNS 設定を Reproducible(再現可能) に管理する事例として Roadworker が紹介されていた.
エクスポート
既に 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
なぜ 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
で実際にレコードのテストができるのは凄く良いな!参考になる記事だった.
前に Piculet を試したときにまとめた記事も合わせて見てもらえると良さそう.
Codenize Meetup
絶対に参加したかった Codenize Meetup の抽選に当たって参加できることになった!来週楽しみ!