54
Anything as Code Genki Sugawara

20140930 anything as_code

Embed Size (px)

DESCRIPTION

20140930 anything as_code

Citation preview

Page 1: 20140930 anything as_code

Anything(as(CodeGenki&Sugawara

Page 2: 20140930 anything as_code

お前誰よ• 弊社でインフラまわりやってます

• twi%er:)@sgwr_dts

• github/bitbicket:)winebarrel

Page 3: 20140930 anything as_code

アジェンダ• Roadworkerの話

• Ridgepoleの話

• Anything3as3Codeの話

Page 4: 20140930 anything as_code

Roadworkerの話

Page 5: 20140930 anything as_code

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

Demo

Page 7: 20140930 anything as_code

ワークフロー

Page 8: 20140930 anything as_code

DSLを修正

Page 9: 20140930 anything as_code

プルリク・レビュー

Page 10: 20140930 anything as_code

マージ・適用

Page 11: 20140930 anything as_code

Roadworker以前• ときは2013年

• R53(Foxというツールを使っていました

• github.com/cookpad/r53;fox

Page 12: 20140930 anything as_code

以前のワークフロー1. DNSの更新を宣言

2. R53*FoxでRoute53を変更

3. JSONにエクスポートしてgitで保存

Page 13: 20140930 anything as_code

問題点• 事前確認できない

• エクスポートを忘れると変更履歴が残らない

• 元の状態を復元しにくい(できなくはない)

Page 14: 20140930 anything as_code

オペミス発生• MXを消してメールが届かない

• 誰がいつ更新したのかよく分からない…

Page 15: 20140930 anything as_code

一方その頃…

• puppetlabsのリポジトリをあさっていました

• puppetlabs/puppetlabs+dns

Page 16: 20140930 anything as_code

Puppet的に管理するのもありかな?

Page 17: 20140930 anything as_code

Puppet/Chef?

• Chefもありました

• github.com/hw1cookbooks/route53

• どっちも文法が気に入らない

• じゃあ作るか→できた

Page 18: 20140930 anything as_code
Page 19: 20140930 anything as_code

知見• 設定ファイル化するとGitで管理できる

• GitHubのワークフローに乗せられる

• 管理が楽になる

Page 20: 20140930 anything as_code

いろいろ作った

Page 21: 20140930 anything as_code

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

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

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

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

バカの一つ覚えなんですがCode化しておくといろいろ捗るので…

Page 26: 20140930 anything as_code

Ridgepoleの話

Page 27: 20140930 anything as_code

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

Demo

Page 29: 20140930 anything as_code

作成の経緯• 別プロジェクトで死んでいた

• GW最終日「会社行きたくないでござる」

• 現実を忘れるためにコーディング

• できた

Page 30: 20140930 anything as_code

Rails&DSL• SQL::Translator→Perlメンテできない

• SQLのパース→絶対メンテできない

• RailsのDSLならよいかな…

Page 31: 20140930 anything as_code

DBまわりのワークフロー

Page 32: 20140930 anything as_code

開発環境のデータをできるだけ本番に近づけるtechlife.cookpad.com/entry/2014/10/03/110806

Page 33: 20140930 anything as_code

歴代のスキーマ管理ツール

Page 34: 20140930 anything as_code

一代目• Google'Spreadseat

• DDL・記入者・実施日

• DDLを記入して実行以来

• 「クエリを実行してください」「完了しました」

Page 35: 20140930 anything as_code

二代目• Webツール

• 基本はスプレッドシートと同じ

• DDL・作成者をポスト

• ボタンを押すとステージングに反映

• 本番への適用はインフラ作業

• AWS移行のどさくさで消滅

Page 36: 20140930 anything as_code

三代目• GitHub(Enterprise

• mysqldump+Rakeタスク

• ステージング環境からスキーマをエクスポート

• テーブル定義の差分+ALTER文のDDLをプルリク

• レビュー

• マージ後、RakeタスクでDDLを適用

Page 37: 20140930 anything as_code

三代目以前• 主要DBのテーブルが増え続けていた

• いらないテーブルも多かった

• スキーマの情報は$show create table

• ステージングと本番には乖離があった

Page 38: 20140930 anything as_code

三代目以後• (一応)GitHubのワークフローには乗せられた

• DDLは手書き…

• DDLのテストが微妙

• メタ情報を書きにくい

• 本番とステージングで別ファイル定義

Page 39: 20140930 anything as_code

なんかやだ

Page 40: 20140930 anything as_code

Ridgepoleの導入• できたので導入したかった"(現実逃避)

• Rails"DSLに置き換えただけだとメリットが少ない

• 「DDLのCIやるか」

Page 41: 20140930 anything as_code

DDL#CI

Page 42: 20140930 anything as_code

知見• スキーマ定義もGitで管理すると楽

• DDLのCI便利

• CloudForma1onはCIに使える

Page 43: 20140930 anything as_code

Anything(as(Codeの話

Page 44: 20140930 anything as_code

DSL管理のアイデア• Puppet・Chefのパクリ

• Puppet+GitHubによるインフラ管理がすごくよかった

• なんでもGitHubで管理しよう

Page 45: 20140930 anything as_code

仕組み1. APIで現在の状態を取得→Hashにする

2. DSLの定義をパース→Hashにする

3. Hash化された定義を比較

4.差分をAPIで実行(dry4runの場合はログ出力)

Page 46: 20140930 anything as_code

技術的にたいしたことはやってませんしかし…

Page 47: 20140930 anything as_code

応用範囲が広い• AWS全般

• LDAP等アカウント管理

• インフラ定義

• サービス定義

• ほにゃらら定義…

Page 48: 20140930 anything as_code

なにがなんでも!as!Code?

技術的な学びはすくないしかし、何でもコード化したくなる

モチベーションは「無駄をなくしたい」「労力!>!/dev/nul」の撲滅

Page 49: 20140930 anything as_code

Nothing(as(Code• 開発者「DNS変更してください」

• インフラ「わかりました」

• 開発者「ポート空けてください」

• インフラ「分かりました」

• 開発者「スキーマ変更してください」

• インフラ「(ry」

Page 50: 20140930 anything as_code

問題点• 権限を適切に分離できない

• 全員に強力な権限を与えるのも問題

• 開発者:#めんどくさい

• インフラ:#人間バッチ化・無駄なスリル

Page 51: 20140930 anything as_code

Code化+GitHub

• プルリクで手軽・明確に変更を依頼できる

• 明確な変更を適切にレビューできる

• 自動化により本番適用時の心労が減る

_人人人人人人人_> 突然の幸せ <‾Y^Y^Y^Y^Y^Y‾

Page 52: 20140930 anything as_code

まとめ• 便利ツール作ったのでどうぞご利用ください

• DSL管理ツール作るのは簡単です

• Anything,as,Codeで幸せになりましょう

Page 53: 20140930 anything as_code

ところでZabbixのDSL管理ツールだれかつくりませんか(泣

Page 54: 20140930 anything as_code

ご静聴ありがとうございました