Slide 1

Slide 1 text

© 2023 Wantedly, Inc. 新卒2ヶ月目で起こした インシデントの話 2023年ヒヤリハット大反省会 @新宿 Toranosuke Ujike / @tora_tora_bit

Slide 2

Slide 2 text

自己紹介 氏家 虎之介 (Ujike Toranosuke) フロントエンドエンジニアとして、 Wantedly Visitを主にUI 面から改善することで、ユーザー、企業への提供価値を向 上させている。 © 2023 Wantedly, Inc. 所属: Wantedly, inc. X: @tora_tora_bit ある特定の技術領域に縛られないことをモットーに、 現在は優秀な同期と共にバックエンドについて学習中。

Slide 3

Slide 3 text

インシデントの内容 メッセージ機能を修正する施策を担当 © 2023 Wantedly, Inc.

Slide 4

Slide 4 text

やばい Wantedlyのメッセージ送信機能を壊した © 2023 Wantedly, Inc.

Slide 5

Slide 5 text

ステージング環境での検証や テストを書いて確認したのになぜ © 2023 Wantedly, Inc.

Slide 6

Slide 6 text

根本原因 RubyのHashから値を取得する際の Key指定を間違えていた © 2023 Wantedly, Inc.

Slide 7

Slide 7 text

Ruby Rubyには文字列とシンボルの 2つの異なるデータ型がある © 2023 Wantedly, Inc.

Slide 8

Slide 8 text

シンボルを使ったHash © 2023 Wantedly, Inc. user = { name: "Tora", age: 26, city: "Kyoto" } result = user["name"] result.inspect # nil ruby 文字列で指定した場合 キーとして使われているのはシンボル 文字列で "name" を指定しても 対応するキーが存在しないため nil が返される

Slide 9

Slide 9 text

正しくはこう © 2023 Wantedly, Inc. user = { name: "Tora", age: 26, city: "Kyoto" } result = user[:name] result.inspect # "Tora" ruby シンボルで指定した場合 要素へのアクセスにはHashのキーとして 使用されているデータ型を正確に指定する必要がある

Slide 10

Slide 10 text

実際に何が起こっていたのか © 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

Slide 11

Slide 11 text

根本原因 都合の良いモックデータを与えてしまっていた © 2023 Wantedly, Inc.

Slide 12

Slide 12 text

マージまでの流れ 1. PRを作成 2. ステージング環境で検証 3. 問題ないことを確認してレビュー依頼 4. レビューを受けて修正 5. テストが通ることを確認 6. PRのレビューを再依頼 7. Approveをもらう 8. マニュアルテストをせずに翌日にマージ インシデント発生 © 2023 Wantedly, Inc.

Slide 13

Slide 13 text

レビューを貰ったあとに ステージング環境で検証を行っていない © 2023 Wantedly, Inc.

Slide 14

Slide 14 text

PRマージ後 1. インシデント発生 ○ Honeybadgerがエラーを拾ってSlackで通知 2. 上司が出社 ○ エラーを確認 ○ 周囲のエンジニアに周知 3. インシデント対応 ○ Rollback ○ 対象のPRをRevert 4. インシデント解消 © 2023 Wantedly, Inc.

Slide 15

Slide 15 text

よかったこと ● インシデントを起こした数十分後に上司が出社した ○ 上司と同期的に密なコミュニケーションがとれた ● リリース後の監視がうまくワークした ○ ユーザー問い合わせ前の内部発見に繋がった ● 毎週金曜日に行われている All Hands Meeting 前に気づけた ○ 復旧作業を他のエンジニアと協力して迅速に行えた ○ 焦ることなく、行うべき一次対応に集中できた © 2023 Wantedly, Inc.

Slide 16

Slide 16 text

Wantedlyの障害対応の心構えについて Wantedly Engineering Handbook © 2023 Wantedly, Inc.

Slide 17

Slide 17 text

Wantedly Engineering Handbook © 2023 Wantedly, Inc. 新しくWantedlyの開発チームに参加する人向けのドキュメン ト 社内のエンジニアが知るべき情報のうち外部にも公開できる情 報を体系的にまとめたもの

Slide 18

Slide 18 text

Wantedly Engineering Handbook © 2023 Wantedly, Inc. インシデントを起こす前日に更新

Slide 19

Slide 19 text

Wantedly Engineering Handbook © 2023 Wantedly, Inc. 障害を起こした人に向けてのセクションが加筆されている

Slide 20

Slide 20 text

インシデントを起こしたあとに ドキュメントに残す文化が深く根付いている © 2023 Wantedly, Inc. Wantedlyの文化

Slide 21

Slide 21 text

ポストモーテムとは © 2023 Wantedly, Inc. 失敗から学ぶために振り返りを行うこと

Slide 22

Slide 22 text

ポストモーテムを実施しての気づき そもそもテストの書き方がよくないのでは🤔 © 2023 Wantedly, Inc.

Slide 23

Slide 23 text

都合の良いモックデータを与えたことが本当の原因なのか 🤔 © 2023 Wantedly, Inc. UserHashService は内部で UserService を使い User の情報を引っ張って きている 本来は UserHashService の返り値をモックするのではなく UserService の返り値をモックしてあげるべきなのでは? そもそもモックせずに UserService から取得した User のデータ をそのまま使うことはできなかったのか?

Slide 24

Slide 24 text

本当の根本原因 テストの書き方が問題ということに気づいた © 2023 Wantedly, Inc.

Slide 25

Slide 25 text

再発防止のために ● すぐに取り組みができること ○ すべてのPRにおいてマージ前後の動作確認やアラートチェックを欠かさない ○ テストファイルの見直し ● 時間をかけて改善すること ○ 結合テストの導入 © 2023 Wantedly, Inc. 大きく2つある

Slide 26

Slide 26 text

なにを学んだか ● 電気通信事業者の場合メッセージ機能を停止させてしまうと官庁報告が必要 な場合がある ● リリース前後にマニュアルテストをすることの重要性 ● なにか異変に気づいたら報告することの大切さ ● 再発防止のためにポストモーテムを実施することの大切さ © 2023 Wantedly, Inc.

Slide 27

Slide 27 text

まとめ © 2023 Wantedly, Inc. ● テストファイルの書き方は大切 ○ 自分を疑うためのテストを書け ● マニュアルテストも大切 ● インシデントが発生した場合にドキュメントに残す文化の偉大さ ● インシデントを起こしてしまったことで過度に責められることはない ● 優しい言葉をいただけたお陰でメンタルが安定した

Slide 28

Slide 28 text

ご清聴ありがとうございました © 2023 Wantedly, Inc. おわり