研修 インフラ AWS

日本CTO協会による合同ISUCON研修の紹介

研修 インフラ AWS

こんにちは!技術部プラットフォームグループのharukin, pochyです。

この記事では、「ISUCON」を模したパフォーマンスチューニング研修を複数社合同で実施した概要と、そのための準備について紹介します。

研修について

目的

今回の研修の目的は次のものとしました。

  • パフォーマンスチューニングの問題を会社横断でチームを組成し取り組むことで、サーバサイドやインフラのパフォーマンス・チューニングを中心に幅広い知識を総動員して課題解決に望む。
  • 課題解決過程のコミュニケーションを通じて、会社の枠を超えた同期作りを促進する。

概要

今回の研修では、チームごとにパフォーマンスチューニングの課題に挑戦しました。

実際のISUCONのように、各チームにwebサーバーを貸し出す形式です。各チームはそのアプリケーションを時間内にパフォーマンスチューニングし、最適化された度合いによってチームに点数をつけます。時間が終了した時点で最も点数が高かったチームが優勝となります。

なお、ISUCONとは、次のようなイベントです。

ISUCONとはLINEヤフー株式会社が運営窓口となって開催している、お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトルです。

ISUCON13 イベントレポート : ISUCON公式Blog

参加者、運営者

この研修は一般社団法人日本CTO協会(以下、日本CTO協会)が「CTO協会 合同ISUCON研修」(以下、合同ISUCON研修)として主催しました。GMOペパボを含めた複数社から、研修の運営者と参加者が集まりました。

日本CTO協会に所属する企業の、2021〜2023年新卒入社のエンジニアを主な対象参加者としました。 東京・大阪・福岡のそれぞれで会場が設営され、各会場はビデオ通話でやり取りをしました。 それぞれの会場はPingCAP株式会社様、株式会社YOLO JAPAN様、Fukuoka Growth Next様に提供いただきました。ありがとうございます!

運営は、日本CTO協会に所属するCTOたちと、この記事を執筆している私たちを含めた各社の若手エンジニア数名で行いました。 ペパボの中では、日本CTO協会で活動しているkurotakyから募集がされました。

社内のSlackで「だれか〜」「若手〜」と募っている。pochy, harukinがそれぞれ応えている。「これ着ていきましょう」という提案とともに"ワタシハAWSチョットデキル"と書かれたTシャツを販売するsuzuriのリンクが貼られている。

運営のために集まった若手エンジニアたちは、競技用サーバーの立ち上げと配布の仕組み、ベンチマーカー、スコアを表示するためのポータルを構築しました。また、当日は会場に行き、参加者のアシストや壊れたベンチマーカーの修正をおこなっていました。参加者がパフォーマンスチューニングに取り組んでいる裏で、運営者もリアルタイムで障害対応をしていたのですね。

研修システムのアーキテクチャ

私たちが構築したシステムのアーキテクチャを説明します。

私たち若手エンジニアたちは、日常業務の合間や少しの空いた時間を利用して、合同ISUCON研修の開催に向けて必要なシステムの準備を行いました。

GMOペパボの2人は、主にベンチマーカーとポータルの準備に携わりました。

解説

構成図の画像

システムのインフラとしてはAWSを利用しました。なお、この研修のインフラを構築するために、AWS様にクーポン付与の形式で料金を負担していただきました。ありがとうございます!

このシステムは、大まかに次の3つの要素で構成されています。

  • 競技用サーバー
    • それぞれのチームがパフォーマンスチューニングするwebサーバー
  • ベンチマーカー
    • 競技用サーバーに負荷をかけて点数を算出するコンポーネント
  • ポータル
    • 参加者が、各チームの点数・順位・ベンチマーカーからのログを閲覧するためのwebアプリケーション

それぞれ詳細に解説します。

競技用サーバー

今回の研修では、catatsuyさんのprivate-isuを使用させていただきました。private-isuを動かせる環境の準備には、matsuuさんのcloud-init-isuconを利用させていただきました。AMI化したものを当日の参加者に配布しました。この準備作業は、GMOペパボではない若手エンジニアの方に行っていただきました。

ベンチマーカー

ベンチマーカーは、ECS Fargate、Lambda、SQSを使用して構築しました。

私はTerraformを使用してAWSインフラを構築する作業を担当しました。Lambdaのファイルディスクリプタの制限により、複数のチームが同時にベンチマーカーを実行してもベンチマーカーが停止しないように、ECSタスク、Lambda、SQSを連携させる構成にしました。競技後半には多数のチームが一斉にベンチマーカーを実行することが予想されていたので、その対応として運営チームは裏でECSタスク数を増やすなどの調整を行いました。

競技用サーバーからのベンチマーカー起動と、結果をポータル画面で表示する一連のプロセスは、GMOペパボではない若手エンジニアの方々に実装を行っていただきました。競技用サーバーからのリクエストの際にIPアドレスを取得し、これをSQSへメッセージとしてキューに入れることから始まり、Lambdaがその情報に基づいてECSタスクを起動し、ECSタスクがSQSからメッセージを取得してベンチマーカーを実行し、その結果をポータル画面のスコアに表示するまでの一連のプロセスをGoで実装されており、とても学びになりました。

ポータル

当日のポータル画面の画像 ※不思議なチーム名がたくさんありますが、これらは当日に各チームが自ら決めたものです。

ポータルは、pochyが構築しました。

AWSのAmplifyを利用することでポータルをwebアプリケーションとして構築・デプロイしました。データストアには、NoSQLのDynamo DBを利用することで、各チームのポイントを時刻と紐づけて保持しました。APIエンドポイントにはGraphQLでデータをやりとりするためのAppSyncを採用し、ポイントの取得と更新を実現しました。取得はポータル画面を利用するブラウザから、更新はベンチマーカーから叩かれるので、更新の際にはAPIキーで認可をかけるように実装しました。クライアントアプリはVue.jsとCanvas APIを用いて実装し、各チームの得点推移と現在の順位表を表示するようにしました。チームの認証には、web用のユーザー管理・認証を行うCognitoを利用しました。

感想

harukin

合同ISUCON研修を通じて、事前準備や研修後の懇親会で他社の同年代のエンジニアの方々と交流する機会を得られて、とても貴重な経験になりました。事前準備の際には若手エンジニアの皆さんの技術力の高さに刺激を受け、自分ももっとできることを増やしていきたいと思いました。

ベンチマーカーの担当をし、Terraformを用いてECS Fargateを扱うことは初めてだったのでとても学びがありました。また、若手エンジニアの皆さんからECS、Lambda、SQSの連携プロセスについて学ぶことができ、視野を広げることができました。Terraformで完全にIaC化できなかった部分もありますが、これを今後の反省として受け止めて、自己研鑽を積み重ねていきたいと思います。当日のベンチマークはいくつかの小さな問題が発生しましたが、機能停止や競技中断といった深刻な事態には至らずに無事に終えることができたのでほっとしました。競技終了後のterraform destroyが気持ちよかったです。

pochy

まずよかった点としては、他社の若手エンジニアと交流を持てたことです。日常の仕事ではほとんど社内のことしか見られませんが、このイベントでは複数の会社から集まったエンジニアたちと協力してシステムを作れました。GitHubやDiscordで定期的にやりとりをしつつ、当日までに構築を間に合わせました。このような体験は日々の業務ではできないため、私にとっては新鮮でした。 研修終了後の懇親会でも、たくさんの人とおしゃべりができました。会社の枠を飛び越え、Web業界のエンジニア仲間として歓談できる機会は貴重なため、参加してよかったと感じました。

反省点としては、最後の最後でポータル画面が一部壊れてしまった点です。ポータルの構築は私が担当していたのですが、データ量を考慮していなかったため、データが増えた終盤では一つの画面ですべての点数を表示できなくなってしまいました。パフォーマンスチューニングの研修のためのシステムなのに、可用性を高く保てなかった経験は自分の心に深く刺さっています。このブログを半年以上も執筆できなかった理由の一つが、この恥ずかしさだったのかもしれません…。たぶん一生忘れないので糧にしたいです。「流した冷や汗は嘘をつかない」は真だなと感じました。

おわり

以上、日本CTO協会による複数社合同研修の紹介でした。今年も合同研修の企画が進んでいるようなので、またどこかでお会いしましょう。