faultline / faultline-php によるサーバ管理不要なエラートラッキングとその効果Kenʼichiro OyamaFusic Co.,Ltd.2017.6.101PHPカンファレンス福岡2017
View Slide
ターゲット2PHPカンファレンス福岡2017
Webアプリケーションの開発をしてデプロイをして運⽤をしている⽅3PHPカンファレンス福岡2017
Who4PHPカンファレンス福岡2017
k1LoW Kenʼichiro Oyama @k1LoW Fusic Co.,Ltd. エンジニア 基盤ユニット テックリード GitHub organizations fukuokarb / faultline / emacs-jp / etc. awspecというAWS⽤のテストツールを作っています https://github.com/k1LoW/awspec5PHPカンファレンス福岡2017
アプリケーションにおけるエラートラッキング6PHPカンファレンス福岡2017
エラー 運⽤上の想定内のエラー ログインエラー ⼊⼒エラー Exception 運⽤上の想定外のエラー <<こちら Error Exception7PHPカンファレンス福岡2017
つまり運⽤時に顕在化したバグ8PHPカンファレンス福岡2017
運⽤時のエラーの捕捉 例えば捕捉しない … ユーザやクライアントからの連絡ドリブン 「◯◯が動きません」 サーバ内のログで定期的に確認する app/tmp/logs / syslog / error_log アプリケーションでキャッチして通知する encount (CakePHP) / LERN (Laravel) エラートラッキングサービスで集約する Airbrake.io / Rollbar / Bugsnag9PHPカンファレンス福岡2017
エラーをアプリケーションから直接メールで受け取るツラみ 連続したエラーでメールボックスの容量を圧迫 運⽤時の⼤量アクセスで同じエラーが⼤量通知 会社のメールサーバを圧迫、そして受信ができなくなる 会社のメールサーバでエラー通知を受け取るの禁⽌ どのエラーに対応した/解決したのかがわからない メールみないそして迷惑メールへ...10PHPカンファレンス福岡2017
エラートラッキングサービス(SaaS) Airbrake.io / Rollbar / Bugsnag / etc... 同じエラーをまとめてくれる 通知先を設定できる 通知頻度も設定できる エラーの解決を管理できる 過去のエラー詳細を確認できる etc... 選択できるのならばすぐにでも選択すべき11PHPカンファレンス福岡2017
そう、選択できるのならば12PHPカンファレンス福岡2017
まだSaaSを選択できていない理由 費⽤対効果の課題 受託開発の特性上、年間に発⽣するプロジェクトが2桁以上(3桁) プロジェクト単位課⾦のサービスは選択しにくい(費⽤対効果を計測できていない) エラー数課⾦でも厳しい可能性がある データストア先の課題 エラー詳細の保存先として外部サービスを選択できない場合がある 会社全体での導⼊を考えた場合、できるだけ例外があるような状況にはしたくない13PHPカンファレンス福岡2017
とはいえ、エラーメール通知は破綻14PHPカンファレンス福岡2017
15PHPカンファレンス福岡2017
faultline Error tracking tool on AWS managed services. AWSのマネージドサービスのみで構築するオープンソースのエラートラッキングツール https://github.com/faultline コンセプト1. Simple deploy2. Manageless3. POST (errors) with config4. Between "Only mail notify" and "Error trackingservices"16PHPカンファレンス福岡2017
機能 プロジェクト単位でエラーを集約管理 エラーの時系列集計/グラフ(faultline-webui) エラーの詳細記録 エラーの通知(Slack, GitHub Issue) エラーの集約通知 “30イベント以上発⽣したら通知” / ”5回に1回通知”17PHPカンファレンス福岡2017
Fusicにおけるfaultlineの活⽤18PHPカンファレンス福岡2017
9 Projects3 Languages25.8k Errors916MB Raw logs19PHPカンファレンス福岡2017
20PHPカンファレンス福岡20176< Months
1 Down0 Recovery 21PHPカンファレンス福岡2017※DynamoDBのCapacityに引っかかった※もともと⾃分で復旧すべきサーバがない
AWSマネージドサービスのみで構築(マネージドサービス: AWSがサーバが管理)22PHPカンファレンス福岡2017
サーバレスアーキテクチャ?23PHPカンファレンス福岡2017
ManagelessOSSでありながらSaaSに近い感覚で運⽤できている(※注意: 決して運⽤ゼロにはなりませんよ!!)24PHPカンファレンス福岡2017
25PHPカンファレンス福岡2017AWSLambdaAmazonS3AmazonDynamoDBAWS KMSAmazon APIGatewayAWSCloudFormationIAMAWS mageged services used by
26PHPカンファレンス福岡2017AWSLambdaAmazonS3AmazonDynamoDBAWS KMSAmazon APIGatewayAWSCloudFormationIAM$0/month$0/month$0/month$0/month$0.5/month$0/month$1/monthAWS mageged services used by
費⽤⾯も解決27PHPカンファレンス福岡2017
インストール28PHPカンファレンス福岡2017
faultlineのインストール29PHPカンファレンス福岡2017 $ git clone https://github.com/faultline/faultline.git $ cd faultline/ $ npm install $ cp config.default.yml config.yml $ [Edit config.yml] $ AWS_PROFILE=XXXXXX npm run deployby
Simple deploy30PHPカンファレンス福岡2017
faultlineと連携するライブラリ faultline-php (PHP) encount-sender-faultline (CakePHP) faultline-ruby (Ruby) faultline-rack (Rack) faultline-js (JavaScript)31PHPカンファレンス福岡2017
faultline-php32PHPカンファレンス福岡2017
33PHPカンファレンス福岡2017faultline-php
faultlineを導⼊したことによる効果34PHPカンファレンス福岡2017
Slack35PHPカンファレンス福岡2017
GitHub Issue36PHPカンファレンス福岡2017
“$ is not defined”37PHPカンファレンス福岡2017
柔軟なエラー通知と詳細な確認を得た エラー捕捉と同時に(かつ頻度を決めて)Slack通知を受け取れるので素早い対応がしやすくなった ⾃動でGitHub IssueをOpenしたりReopenしたりすることでIssueを元にエラーの管理ができるようになった PHPだけでなくJavaScriptのエラーもカジュアルに捕捉できるようになったことで品質の向上をするきっかけを得た 同じエラーの時系列グラフや各詳細を確認することでエラーの原因にたどりつきやすくなった (faultline-webui)38PHPカンファレンス福岡2017
メール通知地獄からの脱却39PHPカンファレンス福岡2017
え、それ全部SaaSでできるよ40PHPカンファレンス福岡2017
あ、はい41PHPカンファレンス福岡2017
Between "Only mail notify" and "Error tracking services"メール通知 < faultline < SaaS42PHPカンファレンス福岡2017
何度も⾔うがSaaSは良い 零細OSSと、企業として⼒を⼊れているSaaSの間には超えられない壁 運⽤コストゼロなSaaSはいつまでも魅⼒ エンジニアの能⼒は別に使いたい faultlineは “SaaSに近い運⽤(運⽤コストを限りなくゼロ)” を⽬指す(同じ機能ではない faultlineで我慢できなくなったらおそらくそれがSaaSへの移⾏のタイミング43PHPカンファレンス福岡2017
POST (errors) with config44PHPカンファレンス福岡2017
POST with config エラー情報と共に設定情報もPOSTする どこに通知して欲しいか / どのように通知して欲しいか / etc... 設定情報をアプリケーション側に寄せることでfaultlineに保持する情報を少なくする 新規プロジェクトの開始時ですらfaultline側に何か設定する必要はない ➔管理者いらず45PHPカンファレンス福岡2017
46PHPカンファレンス福岡2017faultline-php
POST with configの気持ちで作った別のツール47PHPカンファレンス福岡2017
backslack Backlogの通知をSlackに通知するサーバレスアーキテクチャなツール https://github.com/k1LoW/backslack Backlogに設定するWebhook URLに全ての設定を込めるhttps://x0x1x2x3x.execute-api.ap-northeast-1.amazonaws.com/v0/hook?space=myspace&webhook_url=https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXX&channel=general BacklogとSlackを中継するだけ➔管理者いらず48PHPカンファレンス福岡2017
POST with configを貫く49PHPカンファレンス福岡2017
POST with configを実現するための暗号化 SlackのIncoming webhook URLやGitHubAPI Tokenなどの値もアプリケーション側に設置する必要がある サーバサイドではまだ問題は⼩さい 環境変数の利⽤など(DBの接続先と同様) クライアントサイド(JavaScript)でのfaultlineの利⽤ AWS KMSをfaultlineに組み込むことで設定情報を暗号化 暗号鍵管理もAWSマネージド50PHPカンファレンス福岡2017AWS KMS
POST with config= faultline側で保持する情報を限りなく少なくシンプルに51PHPカンファレンス福岡2017
faultlineのアーキテクチャ52PHPカンファレンス福岡2017
Only3 storage53PHPカンファレンス福岡2017
サーバレスアーキテクチャはGlue(糊)やHub(橋渡し)を意識して設計すると幸せになれる54PHPカンファレンス福岡2017
まとめ エラーは捕捉したい しかし、アプリケーションからのエラーをアプリケーションからのメールで受け取ると破綻する より良い品質向上のためにエラートラッキングサービスやツールを検討したほうがいい そのエントリーモデルとしてfaultlineはオススメ Fusicでは実際にプロダクション環境で活⽤して良い効果を得られた POST with configでシンプルな設計に55PHPカンファレンス福岡2017
最後に、ある有名な⽅の⾔葉を引⽤したある有名な⽅のスライドを紹介56PHPカンファレンス福岡2017
57PHPカンファレンス福岡2017URL: https://speakerdeck.com/twada/testable-lambda-working-effectively-with-legacy-lambda
Thank you! Fusicはテクノロジーが 好きなエンジニアを募集しています https://fusic.github.ioPHPカンファレンス福岡2017 58
PHPカンファレンス福岡2017 59