CloudFormation用ツール Kumogata 0.1.0

CloudFormation用ツール Kumogata の 0.1.0をリリースしました。

https://github.com/winebarrel/kumogata

これは何?

CloudFormationのテンプレートを以下のようなRuby DSLで書いて、リソース群を作ったりできるツールです。

Resources do
  myEC2Instance do
    Type "AWS::EC2::Instance"
    Properties do
      ImageId "ami-XXXXXXXX"
      InstanceType "m1.large"
      KeyName "your_key_name"

      UserData (<<-EOS).undent.encode64
        #!/bin/bash
        yum install -y httpd
        service httpd start
      EOS
    end
  end
end

テンプレートはだいたいJSONそのままです。 UserData用の便利関数 _user_data() とかがビルトインで定義されてたりします。 0.1.9以降でなくなりました

使い方

以下のような感じでリソース群を作成します。

$ kumogata validate template.rb
$ kumogata create template.rb

明示的に名前を指定しない場合、スタックは削除されます。(リソース群は残ります)

スタックを削除したくない場合はスタック名を指定します。

$ kumogata create template.rb my_stack_name

はぁ?スタックを削除?

スタックでリソースのライフサイクルを管理すべきでないユースケースって結構多いと思うんですよね。 "DeletionPolicy" : "Retain"と指定すれば残るは残りますが、それはテンプレートに書くのは微妙な気が…

という設計方針から、明示的にスタック名を指定しなかった場合、すべてのリソースに"DeletionPolicy" : "Retain"が追加されて、リソースの作成完了後にスタックは削除されます。

JSONテンプレートの変換

手作業でJSONテンプレートをRubyにするのは辛いので、convertコマンドを用意しています。

kumogata convert https://s3.amazonaws.com/cloudformation-templates-us-east-1/Drupal_Single_Instance.template
# ローカルパスも可

ただ、いくつかメソッドにできないキーがあったりするので、特殊な変換ルールがあります

  • Data that cannot be converted will be converted to Array and Hash
  • :: is converted to __
    • Fn::GetAtt => Fn__GetAtt
  • _{ ... } is convered to Hash
    • SecurityGroups [_{Ref "WebServerSecurityGroup"}] => {"SecurityGroups": [{"Ref": "WebServerSecurityGroup"}]}
  • _user_data() creates Base64-encoded UserData
  • _path() creates Hash that has a key of path
    • _path("/etc/passwd-s3fs") { content "..." } => {"/etc/passwd-s3fs": {"content": "..."}}

デモ

なんでBitbucketじゃないの?

『寄らば大樹の陰』ということわざがありまして…

Please try it out!