LINE テクノロジー&エンジニアリング大全

約8,300万人を対象とした全国調査を支えたシステム~COVID-19に対してLINEが取り組んだこと

インタビュイー
LINE OA Dev 1 チーム ソフトウェアエンジニア 小川拡
画像

LINEは厚生労働省と締結した協定に基づき、⁠新型コロナ対策のための全国調査」を5回に渡って実施しました。この調査は約8,300万人を対象とする大規模なものとなりましたが、そこで使われたシステムはわずか6日間で開発されています。⁠LINE DEVELOPERS DAY 2020」では、LINE OA Dev 1チーム ソフトウェアエンジニアの小川拡氏が、このシステムについて「2500万ユーザから回答を集めた新型コロナ対策のための全国調査を1週間で作った話」と題して講演を行っています。ここでは、このシステム開発の裏側を小川氏に聞きました。

短期間で堅牢なシステムの開発を可能にしたアイデア

――「新型コロナ対策のための全国調査」をLINEで実施するために、わずか6日でシステムを構築したとのことですが、このプロジェクトの話を最初に聞いたときはどのように感じましたか。

小川:社会的にインパクトのある取り組みで、自分も参加したいと思いました。最速で開発する必要があり、システムを落としてはいけないというチャレンジングなプロジェクトでしたが、自分のエンジニアとしての力を発揮して成功に貢献したいと考えていました。

実際にプロジェクトに参加して日々ミーティングを重ねる中で、徐々に社会的な注目度も高い取り組みであることを実感し、これは失敗させられないと強く感じました。

――システムを絶対に落とさないというのは非常に難しい要件だと思うのですが、それをどのように担保しようと考えたのでしょうか。

小川:実装上で細かい工夫を重ねるというよりも、構造的に落ちない設計になっていることが必要だと考えました。当初はアンケートの回答を受け付けるWebアプリケーションを開発するといった方向性で検討を進めていたのですが、それだと時間もかかる上、実装したコードがちゃんと動くかどうかの検証も容易ではありません。そこでWebサーバであるNginxを利用し、そのアクセスログで回答内容を集計するという方向で話が進みました。

――ログで回答を集計するというアイデアは、すぐに生まれたのでしょうか。

小川:それほど頻繁に使っているわけではありませんが、同様の仕組みで集計する事例は社内にあったんです。具体的には、広告関係のシステムで、広告を表示した、あるいは広告をタップしたといったイベントを集計するシステムで利用していました。

こうしたシステムでは、結果を受け付けるだけでよく、レスポンスを返す必要がないため、アクセスログを使った仕組みでも対応できます。実は私の上司がそうしたシステムを担当していたことがあり、私もその事例を見ていたため、相談する中でその方向で実装しようということになりました。広告での実績があったためにとくに大きな懸念もなく、割とすぐに決まりました。

LINE社内で密に連携して課題をクリア

――実際の開発はスムーズに進んだのでしょうか。

小川:最も肝になるNginxの部分はすんなり進みましたが、ユーザを識別する部分が課題となりました。

今回、フロントエンド部分はLINEのWebアプリプラットフォームである「LIFF」⁠LINE Front-end Framework)のアプリとして開発しました。LIFFアプリとすることで、LINEアプリ内で調査ページを開いた場合には、明示的なログインなしにLIFFアプリ側でユーザを識別できます。

ただ、識別されたユーザの情報をクライアントからサーバに送信する部分で問題が生じました。LIFFでは、LIFFアプリに対して発行されたアクセストークンをクライアントからサーバに送信し、受け取ったサーバ側ですぐに検証することを前提に、アクセストークンは短時間で失効する仕様でした。Nginxで受け取ったログを非同期で検証する際に、この仕様だと検証のタイミングでアクセストークンが失効している可能性がありました。

画像

最終的にIDトークンを使ってユーザを識別するようにしたのですが、全国調査のシステムを開発している時点では、その機能はまだ公開されていませんでした。

実はLIFFを開発しているチーム内では、外部からIDトークンを取得するための仕組みを準備していたのですが、チーム外である私たちは知らなかったのです。ただLIFFの開発メンバーに相談したところ、そういう仕組みがあることがわかり、ちょっと工夫すれば正式リリースの前に使えるということだったので、それを使って課題を解決することができました。

あとは時間との戦いだったのですが、とくに大変だったのはQA(品質保証)で動作を確認しつつ、バグを取り除く作業です。

中でも重要だったのは、アンケートの回答内容が適切に反映されているかどうかでした。そこで周りのメンバーにも協力してもらい、データベースの内容を簡単にチェックすることができるツールを開発し、それをQAチームに使ってもらって迅速に検証できるようにしました。

今回のプロジェクトはリリースまで6日間しかありませんでしたが、そのうちの2日間をQAに割り当てています。またプロジェクトの最初の段階からQAチームにも入ってもらい、検証にどの程度の時間が必要かといったことを相談しながら進めています。

それでも検証の時間が十分と言うわけではなかったため、正直なところ不安もありました。ただNginxでリクエストを受け、その結果をログとして出力するという部分に関しては、パフォーマンスも含めて必要なテストを行うことができたので、調査がまったくできないといったトラブルが起きる可能性は小さいのではないかと考えていました。

――Nginxの使い方で、とくに工夫した部分などはありますか。

小川:ログをLTSV形式で出力することにした点でしょうか。Hadoopのクラスタにログを入力して調査するといったことを行うことがあるのですが、その際にNginx側のログをLTSV形式で出力すればフィールドの追加や変更を簡単に行えて、さまざまな情報をログに組み込みやすかったのです。そこで、今回もLTSV形式で出力することにしました。

実際のログのサンプル
実際のログのサンプル

ただ今回はHadoopではなく、MySQLを利用しています。回答情報はユーザの機微情報であるため、社内の共通クラスタに保存するためには情報の取り扱いについて調整が必要でした。取り扱うデータの規模からもMySQLで十分だと想定されたことから、独自にMySQLのインスタンスを立て、fluentd経由でそちらに保存する構成にしました。

――インフラの構成についても教えてください。

小川:インフラには、LINEのプライベートクラウドである「Verda」を利用しています。そこでVMを50インスタンス利用し、それらの前段にロードバランサを配置しました。

今回の調査は継続的にVMを使うものではなかったため、サイジングでは個々のVMの負荷がそれほど高くなかったとしても、とにかく多めにインスタンスを用意して高速に処理できることを念頭に検討しました。50インスタンスという数については、過去に反響が大きかったキャンペーンの実績なども踏まえつつ算出しています。

一応、100インスタンスまでは確実にスケールアウトできるように社内で調整していましたが、結果的にはスケールアウトすることなく、50インスタンスで対応することができました。

インフラの検討にあたっては、担当するチームと連携することで素早く準備を進められました。インフラを開発、運用しているチームが社内にあって、すぐに相談できることの強みを発揮できたと思います。

プロジェクトの成功につながった“ゴールの共有”

――LINEでは「新型コロナ対策のための全国調査」を5回行っていますが、1回目以降、システムの修正は行われたのでしょうか。

小川:いくつかの点で修正を行っています。たとえば1回目の後で集計処理の見直しを行いました。当初は集まった回答データをGROUP BYでカウントし、その回答件数や経路別に集計した値などをダッシュボードに表示していました。ただ回答数が増えてくると集計に時間がかかるようになり、現実的な時間でダッシュボードを更新するのが難しくなります。

そこで2回目からは、MySQLにログを取り込むために使っていたFluentdのプラグインであるfluent-plugin-prometheusを利用して集計するようにしています。このプラグインを使えば、ログに対してタグを付加し、そのタグの種類ごとにカウントするといったことが可能になります。これにより、経路ごとの回答件数などを集計することができます。これを利用することで、ダッシュボードを迅速に更新することが可能になりました。

ログの検証処理でパフォーマンスに問題があった点についても、2回目の調査にあたって改善を試みました。しかし、MySQLのテーブル構成の変更やバッチ処理の改善といった、全体のアーキテクチャに影響しない範囲の改善だけでは、遅延を完全になくすことは難しいことがわかりました。もちろんアーキテクチャレベルから見直すことで改善は可能だと考えられますが、調査の成否には影響がなく、時間も限られていたため、実績のあるシステムを大きく作り直すほどのメリットはないと判断し、見送りました。

画像
――今回、大きなトラブルもなくプロジェクトを完遂できたと思いますが、その要因はどういったところにあったと考えていますか。

小川:やはりNginxのアクセスログを使って集計することにした、最初の設計が大きなポイントになっていると思います。ただ、この設計では実現できる機能に制約が生じることも事実です。

たとえばですが、今回のシステムでは、1度回答した後に再度回答することができてしまいます。本来であれば、1度回答したらその後は回答できないようにしたいところだと思います。ただ今回は、短期間で開発すること、システムが落ちることなく最後まで調査が行えることをゴールにしていて、それをプロジェクトメンバーで共有していました。それによって仕様上の制約についても理解が得られましたし、制約をカバーするためにUIの見せ方を工夫するなどの協力も得られました。

こうしてゴールを共有することにより、メンバー全員が同じ方向に向かって進めたことがプロジェクトの成功につながったと実感しています。

また部署を超えた連携がスムーズにできたこともポイントだったと感じています。短期間でこれだけのシステムを作らなければならないということを、私の上司から各室長に共有してもらい、その上で密に連携したことにより短期間でシステムを構築することができました。

アンケート結果の詳細はこちらのサイトでまとめられている
アンケート結果の詳細はこちらのサイトでまとめられている

厚生労働省との協定に基づき、第5回「新型コロナ対策のための全国調査」を8月12日より実施予定
【速報詳細】第5回 新型コロナ対策のための全国調査

――今回のプロジェクトを経験したことで、どのような知見が得られたと考えていますか。

小川:今回使っているNginxやFluentd、あるいはMySQLは普段も使っているプロダクトです。それらを採用しつつ、使い方を工夫することで新しい問題を解決するためのツールとしても活用できることがわかったのは、私自身にとって良い経験になりました。

――本日はありがとうございました。

おすすめ記事

記事・ニュース一覧