Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
https://www.dip-net.co.jp/ PHPカンファレンス2022 2022/09/24 Motoki Hirao 2年かけました!大規模サービスを Java製CMSからPHP+Laravelの構成 にリプレイスし、運用している話
Slide 2
Slide 2 text
https://www.dip-net.co.jp/ 自己紹介 平尾 元紀(ひらお もとき) 2021年7月dipジョイン エンジニア→スクラムマスター(仮) PHPカンファレンスやPyCon JPの当日ス タッフなどで過去参加してまして、今回現 地開催なのが久々で新鮮です!
Slide 3
Slide 3 text
https://www.dip-net.co.jp/ ディップ株式会社について 3 ビジョン:Labor force solution company 人材サービスとDXサービスの提供を通して、労働市場における諸課題を解決し、誰もが働く 喜びと幸せを感じられる社会の実現を目指します。 引用: https://www.dip-net.co.jp/company/philosophy https://www.dip-net.co.jp/service 人材サービス DXサービス
Slide 4
Slide 4 text
https://www.dip-net.co.jp/ はたらこねっと について 引用: https://www.hatarako.net/kanto/ https://www.dip-net.co.jp/service
Slide 5
Slide 5 text
https://www.dip-net.co.jp/ サービス概要 5 • 社員・派遣・パートを探す求職者と求人企業を繋ぐ求人 サイト、「自分らしくはたらく」ことを実現する • プロダクトイン:2000/10/01〜 • 旧アーキテクチャ:2013/10〜2022/04、10年弱稼働 • 新アーキテクチャ:2022/04〜 引用: https://www.dip-net.co.jp/news/?category=all&year=2000&month=all
Slide 6
Slide 6 text
https://www.dip-net.co.jp/ アーキテクチャ全体像 6
Slide 7
Slide 7 text
https://www.dip-net.co.jp/ 今回の発表範囲 7
Slide 8
Slide 8 text
https://www.dip-net.co.jp/ アジェンダ 8 • 旧アーキテクチャの課題 • 新アーキテクチャの構成 • 人、タスク、スケジュール • リリース後の対応 • 体制変更、そしてアジャイル開発へ • 今後にむけて
Slide 9
Slide 9 text
https://www.dip-net.co.jp/ 9 旧アーキテクチャの課題
Slide 10
Slide 10 text
https://www.dip-net.co.jp/ 構成技術 10 • 言語はJava、有償ライセンスのCMSを利用 • EC2上で動作している • 元々オンプレミス環境で動いていたものをクラウドリフトした • デプロイはJenkinsを利用
Slide 11
Slide 11 text
https://www.dip-net.co.jp/ • アプリケーションフロー • EC2上に構成したCMSに アクセスし、そこから Memcached、DB、NFSに アクセスしてサイト表示 を行う 旧アーキテクチャの構成
Slide 12
Slide 12 text
https://www.dip-net.co.jp/ • デプロイフロー • Jenkinsを用いて 手動ローリングデプロイ 旧アーキテクチャの構成
Slide 13
Slide 13 text
https://www.dip-net.co.jp/ 言語はJava、 有償ライセンスのCMSを利用 13 • 有償ライセンスなのでローカル環境の構築が困難 • 開発サーバーでやらざるを得ない • コンフリクトを気にする必要があり、開発効率が低下 • CMSにある独自のDBでもバージョン管理されている • gitリポジトリにないビジネスロジックが存在する • 見るべきコードが増え運用保守がしずらい
Slide 14
Slide 14 text
https://www.dip-net.co.jp/ EC2上で動作している 14 • 日時のアクセス頻度に合わせて適切なマシン数でスケー ルイン・スケールアウトさせるのが難しい • CMSに密結合した構成であったことも影響している • ansibleを使った半手動の環境構築であるため、ローカル 環境の構築を困難にしている • 開発効率の低下
Slide 15
Slide 15 text
https://www.dip-net.co.jp/ 手動デプロイ 15 • Jenkinsによる手動ローリングデプロイ • 手動で手順が複雑になりがちで、ノウハウに強依存 • 熟練の技によるデプロイ
Slide 16
Slide 16 text
https://www.dip-net.co.jp/ トラブルシューティング 16 • 問題があればログの調査が必要 • ログの調査はサーバーに入ってgrepする形 • アクセス権限があるメンバーに依頼が必要 • 熟練の技での想像が必要
Slide 17
Slide 17 text
https://www.dip-net.co.jp/ 17 新アーキテクチャの構成
Slide 18
Slide 18 text
https://www.dip-net.co.jp/ • アプリケーションフローの改善 • ECS、Fargateを利用し、 コンテナ技術を活用 • サイドカーコンテナで ログを各種分析用SaaSへ • マネージドサービスも活用 新アーキテクチャ の構成
Slide 19
Slide 19 text
https://www.dip-net.co.jp/ • デプロイフローの改善 • Codeシリーズを利用し、 コンテナを用いた 自動デプロイを実現 新アーキテクチャ の構成
Slide 20
Slide 20 text
https://www.dip-net.co.jp/ 「言語はJava、有償ライセンスの CMSを利用」問題について 20 • OSSで公開されているフレームワークを活用する • 社内でも採用例のあったPHP + Laravel の構成にする • メンバー的にもJavaよりPHPの方が馴染みがあった • DBに依存しない形でコードを管理し、ビジネスロジック に関わるものは全てgit管理する
Slide 21
Slide 21 text
https://www.dip-net.co.jp/ 「EC2上で動作している」 問題について 21 • Dockerを活用してコンテナ化する • 社内で PHP + Laravel の構成でコンテナ化されている事例あり • ローカルでの開発も可能になった • ECS + Fargate を用いてスケーリングに対応する • コンテナ化されているので、マシンの構成がシンプルになった
Slide 22
Slide 22 text
https://www.dip-net.co.jp/ 「手動デプロイ」問題について 22 • AWSのCodeシリーズにより、ほぼ自動デプロイされる • GitHub Enterpriseへ特定ブランチをpushした際に、Webhookを用 いてCodeBuildが動き、自動的にビルドされる • ルーティングの切り替えのみを手動で実施し、事前にユーザー に提供される機能を確認した上でリリースできる構成
Slide 23
Slide 23 text
https://www.dip-net.co.jp/ • 開発者はSaaSからメトリク スやログを観測できる • これらのサービスにアクセ スできれば調査可能 • 開発者なら誰でも調査をで きる状態になった 「トラブルシューティング」 問題について
Slide 24
Slide 24 text
https://www.dip-net.co.jp/ 各種ログ・モニタリングツール について 24 • DataDog • ログの調査、アラートの発行 • NewRelic • 各種画面のメトリクスの計測、生産性の可視化 • Kibana • マーケティングチームでの分析
Slide 25
Slide 25 text
https://www.dip-net.co.jp/ ついでに 25 • Linterの導入と自動実行 • PHP Insights を選定 https://phpinsights.com/ • チームの中でチェックされるルールを明示的にしたいというニーズ • Laravelとの相性を考えつつ、既存ビジネスロジックに影響しないような ゆるいルールで導入 • CodeBuildの中で実行される
Slide 26
Slide 26 text
https://www.dip-net.co.jp/ ついでに② 26 • テストの自動実行 • Feature Test を導入した • 画面ごとの表示(結合テストレベル)を簡易的にテスト • 代表的なケースのみ表示ができるかどうかを判定している • 全網羅ではない • CodeBuildの中で実行される
Slide 27
Slide 27 text
https://www.dip-net.co.jp/ 人、タスク、スケジュール 27
Slide 28
Slide 28 text
https://www.dip-net.co.jp/ スケジュール 28 • 最初のコミットが2020年4月、リリースが2022年4月 • 2年かかりました • ベースとなる処理や代表的な画面を開発し、2021年3月時点のプ ロダクトのコードを凍結し、それを参考に実装 自分の入社↓
Slide 29
Slide 29 text
https://www.dip-net.co.jp/ スケジュール続き 29 • 2021年3月時点から追加された機能を追いつき実装 • 12月から4月にかけて移行テストやリハーサルを行い、入念に • セキュリティテスト: VAddy • 負荷テスト: jmeter
Slide 30
Slide 30 text
https://www.dip-net.co.jp/ 移植したものの規模など 30 • 数百画面単位(PC、スマホそれぞれあるので全画面×2のイメージ) • PHPのファイル数 • 数千単位 • 元々動いていたコードをベースに移植しつつ、共通処理を整理した • テスト数 • 手動で数万件単位 • デザイン崩れや通信系のトラッキングなど項目的に人手でなければ難しい問題が あり、手動で見る必要があった
Slide 31
Slide 31 text
https://www.dip-net.co.jp/ 人の変化 31
Slide 32
Slide 32 text
https://www.dip-net.co.jp/ コミュニケーションの変化 32 • 20名もいると全員で集まって状況や進捗が共有できない • 開発チーム・テストチームに作業分担 • 報告内容フローを整理 • リーダーポジションの人がまとめる • 朝会の実施
Slide 33
Slide 33 text
https://www.dip-net.co.jp/ 人の比率の変化 33
Slide 34
Slide 34 text
https://www.dip-net.co.jp/ 34 2022年4月、 大きな不具合もなく 無事にリリース 🎉 🎉 🎉 🎉 🎉
Slide 35
Slide 35 text
https://www.dip-net.co.jp/ 35 リリース後の対応
Slide 36
Slide 36 text
https://www.dip-net.co.jp/ とにかくシステム安定化優先! 36 • 全員体制でエラーアラートや問い合わせ対応する • 1〜2週間ほどの期間で対応し切ると決めた • 予測しきれない不具合を心配していた
Slide 37
Slide 37 text
https://www.dip-net.co.jp/ 大きめのトラブル:ログ出力停止 37 • DataDogのログ保管制限に引っ掛かっていた • https://docs.datadoghq.com/ja/logs/indexes/#日別の割り当てを 設定する • 原因は通信系のInfoログを含めてログを転送していたこと • 一旦Infoログ出力を全て中止し、その後見直し
Slide 38
Slide 38 text
https://www.dip-net.co.jp/ DataDogでアラート、エラーログ監視 38 • エラー数が多いものを優先的に対応 • 調査への影響が大きい • 出力数が多すぎてノイズになる • DataDogは検索結果が5000件までしか出力できない https://docs.datadoghq.com/ja/logs/explorer/list/ • すぐ直せるものは直し、Warningに落としても問題ないものはWarningに • その後、プロダクトとして問題があるアラートを優先して対応
Slide 39
Slide 39 text
https://www.dip-net.co.jp/ 39 エラーログが 1日数千件→1日百数件程度 に現在は減りました! ※一時期、1日数件まで減ったが、最近通信周りのエラーログ出力を 厳格にしたところ、少し増えてしまった
Slide 40
Slide 40 text
https://www.dip-net.co.jp/ 40 大規模に影響のある不具合も 出ず、リリース成功した! と胸を張って言える状況に 💪💪💪💪💪
Slide 41
Slide 41 text
https://www.dip-net.co.jp/ うまく行った要因 41 • 仕様的にノウハウのあるメンバーの活躍 • 人数増加に伴うコミュニケーションフローの改善 • 入念で多様なテスト実施、リハーサル • ログ、パフォーマンスの可視化
Slide 42
Slide 42 text
https://www.dip-net.co.jp/ 42 体制変更、そして アジャイル開発へ
Slide 43
Slide 43 text
https://www.dip-net.co.jp/ 3チーム制に変更する 43 • 役割別に分割 • 中大規模プロジェクトの担当チーム • SEO、小規模プロジェクトの担当チーム • リファクタリング、アーキテクチャの担当チーム • どのチームも社員、パートナー混成チームで4〜8名 • 内部的にはそれぞれのチームに愛称をつけている
Slide 44
Slide 44 text
https://www.dip-net.co.jp/ チームを分断することの影響 44 組織図を可視化したり、各チームのメンバー1名以上を選んでPRを出す などの工夫をしています
Slide 45
Slide 45 text
https://www.dip-net.co.jp/ アジャイル開発への切り替え 45 スクラム スクラム ウォーター フォール 引用: いらすとや https://www.irasutoya.com/2020/04/blog-post_53.html
Slide 46
Slide 46 text
https://www.dip-net.co.jp/ なぜアジャイル 46 • より早い開発の実現のため • スクラムガイドの読み合わせや、プロダクト内での役割の認識 合わせを行う • 企画チームとの関係性も築きたい • 徐々にプロダクトオーナーからプロダクト方向性や価値を聞き ながら、実装方針の相談できる関係に変化しつつある
Slide 47
Slide 47 text
https://www.dip-net.co.jp/ 大規模スクラム開発フレームワークは 採用していない 47 • LeSS, SAFeなどが複数チーム体制だと上がると思われるが、 現在は採用していない • LeSS: https://less.works/ • SAFe: https://www.scaledagileframework.com/ • まずは各チームで自立してスクラムができるようになる
Slide 48
Slide 48 text
https://www.dip-net.co.jp/ • 色々な指標をNewRelicの EventTypeとして送信して お試し中 • DocBaseの投稿量 • チームのベロシティ • などなど… 生産性の可視化 with NewRelic
Slide 49
Slide 49 text
https://www.dip-net.co.jp/ Unit Testの実装 49 • リリース前はFeature Testで進めていた • 実行時間が長すぎる • 実行時にメモリ消費が大きく、比較的スペックが低いマシンを 使っているメンバーの手元で実行できなかった • 少しずつUnit Testに置き換えていき、実行時間の短縮や関 数単位での動作保証に切り替えて開発しやすく
Slide 50
Slide 50 text
https://www.dip-net.co.jp/ リファクタリングの実施 50 • 既存のロジックを参考に実装したため、色々な人が書い た色々な書き方が混ざってしまっている • 後からLinterを導入したこともあり、甘めの検出になっている • PHPやPSRに沿った実装でないことや、ユニットテストが書きづ らい問題 • ユニットテストと並行してリファクタリングを実施中
Slide 51
Slide 51 text
https://www.dip-net.co.jp/ 51 今後にむけて
Slide 52
Slide 52 text
https://www.dip-net.co.jp/ 大きくなっていくチーム体制で、 うまく開発する 52 • 開発者はこれからも増えていく見込みなので、今後もチーム 体制を見直していきたい • スクラムを始めたばかり、ノウハウもこれから • なんらかのフレームワーク導入も考えてみる • 他システムと合わせてリリースするなど規模が大きくなる対 応と、SEOなどの早めの対応が混ざる問題 • コンフリクトが起きやすく、結合テストでの問題の切り分けが難しい
Slide 53
Slide 53 text
https://www.dip-net.co.jp/ 継続的な環境のアップデート 53 • 言語周り • PHP、Laravelのアップデートが急務 • PHPはまだ7.4系なので8系にあげたい • リリース時、Laravel6系だったがLaravel8系にあげた。9系にあげたい • アーキテクチャ • パフォーマンスの可視化促進 • プロダクトを構成する他システムのコンテナ化
Slide 54
Slide 54 text
https://www.dip-net.co.jp/ • プロダクト知識定着 • 自立に時間がかかっている • 属人性も排除したい • 他システムとの関係の整理 • テストコード、カバレッジ、 Linterルールの厳格化 などなど… その他 引用: いらすとや https://www.irasutoya.com/2015/03/blog-post_528.html
Slide 55
Slide 55 text
https://www.dip-net.co.jp/ まとめ 55 • コンテナネイティブなアーキテクチャに変更した • 熟練の技に依存していた箇所を置換し、ローカルで開発 も実現。開発者フレンドリーな環境になった • 開発体制と併せてチームメンバーの構成も変更していき、 動きやすい体制も整えることが大事 • リプレイスしてからが本当の始まり
Slide 56
Slide 56 text
https://www.dip-net.co.jp/ カジュアル面談やってますの でお気軽に… 会場のジョブボードにもあり ます! もし気になった方は…
Slide 57
Slide 57 text
https://www.dip-net.co.jp/ ロゴの使用情報 57 • drawio https://app.diagrams.net/ • Kibana https://www.elastic.co/jp/kibana/ • Jenkins https://jenkins.io/ • New Relic https://newrelic.com • AWS https://aws.amazon.com/jp/architecture/icons/