Anything(as(Code 
Genki&Sugawara
お前誰よ 
• 弊社でインフラまわりやってます 
• twi%er:)@sgwr_dts 
• github/bitbicket:)winebarrel
アジェンダ 
• Roadworkerの話 
• Ridgepoleの話 
• Anything3as3Codeの話
Roadworkerの話
Roadworker 
• github.com/winebarrel/roadworker 
• Route53の管理ツール 
• DSLでRoute53を定義する 
• 冪等性を保証 
hosted_zone "winebarrel.jp." do 
rrset "winebarrel.jp.", "A" do 
ttl 300 
resource_records( 
"127.0.0.1", 
"127.0.0.2" 
) 
end
Demo
ワークフロー
DSLを修正
プルリク・レビュー
マージ・適用
Roadworker以前 
• ときは2013年 
• R53(Foxというツールを使っていました 
• github.com/cookpad/r53;fox
以前のワークフロー 
1. DNSの更新を宣言 
2. R53*FoxでRoute53を変更 
3. JSONにエクスポートしてgitで保存
問題点 
• 事前確認できない 
• エクスポートを忘れると変更履歴が残らない 
• 元の状態を復元しにくい(できなくはない)
オペミス発生 
• MXを消してメールが届かない 
• 誰がいつ更新したのかよく分からない…
一方その頃… 
• puppetlabsのリポジトリをあさってい 
ました 
• puppetlabs/puppetlabs+dns
Puppet的に管理するのも 
ありかな?
Puppet/Chef? 
• Chefもありました 
• github.com/hw1cookbooks/route53 
• どっちも文法が気に入らない 
• じゃあ作るか→できた
知見 
• 設定ファイル化するとGitで管理できる 
• GitHubのワークフローに乗せられる 
• 管理が楽になる
いろいろ作った
Piculet 
• github.com/winebarrel/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
Kelbim 
• github.com/winebarrel/kelbim 
• ELBの管理ツール 
ec2 "vpc-XXXXXXXXX" do 
load_balancer "my-load-balancer", :internal => true do 
instances( 
"nyar", 
"yog" 
) 
listeners do 
listener [:tcp, 80] => [:tcp, 80] 
listener [:https, 443] => [:http, 80] do
Radiosonde 
• github.com/winebarrel/radiosonde 
• CloudWatch7Alarmの管理ツール 
alarm "alarm1" do 
namespace "AWS/EC2" 
metric_name "CPUUtilization" 
dimensions "InstanceId"=>"i-XXXXXXXX" 
period 300 
statistic :average 
threshold ">=", 50.0 
evaluation_periods 1 
actions_enabled true
Meteorlog 
• github.com/winebarrel/meteorlog 
• CloudWatch6Logsの管理ツール 
log_group "/var/log/messages" do 
log_stream "my-stream" 
metric_filter "MyAppAccessCount" do 
metric :name=>"EventCount", 
:namespace=>"YourNamespace", :value=>"1" 
end 
metric_filter "MyAppAccessCount2" do
バカの一つ覚えなんですが 
Code化しておくと 
いろいろ捗るので…
Ridgepoleの話
Ridgepole 
• github.com/winebarrel/ridgepole 
• DBスキーマの管理ツール 
• Rails9DSLでスキーマを定義する 
• 冪等性を保証 
• dry9runできる 
• 弊社ブログでバズった 
create_table "articles", force: true do |t| 
t.string "title" 
t.text "text" 
t.datetime "created_at" 
t.datetime "updated_at" 
end
Demo
作成の経緯 
• 別プロジェクトで死んでいた 
• GW最終日「会社行きたくないでござる」 
• 現実を忘れるためにコーディング 
• できた
Rails&DSL 
• SQL::Translator→Perlメンテできない 
• SQLのパース→絶対メンテできない 
• RailsのDSLならよいかな…
DBまわりのワークフロー
開発環境のデータをできるだけ本番に近づける 
techlife.cookpad.com/entry/2014/10/03/110806
歴代のスキーマ管理ツール
一代目 
• Google'Spreadseat 
• DDL・記入者・実施日 
• DDLを記入して実行以来 
• 「クエリを実行してください」「完了 
しました」
二代目 
• Webツール 
• 基本はスプレッドシートと同じ 
• DDL・作成者をポスト 
• ボタンを押すとステージングに反映 
• 本番への適用はインフラ作業 
• AWS移行のどさくさで消滅
三代目 
• GitHub(Enterprise 
• mysqldump+Rakeタスク 
• ステージング環境からスキーマをエク 
スポート 
• テーブル定義の差分+ALTER文のDDLを 
プルリク 
• レビュー 
• マージ後、RakeタスクでDDLを適用
三代目以前 
• 主要DBのテーブルが増え続けていた 
• いらないテーブルも多かった 
• スキーマの情報は$show create table 
• ステージングと本番には乖離があった
三代目以後 
• (一応)GitHubのワークフローには乗せられた 
• DDLは手書き… 
• DDLのテストが微妙 
• メタ情報を書きにくい 
• 本番とステージングで別ファイル定義
なんかやだ
Ridgepoleの導入 
• できたので導入したかった"(現実逃避) 
• Rails"DSLに置き換えただけだとメリットが少ない 
• 「DDLのCIやるか」
DDL#CI
知見 
• スキーマ定義もGitで管理すると楽 
• DDLのCI便利 
• CloudForma1onはCIに使える
Anything(as(Codeの話
DSL管理のアイデア 
• Puppet・Chefのパクリ 
• Puppet+GitHubによるインフラ管理がすごくよかった 
• なんでもGitHubで管理しよう
仕組み 
1. APIで現在の状態を取得→Hashにする 
2. DSLの定義をパース→Hashにする 
3. Hash化された定義を比較 
4. 差分をAPIで実行(dry4runの場合はログ出力)
技術的にたいしたことは 
やってません 
しかし…
応用範囲が広い 
• AWS全般 
• LDAP等アカウント管理 
• インフラ定義 
• サービス定義 
• ほにゃらら定義…
なにがなんでも!as!Code? 
技術的な学びはすくない 
しかし、何でもコード化したくなる 
モチベーションは 
「無駄をなくしたい」 
「労力!>!/dev/nul」の撲滅
Nothing(as(Code 
• 開発者「DNS変更してください」 
• インフラ「わかりました」 
• 開発者「ポート空けてください」 
• インフラ「分かりました」 
• 開発者「スキーマ変更してください」 
• インフラ「(ry」
問題点 
• 権限を適切に分離できない 
• 全員に強力な権限を与えるのも問題 
• 開発者:#めんどくさい 
• インフラ:#人間バッチ化・無駄なスリル
Code化+GitHub 
• プルリクで手軽・明確に変更を依頼できる 
• 明確な変更を適切にレビューできる 
• 自動化により本番適用時の心労が減る 
_人人人人人人人_ 
> 突然の幸せ < 
‾Y^Y^Y^Y^Y^Y‾
まとめ 
• 便利ツール作ったのでどうぞご利用ください 
• DSL管理ツール作るのは簡単です 
• Anything,as,Codeで幸せになりましょう
ところでZabbixの 
DSL管理ツール 
だれかつくりませんか(泣
ご静聴ありがとうございました

20140930 anything as_code