Piculet/Kelbimというツールを作りました

Piculet
https://bitbucket.org/winebarrel/piculet

Kelbim
https://bitbucket.org/winebarrel/kelbim


以前作成したRoadworkerと同様に、AWSの設定をRubyのDSLで管理します。Piculetはセキュリティグループを、KelbimはELBを対象としています。
Piculetのほうはクラスメソッドさんのブログで紹介していただきました。ありがたいことです。

使い方とか

ホームページを読めばだいたい察しはつくかと思います。既存の設定をRuby DSLにエクスポートして、DSLを編集して、AWSに適用して…という感じで運用します。
所謂、冪等性を確保しているので何回実行してもRuby DSLの記述通りにAWSが設定されます(DSLと設定が同じなら何もしません)
ついでに、dry runとか(Kelbimの方は)RSpecでのテストとかできます。


DSLは以下のような感じです。

Piculet
ec2 "vpc-XXXXXXXX" do
  security_group "default" do
    description "default VPC security group"

    ingress do
      permission :tcp, 22..22 do
        ip_ranges(
          "0.0.0.0/0",
        )
      end
      permission :any do
        groups(
          "any_other_group",
          "default"
        )
      end
    end

    egress do
      permission :any do
        ip_ranges(
          "0.0.0.0/0"
        )
      end
    end
  end
end
Kelbim
ec2 "vpc-XXXXXXXXX" do
  load_balancer "my-elb" do
    spec do
      url = URI.parse('http://www.example.com/')
      res = Net::HTTP.start(url.host, url.port) {|http| http.get(url.path) }
      expect(res).to be_a(Net::HTTPOK)
    end

    instances(
      "hastur",
      "cthulhu",
      "nyar",
    )

    listeners do
      listener [:http, 80] => [:http, 80] do
        app_cookie_stickiness "CookieName"=>"20"
      end
...

生い立ちとか

もともと別件でPuppetのリポジトリを調べてたらpuppetlabs-dnsを見つけて「Puppet的に管理するのもありかー」*1と思って、でもシンタックスが気に入らなかったので夏頃からちまちま作り始めて、そうしてRoadworkerできたら他のもおんなじように管理すると便利そうだからと作り始めて…という感じです。
あとはIAMも同様に管理すると便利そうですね。誰か作ってください。

それCloudFormationで

CloudFormationはライフサイクルがおおむねテンプレートと一緒になってしまうのがにんともかんとも。そもそも某社ではCloudFormationを使ってないので。あとJSONがいまいちというのもありますね。無理矢理な関数とか。JavaScriptで記述できるようにすればいいのに。
既存の設定をエクスポートできて途中から設定を適用できてdry runがあってプログラマブルに設定を記述できていたら使っていたかもしれないです。

いろいろ

  • 「do〜end」をブレースで出力したらさらに設定ファイルっぽくなりますね。なんとなくRuby界隈のDSLでは「do〜end」が主流な気がしたのでそれに従いました。エクスポート時のオプションで切り替えられたりするといいんですかね
  • RSpecは案外組み込みやすかったです。RoadworkerはRSpecもどきなので、そのうちRSpec組み込みにしたいです
  • ELBのポリシーまわりのAPI・データ構造は後付け感がありますね。Ruby SDKAPIもだいぶ苦労しているような気がします
  • ELBのschemeはinternalとInternet-facing以外もサポートするようになるんですかね
  • セキュリティグループはAPIだけみると他のユーザからのアクセスを制御できるような感じなんですが(ユーザIDとか)、現状はできないようです
  • DescribeLoadBalancerPoliciesでまとめてポリシーを取得できないの辛いです
  • drone.io、便利ですね。bitbucketユーザは何かと肩身が狭い世の中なのでありがたいことです

その他

次はCloudFormationのラッパーを書こうかと思ってます。Vagrantの複数台管理がめんどくさそうなので。*2。主に個人用途
だれかIAM管理ツールを作ってください。

*1:Chefにも同様のがありますね https://github.com/hw-cookbooks/route53

*2:めんどくさくなかったらごめんなさい