DMM.comの、一番深くておもしろいトコロ。

電子書籍サイトのサーバサイド改善に挑むインターン

電子書籍サイトのサーバサイド改善に挑むインターン

はじめに

こんにちは、へたれです! DMM.comサマーインターンシップ2018に参加させていただいたので、その様子や感想を書いていきます!

f:id:dmmlabotech:20181130125434j:plain

TL;DR

  • 期間は一ヶ月半
  • 電子書籍のWEBアプリケーションを開発する部署でお世話になった
  • アプリケーションログの基盤構築を主なタスクとした
  • 技術の調査から選定まで含め、裁量が大きい仕事を任せてもらえた
  • 「自分がなにをしたいか」に焦点を当て、人事部の方やメンターの方が親身になってくれた
  • フィードバックが細かく、めっちゃ感謝と反省!
  • DMMの社員さんは本当に面白い人が多く、技術が好きなGEEEEK!な方が多い

配属部署/期間

エントリーは部署別になっており、期間も「8月と9月の間で2週間以上」という条件で調整していきましょうという感じでした。実際にインターンに参加してみると、インターン生同士でも部署・時期・期間がすごくバラバラだった印象があります。本当にこちらの都合に合わせてくれてるんだなと感じました(期間が長いと、インターン生同士の出会いと別れを繰り返してちょっと感傷に浸るようになります)。

部署

電子書籍事業部 (コミックや実用書、アダルト書籍などを購買・配信するためのWebアプリケーションを開発運用)

期間

2018/8/13~2018/9/20

エントリー小咄(こばなし)

最初はSREに触れたくてビッグデータ部にエントリーしたのですが、ビッグデータ部との面接の後に

「部署的にはアプリケーション開発なんだけど、電子書籍の人が今SREを始めようとしててね。話を聞いた限りそっちも良さそうだと思うんだけどどう?」

というお話をいただき、電子書籍へエントリーを切り替えました。「本当に何がしたいか」に焦点を当てて、親身になっていただいたなと感じています。

インターンでの目標

  • 大規模サービスを開発、運用を支えるSRE業務を体験したい

  • 大規模基盤を体験したい

  • DMMの社風や社員の人柄を肌で体験したい

個人的にはインフラやミドルウェアなどに興味があり、国内でもトップレベルのトラフィックやデータ量を扱うDMMの基盤やサービス運用に惹かれました。また、様々な事業に進出しているDMMだからこそ、「内部でどう調和を取ってるんだろう?」「そこで働く社員の人柄や雰囲気は?」といったところが気になっていました。

業務内容

アプリケーションログ基盤の構築

  • ニーズ : Webアプリケーションのアップデートを行った際にエラーログの発生を素早く検知し,バグ検出や修正をスピーディーに行いたい

  • 現状 : サーバにログインし、ログファイルを開く (権限上ログイン自体ができない社員の方も多い)

  • 対策 : アプリケーションエラーログを集積、可視化、検索のフローを確立

ログライブラリの開発

  • ニーズ : ログ基盤構築にあたり、エラーログの原因特定に有用なログメッセージを残したい

  • 現状 : ログメッセージは開発者側に一任されており、有用なログを残せる保証がない

  • 対策 : 以下の仕様でログライブラリを開発し、開発時の負担を減らしつつもエラーの原因把握を容易にできるようなログを残す。 ログのフォーマットを固定し、どのような情報を残すべきかを開発者に提示。 ライブラリ側でバックトレースやログの発生位置を自動取得

社内JenkinsのSSO(Single Sign On)構築

  • ニーズ : Jenkinsサーバのユーザ管理を楽にしたい

  • 現状 : 部署内で複数のJenkinsサーバが散在し、各サーバで個別にユーザを管理

  • 対策 : 別途IdP(Identity Provider)を用意し、各Jenkinsサーバのユーザ管理をSSOで一元化することでユーザ管理コストを削減する

コードレビュー

他のインターン生やメンターの方のコミットをレビューしていました。コードレビューを通して、互いの知見を交換したり、考え方の違いを実感したりするのが楽しかったです。

スケジュール

自分に割り振られたタスクは「ログ基盤の構築」で、それを一ヶ月半かけてやっていきましょうというものでした。

他のタスクは「ログ基盤の構築にあたって必要だから構築した」「環境構築の待ち時間や息抜きにやっていた」という状況で、おおよそ以下の順番で進めていました。

  1. 現在のプロダクト状況やログの閲覧方法を把握
  2. ログ基盤の試験構築
  3. ログライブラリの開発・試験的組み込み
  4. ログ基盤の構成策定
  5. ログ基盤の手順書構築・Ansibleでプロビジョニング自動化
  6. 成果発表

Extra: 気が向いたらJenkinsのSSO化について調べ、試験構築

使用技術と選定理由

ログ基盤構築

様々なログ基盤を検討し、以下の技術を利用することに決めました。

Docker : 環境の構築と破棄が容易。イメージのビルドさえしてしまえば、異なるWebサーバにも同様の基盤構築が可能
Ansible : Dockerのインストールやコンテナの立ち上げを自動化したかった
Fluentd : Webサーバが吐いたログファイルをElasticSearchにフォワードするのに利用
ElasticSearch : 今回のメトリクスはログメッセージなので、Prometheusなどよりは全文検索エンジンであるこちらのほうが強そう
Kibana : ElasticSearch使うならセットで使いやすい

ログライブラリ開発

PHP : サーバサイドがPHPだったため

JenkinsのSSO化

Docker
Jenkins
Keycloak : 以下の理由により採用したIdP

  • OpenID ConnectやOAuth2.0、SAML2.0などそこそこのプロトコルに対応
  • LDAPやActiveDirectoryのユーザ情報が利用できるため、後々社内LDAPとか使えばより管理が楽になるかも
  • OSSで比較的後発 (UI綺麗、ログイン方法やロールなどを細かく管理可能、二要素認証 etc.)
  • インターン時点ではGitHubリポジトリが活発

成果

アプリケーションログ基盤の構築

対象のサーバにDockerをインストールし、コンテナ上で動作するログ基盤を構築するためのAnsible Playbookを書きました。

  1. FluentdでWebサーバからデータを取得
  2. ElasticSearchに流し込みインデキシング
  3. Kibanaでダッシュボードを作成し、エラーログの発生状況を可視化
  4. KibanaからElasticSearchにログを投げて解析し、エラーログの状況と原因を突き止める

f:id:dmmlabotech:20181205112812j:plain
ログ基盤の構成

ログライブラリの開発

下の図のような形で、簡単にログを残せるライブラリを書きました。 ログライブラリに搭載した機能は以下のとおりです。

  • 基本的なログメッセージの入力
  • バックトレースやログの生成位置、時刻の自動取得
  • JSONへのフォーマット
  • タスクごとにIDを割り振り、どのタスクで発生したログかを特定可能にする機能
  • ログファイルへの自動出力
  • エラーレベルの閾値を設定し、エラーレベルが一定以上の場合のみログファイルに残す機能
  • ファイルI/Oの頻度を下げるためのバッファリング
  • ログファイルのバックアップローテーションと一定期間経過後のバックアップファイルの削除
  • 諸設定をyamlファイルで管理

f:id:dmmlabotech:20181203162036j:plain
ログライブラリの使用例

f:id:dmmlabotech:20181203162412j:plain
ログライブラリの出力例

社内JenkinsのSSO構築

こちらのタスクは、ログ基盤の構築で詰まった時や辛くなった時の息抜きにやっていました。成果としては以下の内容をドキュメントに残し、後世に託しました。

  • SSOの環境設計
  • KeycloakとJenkinsのSSOを試験構築した際の手順
  • 認証はできたが認可はできなかった。認可もできるようにするにはこうすればできるかもという提案

苦しんだこと

DMMでのインターンシップは様々な点で内容が濃く、すごく楽しかった反面苦労も多かったです。

「与えられたものを淡々とこなすのではなく、挑戦的なことをしたい」と自ら打診したこともあり、要件やニーズは定まっているが技術調査や選定も含めゼロから自分で構築することを任されたので、非常に苦労しました。

(メンターの方の過去の試みや知見を足がかりにしてなんとかなりました。独りでは絶対にできなかったです)

また、Docker以外の技術が軒並み初めて触れるものだったことも(どういうことをするツール・技術かぐらいは知っていましたが)苦労した理由のひとつだったと思います。

扱うレイヤーや分野も広く、メンターと相談して解決することからインフラの部署にお世話になることまで、ずっと刺激を受けっぱなしでした。

そのような環境下で一ヶ月半ずっといたので、後半は「ちゃんと終わるのか」「技術選定は間違っていなかったのか」といった不安にかられて辛かったですが、成果発表会が終わると、走りきった嬉しさやもう終わる寂しさで涙が出そうでした。

目標の達成具合

大規模サービスを開発、運用を支えるSRE業務を体験したい

SRE専門!という部署ではなかったのですが、実際にプロダクトを開発・運用している部署が内部から改善していくSREの過程を一部体験できました。 また、ランチや勉強会などで他部署の方ともお話ができ、様々なSREを見られたと思います。

大規模基盤を体験したい

直接体験はできなかったのですが、大規模基盤に携わる社員の方々から実際の現場で起きている問題や頭を悩ませていること、楽しさなどを伺いました。 いろんな技術を知ることもでき、大規模基盤やシステムに携わりたい気持ちが増しました!

DMMの社風や社員の人柄を肌で体験したい

なんだかんだ述べてきましたが、DMMで体験したことのうちここが一番大きな収穫かなぁと思います。 もちろん技術的にすごい人ばかりでしたが、皆さん本当に魅力的な人柄で、右も左もわからないインターン生を歓迎して盛り上げてくださいました(マスコット化した人事の方が社内Slackでemoji化していた時は笑いました)。

DMMの印象

やっぱり人の印象が強く、個性が強く面白い方が多かったです。

今回のインターンではやりたいことを積極的にやらせていただきましたが、DMMではそもそも全社をあげてそのような土壌形成ができているんだなと思いました。

ちなみに、インターン終了後には修了証書をいただきました。めっちゃ豪華です! また終了後しばらくして、メンターからの評価が送られてきました。

ネットワーク知識やLinux、ミドルウェアなどの技術面から課題解決力やコミュニケーション力、アウトプットや主体性などのビジネススキル面まで細かく評価していただき、すごく個人のことを見てくれていたんだと感嘆しました。

f:id:dmmlabotech:20181130130058j:plain

最後に

電子書籍事業部の皆さん

素敵なインターンをセッティングしてくださった人事部の方々

懇親会などで盛り上げてくださった他事業部の方々

楽しい時間を一緒に過ごしてくれたインターン生の皆さん

本当に楽しい一夏をありがとうございました!

recruit.dmm-corp.com