ChatWork Advent Calendar Day7

こんにちは!こんばんは!サーバーエンジニアの藤原です。 ChatWork Advent Calendar2014の7日目を担当します。

AWS最大のイベントAWS re:Inventをご存知でしょうか?毎年ラスベガスで開催されており、今年も11/11~14にかけて行われました。ありがたいことに、私は初回から3回連続で参加しています。そして、弊社クラウドチームから、今年は計5名!参加しました

その後、シリコンバレーにもう1週間滞在し、計2週間の長期出張になりました

re:InventではKeynoteをはじめ、様々なセッションが同時並行で行われるのですが、昨年・今年と行われている、ちょっと変わったイベントがあります。そう、GameDayです

GameDayとは?

2012年米国大統領選挙にてオバマ大統領陣営で行われたキャンペーン『Obama For America』が発祥のイベントになります。ある一日、チームが敵味方に分かれ、一方は知恵を絞ってシステムを破壊し、もう一方は全力でそれを修復するというものです。日本でも2014年3月に行われました。クラスメソッドさんの記事が詳しいですね!

実際の模様はJAWS-UG大阪 Special 「re:Invent 2014報告会」にて、先日発表してきましたので、こちらをご確認ください。

GameDayの結果

8時間に及ぶ長時間のイベントに、弊社クラウドチーム5名も時差ボケと闘いながら参戦しました。しかし、世界のレベルは高く、満足した結果を得ることはできませんでした

私達は構築ドキュメントの通り、ManagementConsoleのウイザードを利用してVPCネットワークを構築したのですが、VPCの設定を複雑に破壊されてしまい、時間内に素早く復旧できない状態でした。

CloudFormationテンプレート

素早く復旧出来た上位チームは、皆さんCloudFormationテンプレートを利用して構築を行っていました。

CloudFormationは、JSONで記載されたテキストファイルから、AWSの各サービスを自動構築する仕組みです。この仕組みを使うことで、設定を複雑に破壊されても、JSONから再構築することによって、数分で元の状態に復旧できます。

私達もCloudFormerを利用して、JSONの抽出を試みたのですが、CloudFormerのJSONはIDなどの値が固定値として埋め込まれており、そのままでは再利用できません

パラメータ化することで、再利用可能になるのですが、JSONを直接編集するのは難易度が高いです。

上位チームは、CloudFormerも支援ツールもなしで、JSONを直接テキストエディタで記述するツワモノが複数いたそうで、職人技が支える世界のようです

troposphereを利用したJSONの生成

参加チームの中に、troposphereを利用したチームがいました。

このツールは、PythonコードからCloudFormationのJSONテンプレートを生成することができます。同様のものにRubyコードから生成するkumogataがありますね!

troposphereは、後述するCloudFormerとの連携も行うことができ、便利に使えそうです

JSONとtroposphereのPythonコードの違い

百聞は一見にしかず!こちらを御覧ください。 こちらはVPCのPrivateSubnetとPublicSubnet間を接続するNATインスタンスの定義になります。

JSON

Pythonコード

お分かりいただけましたでしょうか?JSONを直接記載するのはかなり厳しいと感じていただけたかと思います。とくにカッコが。。

対して、Pythonコードは非常に簡潔ですね!

実際にtroposphereを使ってみてどうだったか?

記述が簡素になることもそうなのですが、Pythonコード実行時にフォーマット上記載できないものは、JSON変換エラーを返してくれます。 わざわさstackを作成した後、エラーログを確認してやり直さなくて良いので、高速に開発できそうですね!

AWS::EC2::Routeオブジェクトに設定できないTagプロパティを記述した時のエラー

強力コマンド cf2py

なんと!JSONからPythonコードに変換するコマンド cf2py があります

少し試したところ、記載内容によっては変換エラーが発生することもありますが、CloudFormerと組み合わせることによって、下記のフローが実現できそうです!

  1. ManagementConsoleで生成済みの構成をCloudFormerでJSON変換
  2. cf2py でJSONをPythonコードに変換
  3. Pythonコードを編集して、固定値をパラメータ化

さいごに

troposphereはいかがだったでしょうか?いままで使いにくいと思っていたCloudFormationを活用できそうで、いろいろ夢が広がりますね

検証にあたって、GameDayで悔しい思いをした「VPC with Public and Private Subnets」をtroposphere化したものを個人リポジトリに保存しています。より詳しくはこちらをご確認ください。

最後までご覧いただき、ありがとうございました