Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
新卒2ヶ月目で起こしたインシデントの話
Search
Toranosuke Ujike
December 07, 2023
Programming
1.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
新卒2ヶ月目で起こしたインシデントの話
人生初の登壇!
2023年ヒヤリハット大反省会@新宿 で発表した
Toranosuke Ujike
December 07, 2023
More Decks by Toranosuke Ujike
See All by Toranosuke Ujike
Apollo Sandbox における 認証トークンの自動適用
torabit
0
230
Other Decks in Programming
See All in Programming
自作OSでスライド発表する
uyuki234
1
3.8k
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
8
4.1k
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
850
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
1
130
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
170
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.2k
Claude Team Plan導入・ガイド
tk3fftk
0
190
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
160
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
140
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
170
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
130
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
140
Featured
See All Featured
Building an army of robots
kneath
306
46k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
200
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
450
Building the Perfect Custom Keyboard
takai
2
810
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
970
What's in a price? How to price your products and services
michaelherold
247
13k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
220
RailsConf 2023
tenderlove
30
1.5k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
The browser strikes back
jonoalderson
0
1.4k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
Transcript
© 2023 Wantedly, Inc. 新卒2ヶ月目で起こした インシデントの話 2023年ヒヤリハット大反省会 @新宿 Toranosuke Ujike
/ @tora_tora_bit
自己紹介 氏家 虎之介 (Ujike Toranosuke) フロントエンドエンジニアとして、 Wantedly Visitを主にUI 面から改善することで、ユーザー、企業への提供価値を向 上させている。
© 2023 Wantedly, Inc. 所属: Wantedly, inc. X: @tora_tora_bit ある特定の技術領域に縛られないことをモットーに、 現在は優秀な同期と共にバックエンドについて学習中。
インシデントの内容 メッセージ機能を修正する施策を担当 © 2023 Wantedly, Inc.
やばい Wantedlyのメッセージ送信機能を壊した © 2023 Wantedly, Inc.
ステージング環境での検証や テストを書いて確認したのになぜ © 2023 Wantedly, Inc.
根本原因 RubyのHashから値を取得する際の Key指定を間違えていた © 2023 Wantedly, Inc.
Ruby Rubyには文字列とシンボルの 2つの異なるデータ型がある © 2023 Wantedly, Inc.
シンボルを使ったHash © 2023 Wantedly, Inc. user = { name: "Tora",
age: 26, city: "Kyoto" } result = user["name"] result.inspect # nil ruby 文字列で指定した場合 キーとして使われているのはシンボル 文字列で "name" を指定しても 対応するキーが存在しないため nil が返される
正しくはこう © 2023 Wantedly, Inc. user = { name: "Tora",
age: 26, city: "Kyoto" } result = user[:name] result.inspect # "Tora" ruby シンボルで指定した場合 要素へのアクセスにはHashのキーとして 使用されているデータ型を正確に指定する必要がある
実際に何が起こっていたのか © 2023 Wantedly, Inc. user = UserHashService.compose!( # hashを作成
name: name, age: age, city: city, ) # user hashのkeyはシンボルで宣言されているため文字列で指 定できない name = user["name"] age = user["age"] city = user["city"] let(:user) { # モックデータ { "name" => "Tora", "age" => 26, "city" => "Kyoto", } } … allow(UserHashService).to receive(:compose!).and_return(user) … it "user test" do name = { user["name"] } expect(name).to eq("Tora") # モックデータのキーとして扱われているのは文字列なのでテストが通る end 例) user_message_service.rb 例) user_message_service_spec.rb
根本原因 都合の良いモックデータを与えてしまっていた © 2023 Wantedly, Inc.
マージまでの流れ 1. PRを作成 2. ステージング環境で検証 3. 問題ないことを確認してレビュー依頼 4. レビューを受けて修正 5.
テストが通ることを確認 6. PRのレビューを再依頼 7. Approveをもらう 8. マニュアルテストをせずに翌日にマージ インシデント発生 © 2023 Wantedly, Inc.
レビューを貰ったあとに ステージング環境で検証を行っていない © 2023 Wantedly, Inc.
PRマージ後 1. インシデント発生 ◦ Honeybadgerがエラーを拾ってSlackで通知 2. 上司が出社 ◦ エラーを確認 ◦
周囲のエンジニアに周知 3. インシデント対応 ◦ Rollback ◦ 対象のPRをRevert 4. インシデント解消 © 2023 Wantedly, Inc.
よかったこと • インシデントを起こした数十分後に上司が出社した ◦ 上司と同期的に密なコミュニケーションがとれた • リリース後の監視がうまくワークした ◦ ユーザー問い合わせ前の内部発見に繋がった •
毎週金曜日に行われている All Hands Meeting 前に気づけた ◦ 復旧作業を他のエンジニアと協力して迅速に行えた ◦ 焦ることなく、行うべき一次対応に集中できた © 2023 Wantedly, Inc.
Wantedlyの障害対応の心構えについて Wantedly Engineering Handbook © 2023 Wantedly, Inc.
Wantedly Engineering Handbook © 2023 Wantedly, Inc. 新しくWantedlyの開発チームに参加する人向けのドキュメン ト 社内のエンジニアが知るべき情報のうち外部にも公開できる情
報を体系的にまとめたもの
Wantedly Engineering Handbook © 2023 Wantedly, Inc. インシデントを起こす前日に更新
Wantedly Engineering Handbook © 2023 Wantedly, Inc. 障害を起こした人に向けてのセクションが加筆されている
インシデントを起こしたあとに ドキュメントに残す文化が深く根付いている © 2023 Wantedly, Inc. Wantedlyの文化
ポストモーテムとは © 2023 Wantedly, Inc. 失敗から学ぶために振り返りを行うこと
ポストモーテムを実施しての気づき そもそもテストの書き方がよくないのでは🤔 © 2023 Wantedly, Inc.
都合の良いモックデータを与えたことが本当の原因なのか 🤔 © 2023 Wantedly, Inc. UserHashService は内部で UserService を使い
User の情報を引っ張って きている 本来は UserHashService の返り値をモックするのではなく UserService の返り値をモックしてあげるべきなのでは? そもそもモックせずに UserService から取得した User のデータ をそのまま使うことはできなかったのか?
本当の根本原因 テストの書き方が問題ということに気づいた © 2023 Wantedly, Inc.
再発防止のために • すぐに取り組みができること ◦ すべてのPRにおいてマージ前後の動作確認やアラートチェックを欠かさない ◦ テストファイルの見直し • 時間をかけて改善すること ◦
結合テストの導入 © 2023 Wantedly, Inc. 大きく2つある
なにを学んだか • 電気通信事業者の場合メッセージ機能を停止させてしまうと官庁報告が必要 な場合がある • リリース前後にマニュアルテストをすることの重要性 • なにか異変に気づいたら報告することの大切さ • 再発防止のためにポストモーテムを実施することの大切さ
© 2023 Wantedly, Inc.
まとめ © 2023 Wantedly, Inc. • テストファイルの書き方は大切 ◦ 自分を疑うためのテストを書け •
マニュアルテストも大切 • インシデントが発生した場合にドキュメントに残す文化の偉大さ • インシデントを起こしてしまったことで過度に責められることはない • 優しい言葉をいただけたお陰でメンタルが安定した
ご清聴ありがとうございました © 2023 Wantedly, Inc. おわり