20140930 anything as_code
DESCRIPTION
20140930 anything as_codeTRANSCRIPT
![Page 1: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/1.jpg)
Anything(as(CodeGenki&Sugawara
![Page 2: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/2.jpg)
お前誰よ• 弊社でインフラまわりやってます
• twi%er:)@sgwr_dts
• github/bitbicket:)winebarrel
![Page 3: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/3.jpg)
アジェンダ• Roadworkerの話
• Ridgepoleの話
• Anything3as3Codeの話
![Page 4: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/4.jpg)
Roadworkerの話
![Page 5: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/5.jpg)
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
![Page 6: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/6.jpg)
Demo
![Page 7: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/7.jpg)
ワークフロー
![Page 8: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/8.jpg)
DSLを修正
![Page 9: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/9.jpg)
プルリク・レビュー
![Page 10: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/10.jpg)
マージ・適用
![Page 11: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/11.jpg)
Roadworker以前• ときは2013年
• R53(Foxというツールを使っていました
• github.com/cookpad/r53;fox
![Page 12: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/12.jpg)
以前のワークフロー1. DNSの更新を宣言
2. R53*FoxでRoute53を変更
3. JSONにエクスポートしてgitで保存
![Page 13: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/13.jpg)
問題点• 事前確認できない
• エクスポートを忘れると変更履歴が残らない
• 元の状態を復元しにくい(できなくはない)
![Page 14: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/14.jpg)
オペミス発生• MXを消してメールが届かない
• 誰がいつ更新したのかよく分からない…
![Page 15: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/15.jpg)
一方その頃…
• puppetlabsのリポジトリをあさっていました
• puppetlabs/puppetlabs+dns
![Page 16: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/16.jpg)
Puppet的に管理するのもありかな?
![Page 17: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/17.jpg)
Puppet/Chef?
• Chefもありました
• github.com/hw1cookbooks/route53
• どっちも文法が気に入らない
• じゃあ作るか→できた
![Page 18: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/18.jpg)
![Page 19: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/19.jpg)
知見• 設定ファイル化するとGitで管理できる
• GitHubのワークフローに乗せられる
• 管理が楽になる
![Page 20: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/20.jpg)
いろいろ作った
![Page 21: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/21.jpg)
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
![Page 22: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/22.jpg)
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
![Page 23: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/23.jpg)
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
![Page 24: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/24.jpg)
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
![Page 25: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/25.jpg)
バカの一つ覚えなんですがCode化しておくといろいろ捗るので…
![Page 26: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/26.jpg)
Ridgepoleの話
![Page 27: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/27.jpg)
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
![Page 28: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/28.jpg)
Demo
![Page 29: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/29.jpg)
作成の経緯• 別プロジェクトで死んでいた
• GW最終日「会社行きたくないでござる」
• 現実を忘れるためにコーディング
• できた
![Page 30: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/30.jpg)
Rails&DSL• SQL::Translator→Perlメンテできない
• SQLのパース→絶対メンテできない
• RailsのDSLならよいかな…
![Page 31: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/31.jpg)
DBまわりのワークフロー
![Page 32: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/32.jpg)
開発環境のデータをできるだけ本番に近づけるtechlife.cookpad.com/entry/2014/10/03/110806
![Page 33: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/33.jpg)
歴代のスキーマ管理ツール
![Page 34: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/34.jpg)
一代目• Google'Spreadseat
• DDL・記入者・実施日
• DDLを記入して実行以来
• 「クエリを実行してください」「完了しました」
![Page 35: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/35.jpg)
二代目• Webツール
• 基本はスプレッドシートと同じ
• DDL・作成者をポスト
• ボタンを押すとステージングに反映
• 本番への適用はインフラ作業
• AWS移行のどさくさで消滅
![Page 36: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/36.jpg)
三代目• GitHub(Enterprise
• mysqldump+Rakeタスク
• ステージング環境からスキーマをエクスポート
• テーブル定義の差分+ALTER文のDDLをプルリク
• レビュー
• マージ後、RakeタスクでDDLを適用
![Page 37: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/37.jpg)
三代目以前• 主要DBのテーブルが増え続けていた
• いらないテーブルも多かった
• スキーマの情報は$show create table
• ステージングと本番には乖離があった
![Page 38: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/38.jpg)
三代目以後• (一応)GitHubのワークフローには乗せられた
• DDLは手書き…
• DDLのテストが微妙
• メタ情報を書きにくい
• 本番とステージングで別ファイル定義
![Page 39: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/39.jpg)
なんかやだ
![Page 40: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/40.jpg)
Ridgepoleの導入• できたので導入したかった"(現実逃避)
• Rails"DSLに置き換えただけだとメリットが少ない
• 「DDLのCIやるか」
![Page 41: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/41.jpg)
DDL#CI
![Page 42: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/42.jpg)
知見• スキーマ定義もGitで管理すると楽
• DDLのCI便利
• CloudForma1onはCIに使える
![Page 43: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/43.jpg)
Anything(as(Codeの話
![Page 44: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/44.jpg)
DSL管理のアイデア• Puppet・Chefのパクリ
• Puppet+GitHubによるインフラ管理がすごくよかった
• なんでもGitHubで管理しよう
![Page 45: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/45.jpg)
仕組み1. APIで現在の状態を取得→Hashにする
2. DSLの定義をパース→Hashにする
3. Hash化された定義を比較
4.差分をAPIで実行(dry4runの場合はログ出力)
![Page 46: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/46.jpg)
技術的にたいしたことはやってませんしかし…
![Page 47: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/47.jpg)
応用範囲が広い• AWS全般
• LDAP等アカウント管理
• インフラ定義
• サービス定義
• ほにゃらら定義…
![Page 48: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/48.jpg)
なにがなんでも!as!Code?
技術的な学びはすくないしかし、何でもコード化したくなる
モチベーションは「無駄をなくしたい」「労力!>!/dev/nul」の撲滅
![Page 49: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/49.jpg)
Nothing(as(Code• 開発者「DNS変更してください」
• インフラ「わかりました」
• 開発者「ポート空けてください」
• インフラ「分かりました」
• 開発者「スキーマ変更してください」
• インフラ「(ry」
![Page 50: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/50.jpg)
問題点• 権限を適切に分離できない
• 全員に強力な権限を与えるのも問題
• 開発者:#めんどくさい
• インフラ:#人間バッチ化・無駄なスリル
![Page 51: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/51.jpg)
Code化+GitHub
• プルリクで手軽・明確に変更を依頼できる
• 明確な変更を適切にレビューできる
• 自動化により本番適用時の心労が減る
_人人人人人人人_> 突然の幸せ <‾Y^Y^Y^Y^Y^Y‾
![Page 52: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/52.jpg)
まとめ• 便利ツール作ったのでどうぞご利用ください
• DSL管理ツール作るのは簡単です
• Anything,as,Codeで幸せになりましょう
![Page 53: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/53.jpg)
ところでZabbixのDSL管理ツールだれかつくりませんか(泣
![Page 54: 20140930 anything as_code](https://reader033.vdocuments.net/reader033/viewer/2022051609/547e89245806b5ea5e8b46e0/html5/thumbnails/54.jpg)
ご静聴ありがとうございました