VOYAGE GROUP エンジニアブログ

voyagegroup_techのブログ
VOYAGE GROUPエンジニアブログです。

ruby

Route53をbind形式のzoneファイルで管理するツール, bind2route53を作成して公開しました。

こんにちは。
VOYAGE GROUPのシステム本部でインフラエンジニアとして働いている @s_tajima です。


DNSサーバーとしてRoute53を利用しようとした場合、
登録されたゾーン(HostedZone)やレコードをどのように管理するかというのに
悩んでいる方々も多いと思います。


特にVOYAGE GROUPでは、
現在 約100ゾーン,  約2500レコード
というとても多いレコードを管理しているのでとても重要な問題です。

一般的にすぐに思いつく管理の手段としては,,

  1. Management Consoleを操作してゾーン/レコードを管理する。
  2. AWSが提供するSDK等を使い、Route53のAPI(ChangeResourceRecordSets等)を叩く。
  3. 既存のRoute53の管理ツール(RoadWorker等)を使う。

などがあると思います。

これらの手段を選択する前に、Route53を管理する上で、
どのような用件が満たされていると良さそうかを考えてみましょう。

  1. ゾーンの編集(作成, 削除)/基本的なレコードの編集(作成, 削除, 変更)ができる
  2. 本番環境の設定変更の前に、適切な検証環境でレコードの変更をテストできる
  3. 2で実施した変更と完全に同一な変更を本番環境に適用できる 
  4. 適用した変更を(出来る限り短期間で)切り戻せる
  5. 任意の時点での変更内容を後から確認できる
  6. Route53から別のDNSサーバーに移設したいとなった時に、低いコストで対応できる
  7. Route53独自の機能(ALIASレコード等)を利用できる

と、このあたりでしょうか。

具体的な説明は割愛しますが、
検証の結果先に挙げた3つの手段では
これらの用件を満たすことは不可能/工夫が必要だということがわかりました。

このような背景から上記の用件を実現できるツールとして,
bind2route53(https://github.com/voyagegroup/bind2route53)を作成しました。


bind2route53_fig1
このツールがどのような機能をもっているかを簡単に説明すると、

・bind形式のzoneファイルをCloudFormationのTemplateに変換する。(convert_zonefile)
・Route53上に、ゾーンを作成する。(create_hostedzone)
・CloudFormationに、Route53を管理するためのStackを作成する。(create_hostedzone_stack)
・CloudFormationのStackを更新し、Route53のゾーン/レコードの編集をする。(update_hostedzone_stack)

というシンプルなツールとなっています。
このツールがどのように上記の用件を満たしているのかを説明すると、

1. ゾーンの編集(作成, 削除)/基本的なレコードの編集(作成, 削除, 変更)ができる
 上記の機能を見ればこの用件を満たしていることはわかると思います。

2. 本番環境の設定変更の前に、適切な検証環境でレコードの変更をテストできる
 上記の機能を実施する際, 設定ファイルにIAMの鍵を複数設定し、どの鍵を利用するかを指定します。
 検証環境用の鍵と本番環境の鍵を登録することで、事前に検証環境でテストをすることができます。
  ※尚、検証環境と本番環境は、別のAWSのアカウントを用意することを前提としています。

bind2route53_fig4


3. 2で実施した変更と完全に同一な変更を本番環境に適用できる 
 検証環境に対して実行したコマンドを、
 環境の部分だけ本番環境とすることで同じ内容が本番環境に適用されることが保証されます。

4. 適用した変更を(出来る限り短期間で)切り戻せる
 bind形式のzoneファイルをバージョン管理(gitやsvn)しておき、
 設定に不備があった場合にはzoneファイルを切り戻し(git checkoutやsvn revert)して
 再度CloudFormationに適用することで、切り戻しが行えます。

5. 任意の時点での変更内容を後から確認できる
 4に記載した通り、zoneファイルをversion管理下に置くことで変更の履歴を閲覧できます。

6. Route53から別のDNSサーバーに移設したいとなった時に、低いコストで対応できる
 bind形式のzoneファイルを管理するので、一般的な別のDNS管理サービスへの移設コストは低いと言えます。
 (Route53もそうだが、bind形式のzoneファイルをimportする機能を提供するサービスが多い。)

7. Route53独自の機能(ALIASレコード等)を利用できる
 例外的に、zoneファイルに独自のシンタックスを記述することで
 Route53独自の機能を利用できるような機能を提供しています。

使い方についての詳細は こちら に記載してあるので参考にしてぜひお使いください。
以上、bind2route53の紹介でした。

#====================================

※尚, VOYAGE GROUPでの現在の運用環境では
bind2route53をラップするスクリプト 
(convert_zonefile -> update_hostedzone_stackをコマンド1つで行う等)や、
DNSの設定変更をした際に、その変更が正しくできているかを確認するツール
(内部的にはdigを実行して意図した結果が返ってくるかの確認)を
を作成して、合わせて利用しています。

TokyuRuby会議04の会場提供と発表を行った件について #tqrk04

@bash0C7です。ECナビ事業本部でエンジニアをしつつ、アジャイル戦略室という活動を行なっています。

去る2011/10/29(土)に、VOYAGE GROUPのセミナールーム「パンゲア」を会場として、プログラミング言語Rubyに関するカンファレンスの一つ、TokyuRuby会議04が開催されました。

わたしはそこで開場の人&発表者をさせていただきました。素晴らしい参加者、スポンサー、主催者による、人を大事にするRubyらしい素晴らしい会議でした。その一端を担えたことを誇りに思います。

大変ありがたいことに発表公募の選考に通過し、「闇からの伝言」というタイトルでお話させていただきました。

通常なら提示資料を公開するところですが、今回はトークスクリプトを公開しようと思います。
本番は
アドリブが入っているので、スクリプトと本番の語りとで差異がありますがご容赦ください。

「闇からの伝言」
001

(BGMスタート)

闇、について一つ問題提起をしたい。
ネガティブイメージで使われがちなこの言葉だが、だが本当にそれでいいのだろうか。

物事にはいろいろな側面がある。

光あれば闇があり、ウォーターフォールがあればAgileがあり、
PHPがあれば Rubyがある。

そういう分野に限った話ではない。

妖怪があれば、人間があり。
神様がいれば、 常人もいる。

いいとか悪いとか、使うべきとか消し去りたいとか、そんな事じゃない。どちらも必要なのです。
一番の問題は、この、救いようのない世界で、わたしたちがどうするか。
どうすればわたしたちが助かるのか、どうすれば運命を変えられるのか、その答えだけを探して、何度も始めからやり直して…

ごめんね。わけわかんないよね…気持ち悪いよね。

でも、わたしたちにとって立ち止まることと、諦めることは同義だ。
何もかもが無駄だった、と、決して運命を変えられないと確信したその瞬間に、ぼくらは絶望に負けて、老害へと変わるだろう。
勝ち目のあるなしにかかわらず、僕らは戦うしかないんだよ。

(このあたりでBGM変わる)

逆に言うと、戦い続ければいい。闘うフィールドは数限りなくある。取りうる工夫も様々にある。
継続したコミュニティの集まりが怖くても、カンファレンス。ちゃんとしたLTが怖い、闇。
技術がなくても、それらを開催することはできる。

そして、それは今すぐできる。いつかじゃない。来月でも来週でも明日でもない。明日って今さ!

RubyKaigiだってそうさ。どうなるんですか?じゃない。こうしましょう!でしょう!!
The RubyKaigiは自分の手に余る?Regional RubyKaigiがある。
Tokyo0X、Keio、Tobu、Shiba、Boso、まだまだ行われてない地域や回がある。
やり方も様々なスキームがある。セミナー、LT、花見、うまいものを食べる、全員トーカー、ワークショップ、様々な工夫がある。

それに、一人で全てやりきる必要はない。チームを作る。まわりのrubyistに声をかけて。
首都圏ならもはや石を投げればrubyistに当たる。それに、先達もたくさんいる。助けてもらえる。

規模も自分たちが扱えるサイズで大丈夫。

(このあたりでBGMかわる)

かの偉大な作家も言っていた。
夢をかなえてもらう立場から、夢をかなえさせてあげる立場に、どんと変わるんだよ。
大人を逃げるな。
と。

我々VOYAGE GROUPもさらなる挑戦のステージにいる。すでに挑戦は始まっている。できるできないかじゃない。やるんだよ。ナントカだからできない、で止めるじゃない。ナントカを解決すればいいんだよ。やるんだよ。

RubyConf2011でのLTだってそうさ。

(このあたりでドラ。鳴るまで、思いつく限りまくし立てる)

RubyConf2011 に行って感じたエコシステムっぽいもの

こんにちは、システム本部 インフラエンジニアの岩本です。

いきなりですが、弊社には育成制度の一環として、カンファレンスなどへの参加費用を会社が負担してくれる、という制度があります。

そんなわけで私も先日この制度を利用し、アメリカのニューオーリンズで行われたRubyConf2011 に参加してきました。

日本でのRubyカンファレンスであるRubyKaigi(以下,日本Ruby会議) には当日スタッフとして参加していましたが、海外でのRubyカンファレンスは初めての経験です。

今回はその初体験レポートになります。

■概要
RubyConf_logo

今年の期間は9/29 - 10/1 の3日間でした。
規模はだいたい400 〜 500 人くらいじゃないかと思います。(大雑把。。)

昨年に引き続き、今年も開催地となったニューオーリンズはJazz の街として有名で、街中ではギターやサックスを奏でる外人さんがたくさんおり、昼間でもライブバーからバンドマンの歌声が聞こえてきているような、陽気な街でした。
特にカンファレンス会場となったホテルのすぐ隣はバーボンストリートと呼ばれる繁華街で、夜になると本当にびっくりするくらいにぎやかで驚きました。

IMG_20110929_161514
写真: バーボンストリートで演奏する人たち。と、なぜか(?) ピョンピョン飛び跳ねていた上半身裸の男性。陽気ですね。。



■セッションについて
IMG_20110929_093009

セッションはRuby の仕様に関する話から、Ruby とは直接は関係ないプログラミング環境に関するものまで様々。
Ruby に関するものだけかと思いきや、意外にその他の話題もたくさんありました。
Rubyist 以外のエンジニアが来てもそれなりに楽しめるラインナップだったのではないかと思います。

タイムテーブルはこちらで参照可能です。

また、動画はconfreaks に随時アップロードされているようです。
弊社エンジニアのこしばさんによるLTも視聴できます。まだご覧になってない方はぜひご覧ください。

セッションの内容については、るびまにフィードバックの記事が載る、かもしれません。興味ある方はこちらもチェックしてみてください。

個人的に一番印象に残っているのは、Github の方のセッションでした。(動画がなかったので、スライドへのリンクです。)
ノっているサービス作ってると、セッションもノリノリだなぁと笑。

また今回日本人発表者の中には14歳にしてRubyコミッタとなったsora_h さんも入っており、
英語で堂々と発表するのを間近でみてすごいなぁ思いました。

やはりこういった良いモノを見ると、とても刺激になりますね。



■Rubyists との交流
FamiConf

まず前日に、外国人Rubyist が日本人Rubyistとの交流会、FamiConf を企画してくれました。

Matz をはじめ、RubyコミッタのみなさまやRuby関連の書籍を執筆されている方など、かなり豪華な顔ぶれ。。
英語能力やRuby能力にかなりの引け目を感じつつも、非常に楽しく交流できました。

ちなみにこういった情報はRubyConf に参加する日本人Rubyist の間でTwitter, MLを使って適宜情報交換されており、現地での行動でも非常に助けられ、あらためてコミュニティのありがたさを感じました:)


また、カンファレンスではホテル内で食事が用意されており、ビュッフェ形式で好きな席に座って食べるため、コミュニケーションを取る機会にもなります。
中には日本語がわかる方も少しいらっしゃるので、まずはそういう方と仲良くなると、他の方にも繋がったりして輪を広げやすいですね。


カンファレンス中には、Tシャツがキッカケでコミュニケーションすることもありました。
(私はTokyoRubyKaigi のTシャツを着ていて、日本好きな人に声をかけられました。
特徴のあるTシャツを着ていくのもキッカケづくりのひとつとして有効みたいですね:)



■日本Ruby会議との簡単な比較
IMG_20110929_092717

まず日本Ruby会議 と比べると、チケットの値段が約5倍くらいになります。(日本Ruby会議 は一般6000円, RubyConf は350ドル.)
RubyConfでは食事を朝・昼とだしてくれるので、その関係かもしれません。


日本Ruby会議 ではよく見られるセッション以外の出し物(即席勉強会や、アンカンファレンス、折り紙教室など) は、会場には特にありませんでした。
その代わり、リクルーティング用のブース(というかテーブルがあって人がいてノベルティや募集要項を配っている) がちらほら。


懇親会は、日本Ruby会議 では実行委員主催のオフィシャルなもの(有料) がありますが、RubyConf では少し違っていて、カンファレンス後に毎晩、どこかの企業がスポンサーとなってパーティーが企画されていました。
こちらは参加費無料。

ちなみに日本Ruby会議2011でもHeroku 主催のパーティーが開かれていましたが、アメリカでは企業によるこういったパーティーが一般的なものなのかもしれません 。
確かに、企業からしたら欲しい人材をリクルーティングする絶好のチャンスなのかもしれません。
日本でももっとやったらいいのに、と思います。
# エンジニアからしたら、タダメシ・タダ酒の機会が増えます^_^v


クロージングは特になく、最後のセッションが終わるとあっさりと終了しました。
# もちろん、その後に企業主催のパーティーはありましたが。


全体としては、「ほどよく手を抜く」という部分を感じました。
大事なところは押さえて、その他の部分はまぁまぁいい具合にやる、と。
# クロージングなどはまさにそんないい例かと思います。

確かに全てにおいて何かを継続していくときには、「より良いものを」と思うがあまりハードルが高くなってしまいがちなので、持続可能な仕組みを作っていくうえでは大事な要素かもしれないな、と感じました。

よくよく考えてみると、日本Ruby会議でもスタッフ間では「自分たちも楽しめてこそのRuby会議なので、頑張りすぎず頑張りましょう:)」みたいな空気感があったので、こういった持続可能性に関する空気感みたいなものは共通なのかもしれません。



■まとめ
IMG_20110927_174755

強引にまとめると、セッションで見たような刺激的な人達・技術であったり、Rubyist コミュニティ の暖かさ、運営に見られる持続可能性などがうまいこと作用しあって、Ruby をこれまで成長させてきた環境ができあがっているのかなぁと。
そんなエコシステムっぽいものを、時には海外ならではの経験から、時には海外から日本を振り返ることで感じられるという、貴重な体験となりました。

長くなりましたが、おそらく私の拙い文章では伝わり切らない魅力がてんこ盛りなので、
みなさんも来年、もし機会があればぜひ参加してみてください:)

TokyoRubyistMeetup などの機会で、英語に慣れておけるとよいですね! (自戒の念も込めて。)

以上です。

英語困難者によるはじめての英語LightningTalks in RubyConf2011

@bash0C7です。ECナビ事業本部でエンジニアをしつつ、アジャイル戦略室という活動を行なっています。
今回の話は、アメリカのニューオリンズで行われたRubyConf2011でLTした経験についてです。
PA011287
PA011287 by sora_h, on Flickr(http://creativecommons.org/licenses/by/2.0/)
 

謝辞

このエントリーは、nari3の英会話困難者によるはじめての英語プレゼン に影響されました。ありがとうございました。

どこでどんなLTをしたか

VOYAGE GROUPでは海外の技術カンファレンスに社費で参加できる制度があります。今年わたしがその制度の対象者の一人に選出され、Rubyistなら「一生に一度以上は行くべき!」といわれているRubyConfに念願かなって参加しました。

そこで、ついカッとなって生まれて初めての英語ライトニングトークスをしました。
してきたのですが…

(続きを読む前にまず下記にあるビデオをご覧ください)
http://confreaks.net/videos/737-rubyconf2011-lightning-talk-let-s-go-to-shibuya-rubyist-lunch-at-tokyo-japan?player=html5

続きを読む

メタプログラミングRuby:文字列からのオブジェクト生成

こんにちは。ECナビでインフラエンジニアやってます岩本(@masaki925)です。

弊社では週に1度ランチタイムを利用して「メタプログラミングRuby読書会」というものを実施しています。

メタプログラミングRubyメタプログラミングRuby
著者:Paolo Perrotta
アスキー・メディアワークス(2010-08-28)
販売元:Amazon.co.jp
クチコミを見る


今回は、その中で上がった個人的に面白かった話題について簡単に紹介しようと思います。


・オブジェクト指向における多態性について


僕はRubyという言語に興味を持ってはいるのですが、正直「オブジェクト指向」というものがどういうものなのか明確に理解できていません。

そのことを告白すると、先輩エンジニアのみなさんがオブジェクト指向について説明してくれて、その中で「多態性(polymorphism)」というキーワードが上がりました。


そしてその多態性について先輩エンジニアの@unlearned さんが以下のような趣旨で、PHPのコードを書いて説明してくれました。
// 会員のグレードごとに異なるボーナスポイントの付与率を表示するコードの例
<?php
abstract Class Member {
function print_bonus() { print("your bonus is " . $this->bonus . "%.\n"); }
}

Class Gold extends Member { var $bonus = 15; }
Class Silver extends Member{ var $bonus = 10; }

// データベースからユーザのグレードを取得したつもり
//$grade = $db->get_grade(user_id);
$grade1 = "Gold";
$grade2 = "Silver";

// グレード(文字列) からオブジェクトを生成
$member1 = new $grade1;
$member2 = new $grade2;

// ボーナス付与率を表示
$member1->print_bonus(); // your bonus is 15%.
$member2->print_bonus(); // your bonus is 10%.
ということで、
多態性とは
 同じ動作を、違うオブジェクトがすることで、異なった振舞いをさせることができるようになる性質のこと
というように理解できました。
(多態性のメリットに関してはそこら中に情報があると思いますので今回は省きます。)


・文字列からのオブジェクト生成
@unlearned さんのおかげで僕の疑問は晴れたのですが、@unlearned さんは説明を終えただけでは満足せず、説明に用いた下記のようなクラスの生成の仕方はRubyではどのように実現するのか?という疑問を読書会メンバーに向けて投げかけました。
//generate Object by String in php
$obj = new "MyClass";

みんなすぐには回答に辿り着かず、ググったり手を動かしたりしてみて、どうやらObject.const_getを使うらしい。ということがわかりました。

でも読書会の時間内ではなぜそうなるのか?という回答を得ることができず、その場はそれで解散になりました。


・ActiveSupport における文字列からのオブジェクト生成

その後、@tadasy さんがRailsのActiveSupportについて調べてくれました。

ActiveSupportではconstantizeという名前でStringクラスを拡張していました。
"MyClass".constantize.new
実際にソースを見てみると、
StringクラスをInflectorというモジュールを利用して拡張していました。

※便宜上、実際のソースから少し書き換えています。

参考:/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/inflector.rb
//generate Object by String in php
module Inflector
    def constantize(class_name)
      Object.const_get(class_name)  # 注目!
    end
参考:/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/core_ext/string/inflections.rb
//generate Object by String in php
require 'active_support/inflector' unless defined?(ActiveSupport::Inflector)

module String
def constantize
Inflector.constantize(self)
end
受け取った文字列をObject.const_get に渡してクラスへの参照を取り出すことで、クラス.new を実現していました。


また、FAQにも同様の方法が紹介されていました。
6.15 クラス名からクラスを得ることはできますか - FAQ::クラス、モジュール - Rubyリファレンスマニュアル


上記の調査と、本の内容を照らし合わせると、見事に@unlearned さんの疑問を晴らすことができました!
※ページ番号は「メタプログラミングRuby」に関するものです。
  • クラス名はただの定数である。(p.49)
  • クラス名(定数) は、クラスへの参照を持つ。(p.53)
  • クラス.new メソッドを実行するには、クラスへの参照が必要。(p.53)
  • クラス名(文字列) からクラスへの参照を得るには、Object.const_get メソッドを用いる (ActiveSupport, FAQ)

#generate Object by String in ruby!!
obj = Object.const_get("MyClass").new


・メタプログラミングって楽しい!
今回の読書会では、ふとした疑問をきっかけに自分だけでは気が付かなかった点に気付くことができ、
本の内容、Rubyという言語についてより深く理解できました。

引き続きこういった読書会などの機会は積極的に利用し、
少しずつでもメタプログラミングの魔術を自分のものにして、「ビックリすること」ができるようになりたいです!


・宣伝
読書会の発起人である@bash0C7 さんを中心として、「東京Ruby会議05」の開催を予定しています。
tork05_logo
そちらでも、メタプログラミングをテーマとしたセッションを行う予定(あくまで予定ですが。。) ですので、ご興味ある方はぜひご参加ください。

よろしくお願いします:)
記事検索
QRコード
QRコード