見出し画像

僕の自作ツールが大学のサーバーをダウンさせてしまった日の話

2021年10月25日、この日は僕がただの大学生から、大学のサーバーをダウンさせた"犯人"へと変わった日です。

小説みたいな書き出しをしてみましたが、これは嘘みたいな本当の話で、ふと思い出して懐かしくなったので回想録として note に残すことにしました。


出来事の概要

2年前の2021年10月、何が起きたかを簡単に書くと以下の通りです。

・大学の授業や課題を管理するためのシステムを拡張するツールを作った
・ツールが予想以上の人数に使われ、結果として大学のサーバーに負荷がかかりサーバーが落ちる事態になった
・大学から呼び出しを受けることになった

時系列を追って、この note で出来事の全容を書きたいと思います。

使いづらい LMS

まず前提として、私の大学では毎日の授業や課題は授業支援システム、通称 LMS と呼ばれるオンラインのシステムで管理されています。

実際のLMSの画面

しかし、この LMS には大きな欠陥がありました。それは、未提出の課題を一覧で見る機能が存在しないということです。

つまり、残っている課題を確認するには、自分が履修している各授業の詳細ページにいちいち行かなければなりませんでした。

これは特に2年前、授業のほとんどがオンラインで行われていた状況では致命的で、このせいで課題の出し忘れが起きてしまった人も多いはずです。

「TODO アプリなどを使って管理したら」という声が上がりそうですが、それができるのなら苦労はしません。僕の場合は、アプリを入れたところで 3 日で使わなくなるのがオチです。

そういう性格なので、何とかして LMS の画面上で課題の一覧機能を作れないかということをずっと考えていました。

とある東大生の投稿を見つけた

そんなことを思っていたら、当時の Twitter でとある投稿を目にしました。
それは「東大の LMS で、課題の一覧をトップページでも見れるツールを作った」という内容です。

とある東大生の方の投稿

東大の LMS には元々未提出の課題一覧が見れる機能はもともと備わっていたそうなのですが、これをトップページでも見れるツールを学生が作って配布していました。

これはまさに自分が作ろうとしていたものであり、実際にそのツールを見てみたところ、Chrome の拡張機能というものを使って作られていました。

ブラウザ(Chrome)に自作の拡張機能をインストールすることで、画面に追加の情報などを表示させることができるという仕組みです。

この投稿のおかげで「Chrome の拡張機能というものを使えば、自分の大学の LMS でも課題の一覧機能を作ることができそう」という大きなヒントを得ました。

必要な勉強を始める

先のツイートのおかげで最終的なゴールが見えました。

しかし、そのときの自分のスキルは以下のような状態だったので、まずは YouTube 等で Chrome の拡張機能を作るための情報収集から始めました。

・Python で Twitter API とかは触ったことある
・Flutter でアプリ開発にはまっていた
・Web に関してはノータッチで、HTML・CSS はなんも分からん状態

ありがたいことに「Chrome Extensions Tutorial」で調べると、非常にわかりやすい解説動画が YouTube に上がっており、それを参考に Chrome の拡張機能の作り方について勉強しました。

さっそく作り始める

分かりやすい解説動画のおかげで、すぐに拡張機能の作り方については理解できたので、さっそく目的の拡張機能を作り始めることにしました。

作りたい拡張機能に必要な機能はざっくり以下の通りでした。

・各授業の詳細ページから、未提出の課題の情報を取得
・取得した課題の情報を整理して、LMS のトップページに表として表示

これを作るために、まず最初のステップとして自分の大学の LMS がどのような仕組みになっているのか調査しました。

具体的には、各授業のページがどのような URL になっているのか課題の情報を表示している要素にはどのような名前が付いているかなどを調べ、拡張機能の仕様について検討しました。

次に、実際に未提出の課題の情報を取得して表示するプログラムを書いては試しに動かしてみて、バグがあれば修正するというのをひたすら繰り返しました。

そして作り始めてから 3 日後、拡張機能は完成しました。

未実施の課題というセクションを自作した

拡張機能を公開することに

もともと拡張機能は自分用に作る予定でした。

ですが、いざ完成して使ってみると予想以上に便利で、これを公開したら大学の人も使ってもらえるのではないかと思い、拡張機能を公開することにしました。

ちなみに、Chrome の拡張機能を公開するのには 2 つの方法があります。

① プログラムを ZIP で固めて、任意のサイトから配布する
② Chrome のウェブストア経由で配布する

使ってもらうユーザー的には、②の方がダウンロードの手間等も少なく楽なのですが、登録料がかかることに加え、公開に審査が必要とのことで、この時は①の方法を選択しました。

サイトにプログラムをアップロードし、ダウンロード手順について説明文を書いて、公開の準備を進めました。

公開すると予想以上の反響

準備が終わり、ついに拡張機能を公開することになりました。

当時、自分は Twitter は見る専として使っていたのでフォロワーは 50 人程度しかいなかったですが、それでもなるべく多くの人が Twitter を見てそうな時間を選んでツイートしました。

その時の僕のツイートがこれです。

公開してすぐに何人かの人から「すげー!」「めっちゃ便利、使わせてもらいます!」といった反応をもらいました。

その日の夕方から夜になるにつれツイートはどんどん拡散されていき、自分が予想していた以上の反響となりました。

また、北海道のとある大学でも同じ LMS が使われていたこともあり、その大学の人から DM が来るということもありました。

引用やリプライ、DM でさまざまな人から感謝やお褒めの言葉をいただき、公開した日の金曜とその週末は「やってやったぞ」という達成感でいっぱいな時間を過ごしました。

月曜になり異変が起き始める

しかしそんな時間も長くは続かず、事件が起きることに。異変が起き始めたのは、拡張機能を公開してから 3 日後の月曜日の午前中

いつも通り LMS にアクセスしてみると、読み込みに非常に時間がかかったり、接続エラーになるといったことが起きました。

こんなことは初めてで「おかしいな」と思い Twitter を見てみると、大学の何人かの人が同様に LMS に繋がらないということを報告していました。

その時のTwitterのタイムラインの様子

それを見てすぐに、僕は最悪の事態が頭をよぎりました。
「自分が作った拡張機能のせいで、サーバーが落ちたのかも。」

想定を上回る負荷がかかってしまった

実は自分が作った拡張機能は、課題の取得時に複数のリクエストを送信するため、サーバーへの負荷が増加してしまう問題点がありました。

もちろん、何も対策をしていなかったわけではなく、サーバーへの負荷がなるべく小さくなるよう、あらかじめ以下のような対策は講じていました。

・課題情報を取得する際には、sleep を挟んで間隔をあける
・ローカルにデータを保存してキャッシュする
・情報を更新するボタンは、インターバルを設けて短い間に何度も押されないようにする

当初は、このような工夫を行っている上、拡張機能を使ってくれるのはごく限られた人だろうと見込んでいたため、特にサーバーに問題が生じることはないと考えていました。

しかし、その予想に反し、想定をはるかに超える人数が拡張機能を使ったことによって負荷がサーバーの処理能力を超え、障害を引き起こすことになりました。

ちなみに、拡張機能は金曜日の昼に公開をし、そこから土日にかけて多くの人にダウンロードしてもらいましたが、土日は授業がなく LMS もあまり使われないことで当初は目立った障害にはならなかったのだと思います。

そして、月曜日になって授業が始まると、学生が一斉に LMS を使い、負荷による障害が顕在化したということだと考えられます。

メンタルは一気に奈落の底へ

タイミング的にも、サーバーの障害は自分の拡張機能が原因となっていることは明らかでした。

そのため自分もその日の 11:20 に、自分の Twitter で拡張機能をダウンロードした人はいったんオフにするように呼びかけました。

しかし障害は収まらず、その日の夕方には大学から全生徒宛てに「LMS の障害は学生が配布している拡張機能が原因である可能性が高く、ダウンロードした人は削除するように」という内容のメールが送られてきました。

そのときの自分の精神状態は結構終わっていました。

・自分のせいで大学のサーバーが落ちたって、これやばいよな、、
・何かしらの処分が下るのでは、、懲戒処分?停学?
・まずはすぐに名乗り出てとにかく謝罪するしかない

こんなことがずっと頭の中をぐるぐるしていましたが、まずはとにかく大学に連絡をしなければと思い、月曜の 18 時半ごろに大学のシステムを管理しているセンターに謝罪のメールを出しました。

大学側との面談

次の日には大学側からメールの返信が来て、一度事情を聞きたいので、大学の方まで来てほしいとのことでした。

そのメールには本当にありがたいことに「悪意があったわけではない上、真摯に反省していることがわかったので、処分やけん責は行わない」との記載があり、いったんは胸を撫でおろしました。

そして後日、大学へ出向きシステムを管理しているセンターの方と面談しました。面談はお堅い感じではなく、穏やかな雰囲気で進めていただきました。

そこでは、「拡張機能はどういう仕組みなのか」「開発者から見て何か負荷を軽減させるための措置は考えられるか」などいろいろヒアリングをされました。

また、「予想以上の人数にツールが使われたことでサーバーに障害が起きたわけであり、ツール自体は便利であることは間違いない」と言っていただきました。

この時の先生方のご対応には本当に頭があがりません。

その他、具体的に面談でどのような話をしたかについては、Twitter に詳細を載せていますのでそちらをご覧いただければと思います。

事件は終わりを迎える

そんなこんなで、この拡張機能の事件は終わりを迎えることになりました。

その後といえば、僕は大学で「拡張機能の人」「大学のサーバーを落とした人」「拡張マン」などと認知されることになりました。

そのおかげといってもなんですが、のちに大学の文化祭のサイトを作ることになったり、大学側からアプリ開発の仕事をもらったり、学内問わずいろいろな方と繋がったりできました。

この出来事は、自分の大学生活に大きな変化を与えたターニングポイントといっても過言ではないと思います。

ただ何も処分が下されなかったのは、大学側の温情であり、それには本当に心から感謝しています。

社会人になって同様のことを起こしたら絶対にタダでは済まされないので、この事件以来、何かを開発するときには各方面に対して最大限の注意を払うようにしています。

3つの学び

最後に、僕がこの出来事で得た 3 つの学びを記してこの note を締めくくりたいと思います。

① 何か間違いを犯したら、すぐに名乗り出て謝罪すべき
② 第三者のサーバーにアクセスするときは、負荷に注意
③ プログラミングはめちゃめちゃ楽しい

① 何か間違いを犯したら、すぐに名乗り出て謝罪すべき

大学側との面談の際に、
「障害が起きてからの対応が早く、真摯に反省しているのが分かった。だから今回、処分は何も下さないことにした。」
ということを言っていただきました。

もし大学側から特定されるまで名乗り出ずにいたら、絶対何かの処分が下されていたと思います。

何かミスをしたら、それを正直に言うのは勇気がいることだと思いますが、言わないのに比べたら絶対マシだと思います。

そんなの常識だと思うかもしれませんが、意外とできていない人もいるのではないでしょうか。

普段の大学生活でもバイトでも、何か間違いを犯してしまったら隠さずにすぐに報告することは重要だと改めて認識しました。

② 第三者のサーバーにアクセスするときは、負荷に注意

これは主にエンジニアの人向けです。

API を使うときやスクレイピングをする際には、第三者のサーバーに対してアクセスすることになりますが、その時にはリクエストの頻度に十分注意を払う必要があると思います。

世間一般的に「スクレイピングをする際には、アクセス間隔を 1 秒以上空ける」ことを推奨されていることが多いような気がします。

もし一般の企業や公共機関に対してサーバーの障害を引き起こすことになれば、損害賠償を請求されたり訴訟を起こされたりする可能性も考えられます。

そのため、第三者のサーバーに対してアクセスする際には、相手に与える負荷に十分注意するべきだと思います。

③ プログラミングはめちゃめちゃ楽しい

最後に「プログラミングはめちゃめちゃ楽しい」これに尽きます。

自分の作ったプログラムが実際に多くの人の役に立っていると実感した時の喜びは、言葉では言い表せないものがあります。

自分も拡張機能を使ってくれた人から感謝された時の嬉しさは、今でも鮮明に覚えています。

この事件を機に、自分はプログラミングにさらにハマることになりました。新しいアイデアが浮かぶたびに、わくわくしながらコードを書いています。

皆さんにも、ぜひそのプログラミングの楽しさを知ってほしいです。

終わりに

大学のサーバーが落ちた時には正直どうなることかと思いました。センターの先生方の寛大な対応には今でも本当に心から感謝しています。

この事件は間違いなく自分の大学生活で一番インパクトが大きく、自分の人生に少なからず影響を与えていると思います。

僕の大学生活は大学院を含めあと 2 年ちょっとありますが、この出来事は今後の教訓にしつつ、これからも周りの人が便利・面白いと思ってもらえるものを作り続けたいと思います。

ここまで長々と書きましたが、読んでいただきありがとうございました。


この記事が参加している募集

振り返りnote

この記事が気に入ったらサポートをしてみませんか?