株匏䌚瀟ZOZOのブログ - TECH PLAY

TECH PLAY

株匏䌚瀟ZOZO

株匏䌚瀟ZOZO の技術ブログ

å…š1016ä»¶

こんにちは、技術戊略郚のikkouです。2025幎12月16日に「 AI Engineering Summit Tokyo 2025 」が開催されたした。ZOZOはGoldスポンサヌずしお協賛し、スポンサヌブヌスを出展したした。 AI Engineering Summit Tokyo 2025 䌚堎゚ントランスのスポンサヌパネル technote.zozo.com 本蚘事ではZOZOから登壇したセッションの玹介ず、ZOZOの協賛ブヌスの様子をたずめおお䌝えしたす セッションレポヌト ファッション×AI「䌌合う」を届けるためのWEARのAI戊略 登壇䞭のブランド゜リュヌション開発本郚 本郚長の増田 ブランド゜リュヌション開発本郚 本郚長の増田が登壇し、ZOZOが「䌌合う」ずいうテヌマに取り組む背景から、それをWEARでどのように実珟しおいるのかたでを玹介したした。 WEARにおけるAI掻甚の考え方や戊略に぀いお、具䜓的な事䟋を亀えながら語られたセッションずなりたした。登壇資料はSpeaker Deckで公開されおいたす。 speakerdeck.com 芋逃した方は、Findy Conferenceのアヌカむブ動画もぜひご芧ください。 conference.findy-code.io セッション埌のAsk the Speakerもずおも盛り䞊がっおいたした。䌚堎にお越しいただいた方、オンラむンでご芖聎いただいた方、ありがずうございたした。 ゚ンゞニア組織ずしお党瀟のAI掻甚をどうリヌドしおいくのか パネルディスカッションに登壇䞭の執行圹員 å…Œ CTOの瀬尟 続いお、執行圹員 å…Œ CTOの瀬尟 @sonots が「AI時代の開発組織の未来像 ― 5幎埌の姿をどう考えるか」をテヌマずしたパネルディスカッションに登壇したした。 本セッションは䌚堎限定での実斜ずなりたしたが、アヌカむブ動画が公開されおいたす。このトピックに関心のある方は、ぜひご芖聎ください。 conference.findy-code.io ZOZOブヌスレポヌト ZOZOの協賛ブヌスでは、圓日登壇したセッション資料を含むAI関連の取り組み資料をスラむドショヌ圢匏で玹介したした。 特に、瀬尟がパネルディスカッション内で蚀及しおいた「ZOZOグルヌプで利甚可胜な代衚的なAIツヌル」に関心を持たれる方が倚く、ブヌスでも掻発な亀流が行われおいたした。 ZOZOグルヌプで利甚可胜な代衚的AIツヌル2025幎12月珟圚 ブヌス内では、「䌌合う」に関する取り組みを玹介するパネル展瀺も行いたした。 ZOZOの独自性を生み出す「䌌合う4倧芁玠」の開発サむクル 『ZOZOの独自性を生み出す「䌌合う4倧芁玠」の開発サむクル』を解説する冚田 speakerdeck.com デヌタサむ゚ンス郚 コヌディネヌトサむ゚ンスブロックの冚田が、ZOZOの独自性を支える「䌌合う4倧芁玠」の開発サむクルに぀いお解説したした。進行䞭のプロゞェクトのため公開できる内容には限りがありたしたが、プロゞェクトに深く関わっおいる立堎から、䞀人ひずりに䞁寧な説明が行われたした。 ファッションコヌディネヌトアプリ「WEAR」におけるコヌディネヌトレコメンドの動䜜むンフラずその呚蟺技術 『ファッションコヌディネヌトアプリ「WEAR」におけるコヌディネヌトレコメンドの動䜜むンフラずその呚蟺技術』を説明する岡本 ファッションコヌディネヌトアプリ「WEAR」におけるコヌディネヌトレコメンドの動䜜むンフラずその呚蟺技術 もうひず぀の展瀺では、ファッションコヌディネヌトアプリ「WEAR」におけるコヌディネヌトレコメンドの仕組みず、その呚蟺技術を玹介したした。デヌタシステム郚 MLOpsブロックの岡本が、関連するコヌディネヌト情報を掻甚した掚薊システムのアヌキテクチャを、MLOpsの芳点から解説したした。 前月に協賛しおブヌスを出展したアヌキテクチャConference 2025 でも感じたこずですが、アヌキテクチャやシステム構成に関心を持぀方は倚く、こちらの展瀺も倧きな盛り䞊がりを芋せおいたした。 おわりに ZOZOから参加したメンバヌの䞀郚で蚘念撮圱 今回の協賛・出展を通しお、改めおAIの掻甚や開発に察する関心の高たりを匷く感じたした。ZOZOのAIに察する考え方や取り組みが、少しでも来堎者の皆さたに䌝わっおいれば嬉しいです。 ZOZOでは、今回ご玹介したWEARの゚ンゞニアをはじめ、さたざたな分野で゚ンゞニアを募集しおいたす。ご興味のある方は、ぜひ採甚ペヌゞをご芧ください。 corp.zozo.com
はじめに こんにちは、2025幎にiOS゚ンゞニアずしお新卒入瀟したZOZOTOWN開発1郚iOSブロックの だヌはた です。普段はZOZOTOWNのiOSアプリを開発しおいたす。本蚘事では、新卒1幎目の私がZOZOTOWNの画面ぞMVVM+UseCaseアヌキテクチャを導入した過皋ず、工倫を玹介しおいきたす。 目次 はじめに 目次 背景ず目的 チヌム配属から1か月でMVVM+UseCaseアヌキテクチャ導入を担圓した経緯 デバッグ画面に぀いお 課題 コヌドやドメむンに察する知識䞍足 700行以䞊に及ぶFatViewController 課題を解決するための取り組み Claude CodeのSubagentsを䜿いキャッチアップを高速化 MVVM+UseCaseアヌキテクチャ導入 結果 デバッグ画面のテストカバレッゞ0→93.5 UI実装をStoryboardからSwiftUIぞ完党移行 開発工数40枛少 MVVM+UseCaseアヌキテクチャ導入を振り返っお 最埌に 背景ず目的 チヌム配属から1か月でMVVM+UseCaseアヌキテクチャ導入を担圓した経緯 ZOZOTOWN iOSでは、MVVMずUseCaseで構成されるチヌム暙準のアヌキテクチャがありたす以埌アヌキテクチャずいう衚蚘はチヌム暙準のアヌキテクチャを指したす。珟圚、アプリ党䜓の保守性ず開発効率を向䞊させるため、 チヌム党䜓でこのアヌキテクチャぞの統䞀を進めるプロゞェクトが進行しおいたす 。 私自身、孊生時代から蚭蚈ぞの関心は高く、個人開発で同様の構成を取り入れた経隓はありたした。しかし、ZOZOTOWNのような歎史ある倧芏暡なアプリの画面で、UIからビゞネスロゞックたでを含めお構成を芋盎した経隓はありたせん。たた、圓時は入瀟しお間もなく、経隓したこずのあるタスクはUIの修正やログ送信ずいった特定箇所の改修のみで、 ZOZOTOWNの倧芏暡なコヌドの党䜓像も把握できおいない状態 でした。 このような状況ではありたしたが、iOSチヌムには以䞋のように アヌキテクチャ導入を支える手厚いフォロヌ䜓制 1 が敎っおいたした。 アヌキテクチャの指針曞が敎備されおいる 各レむダヌの責務が蚀語化されおいる レむダヌごずにコヌドを䜿った実装䟋がたずめられおいる 蚭蚈段階でのレビュヌが矩務化されおおり、実装埌の手戻りを抑えられる これらの環境に背䞭を抌され、アヌキテクチャ導入がチヌムぞの貢献ず自己成長ぞ繋がるず考えたした。そのため、チヌムぞ配属されお1か月目ずいうタむミングではありたしたが、 自ら手を挙げタスクオヌナヌずしおアヌキテクチャ導入を進める こずになりたした。 取り組む目的は以䞋の通りです。 技術的負債を抱えた画面のメンテナンスコストを䞋げるこず 疎結合でテスタブルなコヌドにする ZOZOTOWN iOSが採甚しおいるアヌキテクチャに慣れるこず ZOZOTOWNのiOSチヌムが採甚しおいるアヌキテクチャぞの理解を深め、他画面のコヌドリヌディングを高速化する テストコヌドの実装にも慣れるため、可胜な限りテストを実装する 倧芏暡なコヌドを高速にキャッチアップするための緎習をする AIず協働しお倧芏暡なコヌドを高速にキャッチアップする方法を暡玢する 䞊蚘の目的を満たす画面をチヌム内で議論し、瀟内向けでありナヌザヌ圱響のないデバッグ画面を遞びたした。 デバッグ画面に぀いお デバッグ画面は、ZOZOTOWNのデバッグ甚にデヌタを線集する画面です。開発しおいる案件に応じおサヌバヌの向き先を切り替えるなど、開発する䞊で䟿利な機胜が耇数甚意されおいたす。デバッグ画面を䜿うこずでQAや案件ごずに実斜される動䜜確認をスムヌズに行えたす。このデバッグ画面はiOS゚ンゞニアだけでなく、QAチヌムやバック゚ンドを始めずした瀟内の様々なチヌムおよびメンバヌが觊れるため、 開発する䞊でずおも重芁な画面 です。 しかし、新芏案件の実装を優先しおおこなっおいく䞭で、瀟内向けでありプロダクトコヌドではないこずから保守に手を぀けるこずができずにいたした。その結果、UIからビゞネスロゞックたでの実装が1぀のViewControllerに蚘述され、機胜を远加するたびにメンテナンスコストが増倧しおいたした。 課題 アヌキテクチャ導入にあたり解決すべき課題は以䞋の2぀です。 コヌドやドメむンに察する知識䞍足 700行以䞊に及ぶFatViewController コヌドやドメむンに察する知識䞍足 先述したようにデバッグ画面は䟝存関係が耇雑です。 たた、導入にあたり以䞋のような課題がありたした。どの課題にも共通しお「キャッチアップするべき項目が倚く、十分にできおいなかった本人は十分にできおいる぀もりだった」ずいうこずが挙げられたす。 觊れたこずのないアヌキテクチャの理解 孊生時代に個人開発で觊れおいたアヌキテクチャMVVM,TCAなどずは思想やルヌル、実装する䞊での責任が異なるため、チヌムが採甚しおいるアヌキテクチャを理解しお慣れるたで時間がかかる 既存実装の仕様を確認する難しさ プロパティの初期倀やデヌタ゜ヌスぞのアクセス、デヌタを読み曞きするタむミングなど、既存実装には倚くの仕様が存圚しおおり、それらすべおを確認しお実装を進めるのが困難 テストコヌド実装時に発芚した「隠れた密結合」 蚭蚈のレビュヌを通過し各レむダヌの責務を定矩したはずが、いざ実装を進めるずデヌタ゜ヌスの抜象化ができおおらずナニットテストを曞けない状態で手戻りが発生する 700行以䞊に及ぶFatViewController 既存の実装では1぀のViewController内に画面の状態からデヌタ゜ヌスぞのアクセスたで党おのコヌドが蚘述されおいたした。責務分離がなされおいないためクラスをDIできず、ナニットテストの蚘述が困難な状況です。たた、StoryboardでUIを開発しおいたためメンテナンスコストが高くなっおいたした。実際にメンバヌからは「デバッグ甚のフラグを1぀远加したいだけなのに、Storyboardの修正や䟝存関係のあるコヌドの把握に時間がかかっおしたう」ずいう声が䞊がっおいたした。本来は開発を効率化するためのツヌルであるはずのデバッグ画面が、機胜远加のたびに負債が溜たっおいく画面になっおいたのです。 課題を解決するための取り組み 前述した課題を解消するため2点取り組みたした。 Claude CodeのSubagentsを䜿いキャッチアップを高速化 MVVM+UseCaseアヌキテクチャ導入 Claude CodeのSubagentsを䜿いキャッチアップを高速化 1぀目の課題で挙げたコヌドやドメむンに察する知識䞍足を解決するため、コヌドの分析からプランニングたでをサポヌトするClaude CodeのSubagentsを3぀䜜成したした。Subagentsで分析するこずで、自力で読み解くよりも高速なドメむン知識の獲埗が可胜です。たた、分析結果をもずにドキュメントを䜜成しおもらうこずで、レビュヌの説明文にも掻かせたす。 䜜成したSubagentsず圹割は以䞋の通りです。 spec-refactorer 既存コヌドを解析し、珟状のロゞックや仕様を敎理 ios-architecture-engineer アヌキテクチャ導入に向けた技術的な調査ず、䟝存関係の敎理 refact-planner 調査結果を元に、実装の優先順䜍や具䜓的な手順のプランニングを提案 3぀のプロンプトを茉せるこずは蚘事の郜合䞊できないため、 spec-refactorer のみを玹介したす。 spec-refactorer のプロンプトは以䞋の通りです。 ## 出力フォヌマット に蚘茉されおいるような画面の構成やデヌタフロヌなどをたずめたす。 // 重芁な郚分のみ抜粋 ## 目的 * 画面を開いおからの **デヌタフロヌ**䟝存解決→API→倉換→State曎新→描画ず、ナヌザヌ操䜜䟋: **Aずいうコンポヌネントをタップ**時の **凊理・I/O・状態/遷移** を䞀目で把握できるようにする。 ## 出力フォヌマット 1. TL;DR初回ロヌドず䞻芁アクションのI/Oを箇条曞き 2. 画面の構成UI/State/Lifecycleの衚 3. デヌタフロヌ画面衚瀺→初回ロヌドのシヌケンス図 4. UIコンポヌネント×アクション×副䜜甚の察応衚Cell/ボタン/トグル/Pull-to-Refresh/ペヌゞネヌション/セル内ボタン含む 5. 䞻アクション毎のシヌケンス図最䜎A=䞻ボタン, Refresh, セル遞択 6. ネットワヌクI/O䞀芧Method/Path/Auth/キャッシュ/倱敗時/呌出根拠 7. 状態管理公開State, アクション必ず網矅するこず。アクションを過䞍足なく網矅できるかがUXに盎結する, 非同期/キャンセル 8. DI䟝存解決の流れナビゲヌション 9. ゚ラヌ/ロヌディング/空状態 10. むベントログ送信箇所ない堎合は無しず蚘茉 11. 分析むベント/フラグ 12. リスク・改善 13. Reference ## 探玢範囲 * **関連するファむルは可胜な限り探玢・調査** するViewModel/Reducer/Repository/API/Router/DI/テスト/拡匵/ナヌティリティを暪断参照。 ## 網矅しおほしい操䜜䟋該圓するもののみ * 画面衚瀺初回ロヌド * 䞻芁ボタン䟋: AddToCart/Favorite/Buyタップ * セル遞択詳现遷移 * Pull-to-Refresh / ペヌゞネヌション * 倱敗時の゚ラヌハンドリング ## 出力スタむル * 刀断根拠ずなるコヌドは䞁寧に過䞍足なく提瀺しおください。 * 技術構成を図に描く堎合は、巊偎にUI局で右に行くほどDomain,Data局になるようにしおください。 * 出力は日本語でお願いしたす。 以䞋の点が敎理されるようにSubagentsを蚭蚈したした。これによっおハルシネヌションや考慮挏れを抑えた出力を埗られるようになりたす。 刀断根拠ずなるコヌドをドキュメントの最埌に蚘茉させる ナヌザヌアクションを軞にしおデヌタフロヌを敎理させる 芋萜ずしがちなポむントも確認させる ゚ラヌやロヌディング時の挙動 ログ送信の有無 倖郚ぞ公開しおいるプロパティ画面の状態は䜕か MVVM+UseCaseアヌキテクチャ導入 2぀目の課題で挙げられおいた「Fat」な実装を解消するため、MVVM+UseCaseアヌキテクチャを導入したした。MVVM+UseCaseアヌキテクチャは Android Architecture Components を参考にしたアヌキテクチャであり、以䞋のように圹割を分担させたす。 View / ViewController UIレむアりトや画面遷移 ViewModel むベントハンドリングやViewに最適化したデヌタ敎圢などのプレれンテヌションロゞック UseCase キャッシュ管理などの特定のViewに䟝存しないビゞネスロゞックをカプセルし、原則ずしお状態を持たない Translator DataSourceで取埗したデヌタをUseCaseで扱える型ぞ倉換するこずで、UseCaseにAPI等の知識が入り蟌むこずを防ぐ DataSource デヌタ゜ヌスAPIやUserDefaultsなどぞアクセス ViewModel、UseCase、DataSourceはprotocolで抜象化しDIを可胜にしたした。これにより、UseCase、DataSourceのモックを䜜るこずで、䟝存関係のあるクラスのテストを曞けるようになりたす。 アヌキテクチャ導入によりプレれンテヌションずドメむンが疎結合ずなり、UI局のコヌドの倉曎が容易になったため、SwiftUIぞの移行がスムヌズに行えたした。 結果 取り組みによっお埗られた結果は以䞋の通りです。 デバッグ画面のテストカバレッゞ0→93.5 UI実装をStoryboardからSwiftUIぞ完党移行 開発工数40枛少 デバッグ画面のテストカバレッゞ0→93.5 2぀目の課題で挙げたように既存実装は密結合が原因でテストを曞けたせんでしたが、ViewModel、UseCase、Translatorに察しおナニットテストを曞けるようになりたした。 カバレッゞを蚈枬するずデバッグ画面に関連するテストの平均が93.5でした。残りの6.5はテスト䞍芁なコヌドが察象ずなっおいるため、実質100ずなりたす。 UI実装をStoryboardからSwiftUIぞ完党移行 画面の実装をStoryboardからSwiftUIぞ完党に移行させたした。既存実装ではカスタムコンポヌネントを䜿っおいたした。しかし、これらはOSのアップデヌトに䌎うデザむンシステムの倉曎や仕様倉曎の圱響を受けやすく、その郜床レむアりトの調敎や挙動の修正が必芁になるため、メンテナンスコストが増倧しおいたした。このメンテナンスコストを抑えるため、カスタムコンポヌネントをSwiftUI化に合わせお廃止し、 Apple暙準のコンポヌネントのみ で画面を構成したした。 開発工数40枛少 既存実装に合わせたViewModelのリファクタリングや網矅的なナニットテスト実装など、Claude Codeに実装をサポヌトしおもらいたした。 結果、Claude Code導入前に先茩瀟員ず盞談し芋積もっおいた 工数35日が、Claude Codeを䜿うず20日で完了 したした。玄40の工数削枛ずなりたす。たた、コヌドを曞く時間が枛り蚭蚈や実装方針を考える時間が増えたためClaude Codeなしに比べきれいなコヌドを曞けたした。 MVVM+UseCaseアヌキテクチャ導入を振り返っお 振り返るず、序盀は以䞋のような䞍安を抱えおいたした。 デバッグ画面のキャッチアップに時間がかかりすぎお、他画面のキャッチアップに時間を䜿えないのではないか 既存仕様を確認できおおらずリグレッションを発生させおしたうのではないか 今埌アサむンされるであろう他案件ず折り合いが぀かず䞭途半端に終わらせおしたうのではないか 冒頭でもお話ししたように、これらの䞍安の根本は「広い範囲のキャッチアップをうたく行えない」こずです。原因に序盀で気づき、Claude CodeのSubagentsを䜿ったキャッチアップ方法を暡玢するようになりたした。初めは欲しい情報を埗られずプロンプトを䜕床もチュヌニングしおいたしたが、今では開発に掻きる情報画面の状態やデヌタフロヌなどが埗られるようになっおいたす。このように詊行錯誀しながら䜜り䞊げたSubagentsのおかげでスピヌド感を持っおキャッチアップを進められたした。たた、Subagentsに調査結果をドキュメント化しおもらうこずで、ドキュメント生成のスピヌドも栌段に䞊がりたした。 これらの実瞟をたずめ、2025幎10月には瀟内の党゚ンゞニアを察象ずした技術共有䌚で玹介したした。玹介をきっかけにiOSチヌム以倖の方にも掻動を認知しおもらい、「デバッグ画面を䜿いやすくなっお䜜業が楜になりたした」のようなポゞティブなフィヌドバックを倚くいただきたした。嬉しかったです。 アヌキテクチャ導入を担圓させおくれおサポヌトたでしおくれた䞊長やチヌムメンバヌに感謝でいっぱいです。 最埌に 本蚘事では、新卒1幎目の私がAIを䜿っおデバッグ画面にアヌキテクチャを導入した際の取り組みを玹介したした。珟圚は、その経隓を掻かしお、より難易床の高い別画面ぞの導入を進めおいたす。詊行錯誀の日々ですが、今回䜜成したSubagentsのおかげでコヌドリヌディングの負担は栌段に枛り、開発スピヌドも䞊がったように感じおいたす。本蚘事が、私ず同じくキャッチアップの速床に課題を感じおいる方に届き、開発の生産性向䞊に少しでも貢献できれば幞いです。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com アヌキテクチャの蚭蚈およびレビュヌ䜓制は「 ZOZOTOWN iOSアプリでのFatViewController解消ぞの取り組み 」をご芧ください ↩
.table-of-contents > li > ul > li > ul > li { display: none; } はじめに こんにちは、デヌタシステム郚MA掚薊ブロックの䜐藀 @rayuron です。私たちは、䞻にZOZOTOWNのメヌル配信のパヌ゜ナラむズなど、マヌケティングオヌトメヌションに関するレコメンドシステムを開発・運甚しおいたす。本蚘事では、 GitHub Projects 、 BigQuery 、 Looker Studio を組み合わせお䜜業工数を可芖化し、改善サむクルを回すための仕組みを構築した取り組みに぀いおご玹介したす。 はじめに 背景ず課題 1. ボトルネックの特定に手間がかかり改善に着手しにくい 2. 工数に察する事業䟡倀を把握できおいない 3. AI掻甚の効果枬定ずナレッゞの蓄積ができおいない 解決策 1. GitHub Projectsの運甚敎備 カスタムフィヌルドの䜜成 自動入力の仕組み 2. デヌタ収集の自動化 BigQueryぞのデヌタ保存 GitHub Actionsで日次゚クスポヌト 3. ダッシュボヌドず振り返り䌚の運甚 週次振り返り 斜策完了時の振り返り 半期振り返り 工数入力 効果 課題に察する効果 1. ボトルネックの可芖化ず改善 2. 工数ず事業䟡倀の関連付け 3. AI掻甚の効果枬定ずナレッゞ蓄積 副次的な効果 今埌の展望 フィヌルド入力の自動化 斜策の優先床決めでの掻甚 AI掻甚のさらなる促進 おわりに 背景ず課題 MA掚薊ブロックはこれたでGitHub Projectsでタスクを管理しおきたしたが、担圓者やリポゞトリごずに蚘入フォヌマットが異なり、運甚ルヌルが統䞀されおいたせんでした。そのためGitHub Projectsによる進捗確認はできるものの、工数の集蚈や振り返りなどに掻かせおいたせんでした。具䜓的には以䞋の3぀の課題がありたした。 1. ボトルネックの特定に手間がかかり改善に着手しにくい プロゞェクトを進める䞭で「なんずなく時間がかかった」ずいう感芚はあっおも、どの工皋に工数が倚くかかっおいるのか、予想ず実際の工数の差が倧きい箇所はどこなのかを把握できおいたせんでした。たた、圓時の状況やドキュメントがSlack、Confluence、GitHubに点圚しおおり、ログが散逞しおいたためボトルネックの特定に時間がかかり改善に着手しにくい状況でした。 2. 工数に察する事業䟡倀を把握できおいない プロゞェクトの事業䟡倀や投資察効果を把握するために必芁ずなる、過去のプロゞェクト工数ず事業KPIの倉化を玐付けお蚘録できおいたせんでした。 3. AI掻甚の効果枬定ずナレッゞの蓄積ができおいない あるタスクに察しおどのようなAI掻甚が効果的だったかずいうナレッゞを蓄積・共有する仕組みがありたせんでした。そのため人によっおは効率的にAIを掻甚しおいる䞀方で掻甚が進んでいないメンバヌもおり、チヌム党䜓でのAI掻甚の波及が進んでいない状況でした。 解決策 これらの課題に察しお以䞋の解決策を考えたした。 課題 解決策 1 ボトルネックの特定に手間がかかり改善に着手しにくい 斜策の工数予実を可芖化し振り返るこずでボトルネックを特定し改善する仕組みを䜜る 2 工数に察する事業䟡倀を把握できおいない プロゞェクトごずの工数ず事業KPIの倉化を関連付けお振り返る仕組みを䜜る 3 AI掻甚の効果枬定ずナレッゞの蓄積ができおいない タスクごずにAI掻甚のナレッゞを蓄積・共有する仕組みを䜜る 䞊蚘の解決策を実珟するため、GitHub Projects + BigQuery + Looker Studioを組み合わせた仕組みず、振り返り䌚を導入したした。 1. GitHub Projectsの運甚敎備 たず初めに、タスクに玐づく工数予実などのデヌタを取埗する必芁がありたしたが、これには匕き続きGitHub Projectsを掻甚するこずにしたした。GitHub Projectsではカスタムフィヌルドを掻甚するこずで、タスクに任意のメタデヌタを付䞎できたす。さらにGitHub Actionsずの連携により、様々なオヌトメヌションの構築も容易です。瀟内では既に Findy Team+ が導入されおおり䞻にPRベヌスで定量的な工数集蚈ず可芖化が可胜ですが、PRに玐づかないタスクの工数集蚈や拡匵性の芳点で最終的にGitHub Projectsを遞択したした。 カスタムフィヌルドの䜜成 GitHub Projectsにカスタムフィヌルドを蚭定しIssueに玐付けたす。先述の工数やAI掻甚床合いを蚈枬するため、以䞋のカスタムフィヌルドを甚意したした。 フィヌルド名 皮類 説明 入力 案件 単䞀遞択 どの案件に玐づくタスクかを遞択 必須 䜜業内容 単䞀遞択 どの工皋のタスクかを遞択 必須 予定開始日 日付 タスクの開始予定日 必須 予定完了日 日付 タスクの完了予定日 必須 開始日 日付 タスクの実際の開始日 必須 完了日 日付 タスクの実際の完了日 必須 AI掻甚 単䞀遞択 AI掻甚方法を蚘録 任意 AI削枛時間 数倀 AI掻甚による削枛時間 任意 工数予実を蚘録するために開始予定日ず完了予定日、開始日ず完了日の入力を必須ずしおいたす。たた、䜜業内容ず工数の玐付けを行うため、案件ず䜜業内容の入力も必須ずしたした。さらに、Issueのテンプレヌト機胜を掻甚し、抂芁ず完了条件を必須項目ずしお蚭定し最䜎限のコンテキストがIssueの䞭で敎理されるようにしたした。 自動入力の仕組み 䞊蚘のように倚くのフィヌルドを甚意したこずで手動での運甚負荷が増加したす。これを軜枛するためGitHub Projectsに玐づくステヌタスやIssueに玐づくむベントず GitHub Actions を連携させるこずで解決を図っおいたす。具䜓的には以䞋の自動入力の仕組みを䜜成しおいたす。 Issueをオヌプンした時に、オヌプンした人をassigneeに自動蚭定する Issueのステヌタスを「進行䞭」に倉曎するず「開始日」が自動入力される Issueをクロヌズするず「完了日」が自動入力される Issueのステヌタス倉曎時にin-progress, in-reviewなどのラベルが自動付䞎される Issueに玐づくPRでレビュヌリク゚ストをするずIssueのassigneeずステヌタスが自動曎新される Issueに玐づくPRをApproveするずIssueのassigneeずステヌタスが自動曎新される 䞊蚘に加え、Issue䜜成のための Claude Code の Skills を䜜成しお運甚しおいたす。Skillsでは、 GitHub CLI ずClaude CodeのAskUserQuestion Toolを組み合わせおいたす。Issueの䜜成や線集を遞択匏で行えるため、コンテキストの敎理や運甚負荷の軜枛に぀ながっおいたす。 2. デヌタ収集の自動化 䞊蚘で玹介したGitHub Projectsの情報は GitHub GraphQL API を通しお取埗可胜なため、BigQueryに自動的に保存する仕組みを䜜成したした。 BigQueryぞのデヌタ保存 たず初めにGitHub GraphQL APIを䜿甚しお、GitHub Projectsのデヌタを取埗するスクリプトを䜜成したした。GitHub Projectsから取埗したデヌタは瀟内でよく䜿甚するBigQueryに以䞋のようなカラム構成で保存しおいたす。この時、簡単な集蚈や営業日蚈算もスクリプト内で実装しおいたす。 カラム名 説明 url IssueのURL title Issueのタむトル body Issueの本文 comments Issueのコメント assignees 担圓者 labels Issueのラベル in_review_label_duration_days レビュヌ䞭ラベルが付䞎されおいる日数 in_progress_label_duration_days 進行䞭ラベルが付䞎されおいる日数 review_started_at_jst レビュヌ開始日時 review_ended_at_jst レビュヌ終了日時 progress_started_at_jst 進行開始日時 progress_ended_at_jst 進行終了日時 created_at Issue䜜成日時 closed_at Issueクロヌズ日時 github_project GitHub Project名 status Issueのステヌタス project 案件名 planned_start_date 予定開始日 planned_end_date 予定完了日 actual_start_date 実際の開始日 actual_end_date 実際の完了日 work_type 䜜業内容 ai_success_failure AI掻甚方法を蚘録 ai_hours_reduction AI掻甚による削枛時間 actual_days 実瞟日数 planned_days 予定日数 delay_days 予実差日数 estimation_accuracy 芋積もり粟床実瞟日数/予定日数 project_work_type 案件×䜜業内容の組み合わせ year_month 幎月YYYY-MM圢匏 FYH 䌚蚈幎床ず半期䟋FY24H1 GitHub Actionsで日次゚クスポヌト 次に䞊蚘のスクリプトをGitHub Actionsで日次実行し、BigQueryに゚クスポヌトする仕組みを構築したした。 name : Export GitHub Project to BigQuery on : schedule : - cron : '0 0 * * *' workflow_dispatch : jobs : export-to-bq : runs-on : ubuntu-latest permissions : contents : read id-token : write steps : - uses : actions/checkout@v4 - name : Install uv uses : astral-sh/setup-uv@v4 - name : Generate GitHub App Token id : generate_token uses : actions/create-github-app-token@v2 with : app-id : ${{ secrets.APP_ID }} private-key : ${{ secrets.APP_PRIVATE_KEY }} owner : your-org repositories : | target-repo-1 target-repo-2 - name : Authenticate to Google Cloud uses : google-github-actions/auth@v2 with : workload_identity_provider : ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }} service_account : ${{ secrets.GCP_SERVICE_ACCOUNT }} - name : Set up Cloud SDK uses : google-github-actions/setup-gcloud@v2 - name : Export data to BigQuery env : GH_TOKEN : ${{ steps.generate_token.outputs.token }} GCP_PROJECT_ID : ${{ secrets.GCP_PROJECT_ID }} BQ_DATASET : github_aggregation BQ_TABLE : github_project_items GITHUB_ORG : your-org GITHUB_PROJECT_NUMBER : 123 run : uv run export_github_project_to_bigquery.py 3. ダッシュボヌドず振り返り䌚の運甚 䞊蚘のようにしお収集したデヌタをもずにLooker Studioでダッシュボヌドを䜜成し、以䞋の振り返り䌚で掻甚しおいたす。 振り返り䌚 頻床 ダッシュボヌド 甹途 週次振り返り 毎週20分 WBS、AI掻甚状況 タスク進捗確認、AI掻甚ナレッゞ共有 斜策完了時の振り返り 斜策完了時 振り返り甚 予実差の確認、ボトルネック特定 半期振り返り 半期ごず 半期振り返り甚 プロゞェクト暪断での指暙振り返り 工数入力 月初 工数管理システム入力甚 工数割合の可芖化 以䞋では、各振り返り䌚に぀いお説明したす。 週次振り返り 週次振り返りでは毎週20分のミヌティングで、WBSずAI掻甚状況を確認したす。WBSはGitHub Projectsの予定開始日ず予定完了日フィヌルドずRoadmap viewを掻甚しお䜜成しおいたす。 WBSを確認するこずで、メンバヌ同士がお互いのタスク進捗を把握でき、タスクが遅延しおいる堎合にその理由を知るこずができたす。さらに他メンバヌの補助やタスクの分散を怜蚎するこずで、遅延の早期解消に぀なげおいたす。 次に、AI掻甚状況ダッシュボヌドを芋お、AI掻甚の目暙に察する進捗の確認ずタスクごずのAI掻甚事䟋を共有したす。その週最もAI掻甚が効果的だった事䟋をピックアップし、瀟内のピアボヌナスアプリで衚地する運甚をしおいたす。 斜策完了時の振り返り 斜策が完了した際に、斜策振り返り甚ダッシュボヌドを参照しお振り返りを行いたす。具䜓的には以䞋の指暙を確認したす。 䜜業内容別の予定日数ず実瞟日数の比范 䜜業日数合蚈に察しお各䜜業内容が占める割合 タスク䞀芧ず予実差の確認 予定日数ず実瞟日数の散垃図による芋積もり粟床の確認 ※䞀郚の情報はマスクしおいたす。 䞊蚘のダッシュボヌドを参照しながら、以䞋の芳点で振り返りを行いたす。 項目 説明 斜策の効果 斜策が事業KPIにどれだけ貢献したかを確認 開発工数 予定ず実際の工数のずれを確認しボトルネックずなった工皋を特定 具䜓的な原因の深掘りず次回の改善点を議論 斜策KPT 継続すべき事、問題点、改善案を敎理し、次回斜策に向けたアクションを決定 半期振り返り 半期振り返り甚ダッシュボヌドを䜿甚しお、半期の掻動を振り返りたす。斜策振り返り甚ダッシュボヌドが1案件単䜍での振り返りに特化しおいるのに察し、こちらはプロゞェクト暪断で同様の指暙を振り返りできるようにしおいたす。 䞊蚘のダッシュボヌドを参照しながら、以䞋の芳点で振り返りを行いたす。 項目 説明 案件ずタむムラむン 半期に取り組んだ案件の䞀芧ずスケゞュヌルを振り返る 事業KPI 案件毎の事業KPIの倉化を確認 事業KPI 以倖での貢献 登壇、チヌムの仕組みづくりによる圱響などKPI以倖の䟡倀を評䟡 コスト むンフラコストの倉化を把握 開発生産性 案件や䜜業内容の割合、予定日数ず実瞟日数の差を分析 ブロックのテヌマ チヌムずしお泚力したテヌマを振り返る 半期KPT 継続すべき事、問題点、改善案を敎理し、次期半期に向けたアクションを決定 工数入力 瀟内では工数管理システムぞの工数登録が必芁なため、入力支揎甚のダッシュボヌドを䜜成しおいたす。案件×䜜業内容に぀いおの工数割合を円グラフで可芖化しおいたす。担圓者ず幎月でフィルタリングをするず、各カテゎリの工数割合が䞀目でわかり入力の補助になりたす。 効果 これらの取り組みにより圓初の課題が解決されただけでなく、副次的な効果も埗られたした。 課題に察する効果 1. ボトルネックの可芖化ず改善 斜策振り返り時に、予定ず実際の工数のずれや、工数がかかっおいる箇所が可芖化されるようになりたした。感芚的に捉えおいたボトルネックをデヌタで把握できるようになりたした。振り返り時にはIssueからその時のコンテキストを参照できるので、解像床の高い課題の特定ず正確なネクストアクションの蚭定が可胜です。これたで具䜓的に以䞋のようなアクションを蚭定できたした。 芁件の抜け挏れによる手戻りの発生に察しお、テンプレヌトずなるドキュメントの曎新 実装埌にコストが想定倖ずなり調敎に時間がかかった課題に察しお、コスト詊算フロヌの远加 コヌドが耇雑なので可読性が萜ち理解に時間がかかったり、バグを埋め蟌み手戻りが発生したりするずいう課題に察しお、コヌドの耇雑床を自動蚈枬する仕組みを導入 忘れかけおいたボトルネックを振り返り䌚で再発芋するこずもあり、改善に向けた具䜓的なアクションを蚭定できるようになりたした。 2. 工数ず事業䟡倀の関連付け 斜策振り返り時や半期の評䟡時に、斜策ごずの工数ず事業䟡倀の関連を確認できるようになりたした。特定の案件の工数ずKPIの倉化を玐付けお振り返るこずで、投資察効果の高い斜策を蚘録し説明できるようになりたした。 3. AI掻甚の効果枬定ずナレッゞ蓄積 AI掻甚フィヌルドにより、どのタスクでAIを掻甚したか、どの皋床の工数削枛に぀ながったかを蚘録・可芖化できるようになりたした。IssueあたりのAI掻甚率は2025幎4月の44から12月には73ぞず䞊昇したした。たた、Issueの䜜成単䜍は䜜業内容により異なりたすが、平均的な削枛時間は分析・レポヌティング3.8h、執筆・登壇業務3.7h、モデル開発2.8h、システム開発2.7hの順で倧きい傟向がありたす。 さらに、AI掻甚事䟋がBigQueryに蓄積されおいるため、過去の成功パタヌンを簡単に参照できたす。以䞋は実際に蓄積されたAI掻甚事䟋の䞀郚です。 marimo のドキュメント調査をした。marimoはcurlで CLAUDE.md を取埗可胜で䜓隓がよかった。分析手法の蚈画ずク゚リ䜜成、分析は党おClaude Codeに任せおその埌自分で調敎ず確認をした Claude Codeを䜿ったドキュメントの掚敲をした。目次ず参考資料からドキュメントを生成しおもらいそれを掚敲した。画像はVS CodeのDraw.io Extensionでプレビュヌを確認し぀぀、ロヌカル䞊でClaude Codeに䜜成しおもらいそれを手動調敎した 副次的な効果 圓初の課題以倖でも以䞋のような副次的な効果が埗られたした。 GitHub ProjectsずGoogle SpreadsheetでのWBSの二重管理が解消された SlackでのPRレビュヌ䟝頌がなくなり、必芁のないコミュニケヌションが枛少した 過去のプロゞェクトデヌタにBigQueryを通しおアクセスできるようになり、深掘り分析が容易になった 週1の定䟋でプロゞェクトの遅延を可芖化でき、早期のフォロヌが可胜になった AI掻甚の定量的な目暙蚭定ず振り返りが可胜になった AI掻甚事䟋を他チヌムず共有しやすくなった 瀟内の工数管理システムぞの入力が効率化された 今埌の展望 フィヌルド入力の自動化 Issue䜜成には先述したオヌトメヌションを掻甚しおいるものの、ただ運甚負荷が高いためフィヌルド入力のさらなる自動化を怜蚎しおいたす。たた、AI掻甚事䟋も珟圚は自己申告ベヌスのため、自動化や粟緻な効果枬定の仕組み䜜りを考える必芁がありたす。 斜策の優先床決めでの掻甚 工数ず事業䟡倀の関連付けず蚘録は可胜になりたしたが、それを甚いた将来的な斜策の優先床付けは感芚的な掻甚に留たっおおり十分ではありたせん。今埌は、工数ず事業䟡倀の関連デヌタを掻甚した斜策の優先床決めの仕組み䜜りを進めおいきたいず考えおいたす。 AI掻甚のさらなる促進 たた、Issueに「抂芁・完了条件」を構造化しお蚘茉する運甚により GitHub Copilot やClaude CodeがIssueを読み取っおPRを䜜成するワヌクフロヌずの盞性も良くなっおいたす。今埌はAIによるタスク自動達成ケヌスの分析・評䟡ず仕組み䜜りを進め、AI掻甚のさらなる促進を目指したす。 おわりに 本蚘事では、GitHub Projects、BigQuery、Looker Studioを組み合わせお䜜業工数を可芖化し、改善サむクルを回すための仕組みを構築した取り組みに぀いおご玹介したした。本仕組みにより、ボトルネックの可芖化ず改善、工数ず事業䟡倀の関連付け、AI掻甚の効果枬定ずナレッゞ蓄積が可胜ずなりたした。 ZOZOでは䞀緒にサヌビスを䜜り䞊げおくれる方を募集しおいたす。ご興味がある方は以䞋のリンクからぜひご応募ください corp.zozo.com
.table-of-contents > li > ul > li > ul { display: none } p + ul { margin-top: -10px !important } img[src="https://cdn-ak.f.st-hatena.com/images/fotolife/v/vasilyjp/20260114/20260114193736.png"] { width: 50% } img[src="https://cdn-ak.f.st-hatena.com/images/fotolife/v/vasilyjp/20260114/20260114223243.png"] { width: 40% } img[src="https://cdn-ak.f.st-hatena.com/images/fotolife/v/vasilyjp/20260118/20260118003257.jpg"] { width: 50% } .images-row { width: 100% !important } p.footnote { margin: 0 !important } こんにちは、XR × Fashion TechやXR × Beauty Tech領域の取り組みを掚進しおいる創造開発ブロックの @ikkou です。 2026幎1月6日から9日の4日間にかけおラスベガスで開催された「 CES 2026 」に䞀般参加者ずしお珟地参加したした。個人ずしおは7回目、ZOZO所属ずしおは5回目の参加です。継続参加し、業界動向を定点芳枬しおいたす。 CES 2025 珟地レポヌト: XRずFashion Techの未来を探る CES 2024 参加レポヌト - コロナ犍以前の掻況を取り戻した CES CES 2023 参加レポヌト - 3幎ぶりの珟地参加 CES 2020参加レポヌト: 珟地参加3幎目の目線で芖た #CES2020 前半はCESの抂芁ず関連する情報のアップデヌトを、埌半は特に私が泚目したトピックに぀いおお䌝えしたす。 CES 2026党䜓のトレンドに぀いおは、䌚期䞭に配垃される「CES Daily」デゞタル版の Day 1  Day 2  Day 3 などもあわせおご芧ください。 CES 2026の抂況 CES 2026のメむンテヌマは「Innovators Show Up」 CES 2026の6぀のトレンドず49のカテゎリヌ CES 2026におけるメガトレンド 出展瀟数ず参加者数の掚移 CES 参加バッゞの䟡栌 䌚堎の抂芁 LVCC Campus Venetian Campus その他の䌚堎 䌚堎間の移動 Vegas Loop Zoox 泚目のトピックXR Tech XR関連䌁業の出展動向 出展ブヌスのXRデバむスから芋るトレンド 䞭囜䌁業の倧攻勢 䞭囜系の県鏡型デバむスを䞀手に匕き受けるMeta-Bounds 芋かける機䌚の枛ったHMD型デバむス 日本発䌁業が瀺したXRデバむス向け芁玠技術 Play For Dream Cellid Even Realities Meta 泚目のトピックFashion TechずBeauty Tech Mode Wearablesの「ModeX Bomber Jacket」 デゞタルカラヌチェンゞネむルの「iPolish」 カスタム3Dプリントシュヌズの「Fitasy」 ReFaの「ReFa AI color recipe PRO」 花王の「my Symmetry  THE CORE」 Perfectの「YouCam AI API」 泚目のトピックその他 NVIDIA Samsung Razer Robot, Robot and Robot... おわりに CES 2026の抂況 今幎のCESは「人が戻った」だけでなく、“䌚堎の重心”がLVCC䞭心から呚蟺䌚堎に少し移動したように感じたした。 倧手䌁業の出展の仕方が倉わり、LVCCの景色が去幎ず違う 䞀方で来堎者は増え、移動のボトルネックは盞倉わらない このあず前半で党䜓像、埌半でXR Tech、Fashion Tech、Beauty Tech目線の“刺さった展瀺”をたずめたす。 数幎来の工事が完了しお綺麗に敎備されたLas Vegas Convention Center CES は CTA Consumer Technology Associationが䞻催する、毎幎1月にラスベガスで開催される䞖界最倧玚のテックむベントです。公匏サむトでは「 The Most Powerful Tech Event in the World 」ず衚珟されおいたす。「セス」ず呌ぶ方もいたすが、正しくは「 シヌむヌ゚ス 」です。CESはか぀お『Consumer Electronics Show』ず呌ばれおいたしたが、珟圚この衚蚘は䜿甚されおいたせん。珟圚は「Consumer Electronics Show」の衚蚘は前面に出されず、CESずしおブランド化されおいたす。 CES 2026のメむンテヌマは「Innovators Show Up」 メむンテヌマが掲げられおいるVenetian 2Fのサむネヌゞ CES 2024の「All ON」、CES 2025の「DIVE IN」に続くCES 2026のメむンテヌマは「 Innovators Show Up 」でした。 *1 "CES is where innovators show up, business accelerates, partnerships ignite, and technology transforms real-world challenges into bold opportunities" CTA CEOのGary Shapiro氏は䞊蚘のように、CESはむノベヌタヌが集う堎であるこずを匷調しおいたす。 CES 2026の6぀のトレンドず49のカテゎリヌ CESには毎幎CTAの打ち出すトレンドがあり、2026幎のトップトレンドずしお、次の6぀が挙げられおいたす。 *2 AI Digital Health Energy Enterprise Mobility Robotics 「AI」「Digital Health」「Mobility」は昚幎に匕き続きトップトレンドずしお挙げられおいたす。䞀方、昚幎のトップトレンドであった「Energy Transition」「Quantum」「Sustainability」は倖れ、新たに「Energy」ず「Enterprise」が加わりたした。 トップトレンドずは別に、次に挙げる49の技術領域が公匏カテゎリヌずしお蚭定されおいたす。 Accessibility, Accessories, Additive Manufacturing & 3D Printing, AgTech, Artificial Intelligence, Audio, Beauty Tech , Biotech, Blockchain & Digital Assets, Cloud Computing, Computing, Construction & Industrial Tech, Content & Entertainment, Cybersecurity, Digital Health, Drones, Education Tech, Energy Transition, Enterprise, Fashion Tech , Fintech, Fitness , Food Tech, Gaming & Esports , Home Entertainment & Office Hardware, Imaging, Investment & Venture Capital, IoT/Sensors, Lifestyle, Longevity, Marketing & Advertising, Next G, Pet & Animal Tech, Quantum, Retail/E-Commerce , Robotics, Smart Communities, Smart Home & Appliances, Sourcing & Manufacturing, Space Tech, Sports, Startups, Streaming, Supply & Logistics, Sustainability, Travel & Tourism, Vehicle Tech & Advanced Mobility, Video & Display, XR & Spatial Computing 私が特に泚目しおいるカテゎリヌは倪字で瀺しおいたす。CES 2025では「AR/VR/XR」がカテゎリヌずしお蚭けられおいたしたが、今幎は「 XR & Spatial Computing 」ず名称が倉曎されたした。同様にいく぀かのカテゎリヌ名が倉曎された䞀方で、「Cryptocurrency」「Metaverse」「NFT」などは倖れおいたすそれらのカテゎリヌの出展が完党になくなったわけではありたせん。 CES 2026におけるメガトレンド 先に発衚された6぀のトップトレンドずは別に、CTAはトレンド予枬セッション「 Trends to Watch 」で2026幎のメガトレンドずしお次の3぀を挙げたした。 Intelligent Transformation Longevity Engineering Tomorrow なかでも「 Longevity ロンゞェビティ」、぀たり「長寿、健康」に関するAgeTech、LongevityセクタヌはCES 2026の䌚堎内でも倚く芋かけたした。健康寿呜を延ばすこずに関心が高たっおいるこずを瀺しおいたす。 このセッションはメディア向けセッションのため珟地では聎講しおいたせんが、 アヌカむブ動画 ず PDF資料 が公開されおいたす。CTAの謳うテックトレンドに少しでも興味がある方は、䞀床は目を通すこずをおすすめしたす。 出展瀟数ず参加者数の掚移 出展瀟数は過去最高タむだったCES 2025の4,500瀟以䞊から4,100瀟以䞊に枛少したしたが、参加者数はコロナ犍以降では過去最高の148,000人以䞊ずなりたした。2018〜2026幎の出展瀟数ず参加者数の掚移は以䞋の通りです。 幎床 出展瀟数 参加者数 CES 2018 3,900瀟以䞊 182,198人 *3 CES 2019 4,500瀟以䞊 175,212人 *4 CES 2020 箄4,500瀟 171,268人 *5 CES 2021 箄2,000瀟 箄80,000人 CES 2022 2,300瀟以䞊 44,000人以䞊 CES 2023 3,200瀟以䞊 117,841人 *6 CES 2024 4,300瀟以䞊 138,789人 *7 CES 2025 4,500瀟以䞊 142,465人 *8 CES 2026 4,100瀟以䞊 148,000人以䞊 CESの参加者数は各幎のATTENDANCE AUDIT SUMMARYに1桁単䜍で粟密な数字が公衚されおいたすコロナ犍の圱響で完党オンラむン化された2021幎ずハむブリッドで開催された2022幎は公匏発衚なし。これは参加バッゞの発行数をもずにした、重耇なしの参加者数です。CES 2026の正確な参加者数は埌日公開される芋蟌みです。 CES 参加バッゞの䟡栌 CESぞの参加には参加登録が必芁です。メディアやむンフル゚ンサヌではない䞀般参加者は有償で参加バッゞを埗られたす。 参加バッゞは玛倱時に350 USDの手数料がかかるので芁泚意 CES 2026の参加登録は昚幎同様9月11日に開始され、通垞のチケットであるExhibits Plus Passの䟡栌は同12月1日たでの早期登録が149 USD、以降は350 USDでした。私は昚幎に続き過去回の参加者特兞により無料でした。 参加バッゞは空枯で受け取るずスムヌズ 過去に䞀床だけCES公匏のセッションを聎講するためのカンファレンスプログラミングパスを远加したしたが、以䞋の芳点から今幎も远加せずにブヌスのみを巡りたした。 カンファレンスに参加するずブヌスを巡るための時間を削枛せざるを埗ない 倚くのセッション動画は埌日アヌカむブ動画ずしお無償で公開される セッション以倖の動画も含たれおいたすが、実際に CES 2026関連の公匏アヌカむブ動画は500本以䞊が公開 されおいたす。 䌚堎の抂芁 Image source: https://www.ces.tech/explore-ces/maps-and-locations/ CESの展瀺䌚堎は昚幎同様、 LVCC Campus ・ Venetian Campus ・ C Space Campus の3぀で構成されおいたす。 LVCC Campus 倧きく様倉わりしたLVCC Centralの内郚 LVCC CampusはLVCCこずLas Vegas Convention and World Trade CenterのWest Hall・North Hall・Central Hall・South Hallを䞭心に構成されおいお、CESのメむン䌚堎ずも蚀えたす。特にCentral Hallは倧芏暡工事を経お倖芳・内芳が倧きく倉わりたした。CES 2025以前の参加者はその倉化に驚いたはずです。 GoogleはCVSやSphereでGeminiやAndroid XRをアピヌルしおいた 今幎は、CESの初回ずなる1967幎から58幎間連続で出展しおきたSonyをはじめずしお、Google、Samsungなどの倧手䌁業がLVCCでの出展を取り止めおいたす。もっずもSonyはSony Honda Mobilityずしおブヌスを構え、販売を控えるAFEELAを倧々的にアピヌルしおいたした。参加バッゞのストラップもSonyではなくSony Honda Mobilityでした。たた、Googleは䌚堎倖でGeminiやAndroid XRをアピヌルし、SamsungはWynnに独自のブヌスを構えおいたした。 昚幎に続きWestgateは䌚堎ずしお利甚されず、 CES Foundry や埌述するNVIDIA Live、NVIDIA Showcaseの䌚堎ずしお、2023幎12月にオヌプンしたラスベガスで最高局の Fontainebleau Las Vegas が远加されたした。 Venetian Campus Venetian Expoの2Fから1Fを俯瞰する Venetian ExpoはCESの1か月前に開催されるAWS re:Inventでもお銎染みのVenetianを䌚堎ずしお、スタヌトアップ䌁業の集たるEureka Parkが蚭けられおいたす。 Eureka Parkで勢いを増しおいるKorean Tech Image source: https://exhibitors.ces.tech/8_0/floorplan/?st=country&hallID=M&sv=South%20Korea このEureka Parkには、スタヌトアップ䌁業による個別のブヌスずは別に、特定の囜が1カテゎリヌずしお集たっおいるずいう特城がありたす。これたではフランス発のLa French Techが非垞に目立っおいたしたが、近幎は韓囜発のKorean Techが勢いを増しおいたす。 JETROが支揎するJapan Pavilionずクリ゚むティノ・ノィゞョンが掚進するJAPAN TECH 日本発ずしおはJETROが支揎する「 Japan Pavilion 」から31瀟、クリ゚むティノ・ノィゞョンが掚進する「 JAPAN TECH 」から37瀟がEureka Parkにブヌスを構えおいたした。 その他の䌚堎 C Space Campusは䞻にマヌケタヌ向けの䌚堎で、CESの出展瀟や参加者がビゞネスミヌティングするためのスペヌスが提䟛されおいたす。 その他、前述の通りSamsungやMetaはCESのプログラムずは別に、Wynnに独自の䌚堎を蚭けおいたした。ホテルの䞀宀を利甚しおプラむベヌトミヌティングの堎を蚭ける䌁業もよく芋聞きしたす。 䞀般の来堎者向けの䌚期は4日間ありたすが、1人ですべおの䌚堎・すべおのブヌスを巡るのは非珟実的です。私は今回、到着日をDay 0ずしお、Day 3たで滞圚し、以䞋の行皋で䌚堎を巡りたした。 Day 0NVIDIA Live Day 1LVCC Campus Day 2Venetian Campus Day 3呚りきれなかったLVCC CampusずVenetian Campus 䌚期䞭はずにかく歩き回りたした。歩きやすい履き慣れた靎の準備が欠かせたせん。今幎はOnのスニヌカヌを履いお臚みたした。事前に蚪れるブヌスを決めおルヌトを最適化しお効率的に巡っおいるずはいえ、4日間の平均歩数は昚幎同様に毎日20,000歩を超えおいたした。 䌚堎間の移動 䌚堎間の移動には時間がかかりたす。䟋幎同様、䌚堎間の移動には埒歩ずVegas Loop、そしおラむドシェアを利甚したした。埒歩ずラむドシェアに぀いおの特筆すべきアップデヌトはありたせん。LVCCずVenetianの移動に䜿えるラスベガスモノレヌルや2階建おバスのDEUCEデュヌス、通垞のタクシヌも遞択肢ずしお挙げられたすが、私はこれらを利甚したせんでした。 日䞭は非垞に混雑しお䌚堎間の移動には䜿えたせんでしたが、Amazonの子䌚瀟であるZooxが2025幎9月からラスベガス垂内で提䟛しおいる自動運転車による特定スポット間の移動も利甚できたした。 Vegas Loop LVCC Central Underground Station 開通以降、毎回お䞖話になっおいる Vegas Loop ですが、今幎も䜕床か利甚したした。Vegas Loopはむヌロン・マスク氏率いるThe Boring Companyが運営するLVCCの䌚堎間を繋ぐ地䞋トンネルです。埒歩ではそれなりに時間のかかるルヌトを、Teslaで効率よく結ぶ亀通システムです。 Vegas Loop Map Station Map2026幎1月20日珟圚 Image source: https://www.lvcva.com/vegas-loop/ CES参加者向けの路線は、LVCCのWest Hall・Central Hall・South Hall間を結ぶ無償ラむンず、LVCCからホテルを結ぶ有償ラむンがありたす。この有償ラむンは、昚幎のCES 2025時点では RESORTS WORLD線 しかありたせんでしたが、CES 2025閉幕盎埌の2025幎1月18日に WESTGATE RESORT線 が開通、そしお2025幎4月8日に Encore線 が開通したした。 運良く乗車できたVegas Loopを走るCybertruck 今回はLVCCからWynnぞの移動時に䞀床だけ有償のEncore線に乗車したした。Vegas Loopを走っおいる車䞡はTesla Model S、3、X、そしおYの4皮類ですが、時々Cybertruckが走っおいる姿を芋かけおいたした。この機䌚に運良く乗車できれば、ず考えおいたずころ、芋事このEncore線でCybertruckに偶然にも乗車できたした。 Vegas Loopのチケット賌入ペヌゞ Image source: https://lvloop.com/tickets このVegas LoopはLVCC呚蟺だけではなく、将来的にはラスベガスの倧通りを行き亀うルヌトが蚈画されおいたす。CES 2026の期間䞭も10:00から21:00たでの時間限定ではあるものの、Resorts World Stationからハリヌ・リヌド囜際空枯ぞ向かう空枯線が運行しおいたした。今回は郜合が合わず乗車できたせんでしたが、片道12 USDずラむドシェアよりも安䟡なので、次回ラスベガス入りする際には詊しおみたいずころです。 Zoox ZooxのカりンタヌがあるResorts Worldの゚ントランス前乗り堎 It’s not a car. を暙抜する Zoox はラスベガスに登堎した新しい「ロボタクシヌ」です。2020幎にAmazonが買収し、珟圚は独立子䌚瀟ずしお運営されおいお、システムのバック゚ンドには AWSEC2, S3, EKS, CloudWatchが䜿われおいたす 。 2026幎1月珟圚は、誰でも無料乗車できる圢でラスベガスを、りェむトリストに登録する圢でサンフランシスコをテスト走行しおいたす。 AWS re:Invent期間䞭も倚くの方が乗車レポヌトを投皿しおいたしたが、CES 2026でも倚くの方が乗車しおいたした。今埌はSXSWの開催地であるオヌスティン、そしおマむアミぞの展開が 蚈画されおいたす 。 ラスベガスのZoox走行゚リア2026幎1月20日珟圚 Image source: Zoox Android App CES参加者の目線では、Vegas Loopが䞻にLVCCの䌚堎間を繋いでいる䞀方で、Zooxはラスベガス垂街のホテルやショッピングモヌルなどの斜蚭を繋いでいたす。ホテルからAREA15やTopgolf間の移動にも䜿えるので、垂内芳光の䞀環ずしおも䟿利かもしれたせん。 Resorts WorldのZooxカりンタヌ 私はVegas Loop StationもあるResorts WorldからZooxに乗りたした。 Zooxは2025幎5月にResorts Worldの公匏ロボタクシヌパヌトナヌになっおいお 、゚ントランスには有人のZooxカりンタヌが蚭けられおいたす蚘念撮圱しおもらえたす。 アプリで無人車䞡のドアを開ける盎前の様子 Zooxの車䞡は完党に無人です。車䞡の予玄はもちろん、ドアの開閉もすべおZooxアプリ経由で行いたす。このZooxアプリのむンストヌルにはUSのアプリストアアカりントが必芁です。JPリヌゞョンのアプリストアアカりントではむンストヌルできないので、Zooxに乗りたい堎合は事前にアカりントの䜜成が必芁ですもっずも開発者に属する倚くの方は怜蚌甚途などで持っおいるずは思いたすが。 目的地に到着埌、誰も乗せずに走り去っおいくZoox 運転垭もない自動運転車ぞの乗車は初めおの䜓隓でしたが、特段の違和感を芚えるこずもなく、目的地たでスムヌズに到着したした。時期的に予玄が集䞭しおいたため、私の利甚時は30分以䞊埅機したした。そのため日䞭の移動手段ずしおは䜿いづらい堎面もありたすが、今埌、車䞡台数や運甚が拡充されれば、利䟿性はさらに向䞊するず考えられたす。前述の通りMobilityはCES 2026のトップトレンドの1぀です。特にラスベガスで開催されるテックむベントであるGoogle Cloud Next、re:Invent、そしおCESの参加者はぜひ乗車しおみおください。 泚目のトピックXR Tech CESのカテゎリヌのひず぀に「 XR & Spatial Computing 」が蚭けられおいたす。これは私が匷い関心をもっお継続的に远っおいる技術領域です。このパヌトでは、それらをXR Techずしおたずめおお䌝えしたす。 XR関連䌁業の出展動向 CES 2026党䜓を通しお「 XR & Spatial Computing 」カテゎリヌの出展瀟数は 265 でした。CES 2025では「 AR/VR/XR 」カテゎリヌの出展瀟数は 355 だったので、 昚幎察比で90ブヌス枛った こずになりたす。 LVCC Central Hallの䌚堎地図 Image source: https://exhibitors.ces.tech/8_0/floorplan/?st=category&hallID=B 昚幎同様、CES 2026では、LVCC Central Hallに「 GAMING | XR 」ずしお分類された䞀画が蚭けられおいたした。 LVCC Central Hall内「GAMING | XR」゚リアの䌚堎地図 Image source: https://exhibitors.ces.tech/8_0/floorplan/?st=category&hallID=B このLVCC Centralの「GAMING | XR」゚リアにブヌスを構える「 XR & Spatial Computing 」カテゎリヌの出展瀟数は 32 でした。この゚リアは䟋幎通り、Insta360、XREAL、Pimax Technologyなどの䞭囜䌁業が目立っおいたした。 たた、CES 2024たではXR関連゚リアの蚭けられおいたスタヌトアップ䌁業が集たるVenetian CampusのEureka Parkですが、今幎もそういった゚リアは芋圓たりたせんでした。 CESでは毎幎、デザむンや゚ンゞニアリングにおいお優れた補品を衚地する CES Innovation Awards を実斜しおいたす。XR関連の補品は XR & Spatial Computing ずしお分類され、蚈 12 補品が受賞したした。いわゆるHMD型・県鏡型のXRデバむスは次の 5 補品です。 CES Innovation Awardsの䌚堎ずQualcommのブヌスに展瀺されおいたGalaxy XR Galaxy XR Vuzix Ultralite Pro Enterprise Platform World's Lightest Full-Feature Colorful AR+AI Glasses World's Lightest Stylish AR Glasses XREAL Project Aura 奇しくも Android XR のHMD型デバむスである「 Galaxy XR 」ず県鏡型デバむスである「 XREAL Project Aura 」の䞡方が受賞しおいたした。しかし、いずれもデモずしお詊せる状態になっおいる動態展瀺はありたせんでした。 出展ブヌスのXRデバむスから芋るトレンド CES 2026で䜓隓したXRデバむスHMD型・県鏡型の䞀郚 䟋幎通り、CES 2026でもたくさんのXRデバむスを詊しおきたした。この写真はHMD型・県鏡型のXRデバむスの䞀郚です。 䜓感ずしお CES 2024 では、ただHMD型のバリ゚ヌションを感じられたしたが、 CES 2025 では、HMD型デバむスを抑えお䞀気に県鏡型デバむスが増えたした。そしお今幎のCES 2026ではさらにその傟向が匷たり、ずにかくたくさんの、それこそ食傷気味になるくらい倚くの県鏡型デバむスを芋かけたした。 この背景ずしお以䞋の芁因が考えられたす。 䞖はたさに“倧AI時代”であるこず 県鏡型デバむスの先駆者である「XREAL」の成功 さらに埌発にあたるMeta発の県鏡型デバむス「Ray-Ban Meta」の倧成功 䞭囜䌁業の倧攻勢 私自身は展瀺されおいた県鏡型デバむスのすべおを数えたわけではありたせんが、 英銙枯玙SCMPのレポヌト によるず、県鏡系デバむスは玄60瀟あり倧半を䞭囜ブランドが占めおいたそうです。たた、 䞭囜メディア我爱音频のレポヌト 曰くAI機胜を持぀䞻芁な県鏡型デバむスは36皮あり、 䞭囜メディア智䞜西のレポヌト 曰く27瀟の䞭囜䌁業が「AIスマヌトグラス、VR、AR」補品を展瀺しおいたそうです。 䞭囜は、囜家戊略ずしお6,000元2026幎1月20日珟圚で玄13.6䞇円以内のスマヌトグラスを察象に䟡栌の15、500元同玄1.1䞇円を䞊限に 買い替え補助金の支絊を公垃 し、2026幎1月1日から斜行したず報じられおいたす。今埌、デバむスの「生産」に加えお䞀般消費者による「賌入」もいっそう加速するこずが予枬されたす。 䞭囜系の県鏡型デバむスを䞀手に匕き受けるMeta-Bounds 䞭囜系の県鏡型デバむスを䞀手に匕き受けるMeta-Bounds EssilorLuxottica がRay-BanやOakleyをはじめずする 非垞に倚くのアむりェアブランド の県鏡型デバむスを匕き受ける䞀方で、「oppo」「ZTE」「ThinkAR」「Lenovo」をはじめずする䞭囜系デバむスの倚くを Meta-Bounds莫界科技 が匕き受けおいたす。この Meta-Boundsのブランド名がMojie であり、CES Innovation Awardsで2補品がノミネヌトされおいたす。 芋かける機䌚の枛ったHMD型デバむス 県鏡型デバむスが増え続ける䞀方で、HMD型の新䜜はあたり芋かけたせんでした。既存デバむスを生かした展瀺ずいう芳点でも、前述の通りGalaxy XRの動態展瀺はなく、Apple Vision Proも“野良展瀺”を1件芋かけただけでした。たた、CES 2025で匷く打ち出しおいたSonyのXYN Headsetは協業しおいるSiemensのブヌスで芋かけた皋床でした。もちろん芋逃しおいるブヌスもあるかもしれたせんが、党䜓的にHMD型デバむスの存圚感は薄れおいる印象を受けたした。 HMD型デバむスを打ち出し続けおいるShiftallずPimaxのブヌス しかし、昚幎から継続しおLVCC Centralで出展しおいるShiftallの「 MeganeX 8K Mark II 」や、䟋幎通り存圚感を攟っおいたPimaxなど、HMD型デバむスを党く芋なくなったわけではありたせん。たた、埌述したすが、今幎はPlay For Dream瀟から“䌏兵”も発衚されおいたす。 日本発䌁業が瀺したXRデバむス向け芁玠技術 県鏡型デバむスではEssilorLuxotticaずMeta-Boundsの二匷ずも蚀えたすが、耇数の日本発䌁業からXR関連デバむスに生かされる新しい芁玠技術が発衚されおいたす。 www.youtube.com 䟋えばガラスで有名なAGCは、高屈折率ガラス基板など、次䞖代デバむスに必芁な芁玠を兌ね備えた耇数の芁玠技術を発衚したした。今埌、これらの技術はXRグラスメヌカヌに技術䟛䞎されそうです。 www.youtube.com たた、TDKはHapticセンサヌやMeta-Optic Mirrorによる網膜投圱技術を搭茉したスマヌトグラスの゜リュヌション「 TDK AIsight 」を発衚したした。他にも、アルプスアルパむンは觊芚・嗅芚・聎芚を刺激する新しい五感刺激を発衚するなど、技術立囜ずしお日本も存圚感を芋せおいたした。 XR Techのトレンドに匕き続き、個人的に興味を惹かれたブヌスをいく぀か玹介したす。 Play For Dream Play For DreamのMR R&Dプロトタむプ Image source: Play For Dream Unveils MR Prototype at CES 2026 Apple Vision Proラむクな補品で話題になったPlay For Dreamは、“事前発衚なし”でMRのR&Dプロトタむプを発衚したした。 G-X100-M1のリファレンスデザむン Image source: 䞇有匕力宁波科技有限公叞 これは2025幎12月に公開された GravityXR䞇有匕力 の G-X100 を搭茉した G-X100-M1のリファレンスデザむン を採甚したものず思われるデバむスです。珟時点ではただプロトタむプなのでこのたたリリヌスされるずは限りたせんが、リファレンスデザむン通りなら重量は93gで遅延はわずか9msずいう非垞に軜量か぀䜎遅延なデバむスです。 Cellid 過去最倧玚のブヌスを出展しおいたCellid ARグラス甚ディスプレむを開発するCellidは、次䞖代ARグラス「 HJ1 AI Smart Glasses 」を展瀺しおいたした。このデバむスは、Foxconn × Cellidによる取り組みで、Cellidはレンズ郚のりェむブガむドを担圓したした。そしおJorjin TechnologiesFoxconnはグラス本䜓を、GISFoxconnは粟密光孊ず衚瀺関連を担圓したそうです。 グラスを各パヌツに分解した状態の展瀺 Cellidの特長のひず぀である最倧2000nitsの高茝床衚瀺は矎しく、玄46gの軜量サむズでありながらEye Trackingモゞュヌルを内蔵するなど、非垞に期埅できる県鏡型デバむスです。 CellidはこれたでLVCC CentralではなくNorthに小芏暡なブヌスを構えおいたしたが、今幎は同じNorthではあるものの壁際に過去最倧玚のブヌスを構えおいたした。グラスの衚瀺郚に関わる芁玠技術においお突出しおいる日本発䌁業であり、ここ数幎の倉化を芋おきおいるだけに、個人的にも嬉しい気持ちになりたした。 Even Realities Even Realities Even G1が日本で局所的な盛り䞊がりを芋せた埌、2025幎11月に埌継機ずなる Even G2 を発売した Even Realities は満を持しおCentral Hallに倧きく掗緎されたブヌスを構えおいたした。 The Even Realities booth at #CES2026 in a flash. Where to find us: Booth #16833, Central Hall. January 6–9. pic.twitter.com/Q70D1fRTvq — Even Realities (@EvenRealities) 2026幎1月8日 Even RealitiesはXREALに代衚されるような拡匵ディスプレむの類いではなく、必芁な情報を重畳するこずを目的ずしたスマヌトグラスです。カメラが぀いおいないのでプラむバシヌの問題が起きず、䜕よりこのゞャンルでは数少ない囜内利甚に必芁な「技適」取埗枈みで、安心しお䜿える点も魅力です。 圓時のOculus Riftがそうであったように、XR関連デバむスにおいお日本は重芁な垂堎のひず぀ず蚀えたす。 Mogura VR Newsのむンタビュヌ蚘事 によれば、実際にEven G2は日本の店舗がもっずも売れおいるそうです。今埌の展開が非垞に気になる、そしおいわゆるキャズムを越える可胜性のあるデバむスのひず぀だず考えおいたす。 Meta Metaはプラむベヌトブヌスの他に2か所のMeta Labを掚しおいた MetaはWynn内に商談を目的ずしたプラむベヌトブヌスを構えおいたした。私はこのプラむベヌトには行きたせんでしたが、Metaの旗艊店であるMeta Labに行きたした。 Wynn Plaza Shopsに店舗を構えるMetaの旗艊店Meta Lab Las Vegas Metaは2025幎10月に垞蚭の Meta Lab Las Vegas を Wynn Plaza Shopsにオヌプンしたした 。Meta LabではMeta AIグラスのRay-Ban MetaやMeta Ray-Ban Displayを賌入できたす。いずれも日本囜内ではただ賌入できない県鏡型デバむスです。 Meta Labで調達したMeta Ray-Ban Display技適特䟋申請枈み Meta Lab Las Vegasの存圚は事前に把握しおいたので、あらかじめ予玄した䞊で珟地に赎き、その堎で Meta Ray-Ban Display を賌入したした。このMeta Ray-Ban Displayは特に人気のデバむスで、生産数が限られおいるため予玄なしでは賌入できたせん。 CES初日、この Meta Ray-Ban Displayに倧きなアップデヌトが入り 、テレプロンプタヌやEMGリストバンドによる手曞き入力など耇数の機胜が远加されたした。 EMGリストバンドで自動車のナビを操䜜する Image source: Garmin Newsroom LVCC West HallのGarminブヌスでは、 EMGリストバンドを自動車のナビ操䜜などに掻甚する実践的なPoC が玹介されおいたした。 Wynn内にオヌプンしおいた特蚭のMeta Lab たた、 Encore Esplanade のAwakening theater付近にもうひず぀のMeta Labを構えおいたした。こちらの店舗は予玄の仕組みがなく、䞊んだ順の入店ずなっおいたした。 泚目のトピックFashion TechずBeauty Tech CES 2025に続き、CES 2026でも「 Fashion Tech 」ず「 Beauty Tech 」のカテゎリヌが蚭けられおいたした。たた、同様にCES Innovation Awardsのカテゎリヌずしおも蚭けられおいたした。 CES 2026で「 Fashion Tech 」カテゎリヌずしお登録されおいるブヌス数は 111 、「 Beauty Tech 」カテゎリヌずしお登録されおいるブヌス数は 121 でした。 CES Innovation Awardsで 2026 Honoree in Fashion Tech を受賞したのは次の7補品でした。 fēnix® 8 Pro - MicroLED Galaxy Watch8 Littlebird Safety Tracker ModeX Bomber Jacket Snapdragon W5+ Gen 2/W5 Gen 2 Wearable Platforms VRING:ON, From Sketch to Factory, in One Flow WE-STIM™ CalfSleeve: Advanced muscle anti-aging device 同様に2026 Honoree in Beauty Techを受賞したのは次の10補品でした。うち4補品は L'Oréal Groupe で、業界随䞀の匷さを感じたした。 BALANCE AI Rejuvenation Shower System Hyper Rejuvenating Eye Patch Light Straight MASTER AI Multi-Therapy Pod maXpace Renergie Nano-Resurfacer | 400 Booster SCAR: AI-Powered Precision Scar Treatment and Coverage System Device SkinBoosters Jet Skinsight Water Saver Dose 個人的に興味を惹かれたブヌスをいく぀か玹介したす。 Mode Wearablesの「ModeX Bomber Jacket」 Mode Wearablesの「ModeX Bomber Jacket」 「 ModeX Bomber Jacket 」は、2026 Honoree in Fashion Techを受賞したモゞュラヌ匏スマヌトりェアです。スマヌトりェアず蚀えば、䟋えば2019幎にLevi'sが発売した「 Levi’s Trucker Jacket with Jacquard by Google 」が思い浮かぶかもしれたせん。これはスマヌトフォンの拡匵デバむスに近い立ち䜍眮でしたが、ModeX Bomber Jacketは珟代の利甚シヌンに即した機胜を備えおいたす。 *9 Wearable charging, energy harvesting, and power transfer solutions. Programmable illumination for signaling and fashion applications. Haptic feedback systems for improved situational awareness. Spatial computing products leveraging on-device AI. 県鏡型デバむスが䞀般瀟䌚に普及した先には、特に消費電力の課題が考えられるので、こういったスマヌトりェアが必芁になる未来が想像できたす。 デゞタルカラヌチェンゞネむルの「iPolish」 デゞタルカラヌチェンゞネむルの「iPolish」 Eureka Parkにブヌスを構えおいたフロリダ発の「 iPolish 」は、ネむルチップを含む専甚のデバむスずアプリを䜿い、わずか5秒で400色以䞊のカラヌを切り替えられる デゞタルネむル です。癟聞は䞀芋に劂かず、たずはX公匏アカりントの動画を芋おください。 When it's hard to choose, choose iPolish! Pre-orders available now at https://t.co/DogxQcrORr . #iPolish #ces2026 pic.twitter.com/hAWLOQcaaP — iPolish® (@iPolish_inc) 2026幎1月11日 これは映画「トヌタル・リコヌル」を想起させる䜓隓で、印象に残りたした聞いたこずがない方は「トヌタル・リコヌル ネむル」で怜玢しおみおください。原理ずしおはネむルチップに電気泳動フィルムelectrophoretic filmが貌り付けられおいたす。いわゆるE Inkず䌌たような仕組みなので、色の倉わり方に芋芚えがある方もいるのではないでしょうか。 デゞタルデバむスずいう制玄があるため、䟋えばネむルチップのサむズを個々人に最適化するのは難しいずいった課題があるず思われたすが、かなり興味を惹かれたデバむスでした。 公匏サむト では2026幎6月発送予定で95 USDのプレオヌダヌで受け付けおいたすが、残念ながら発送先に日本は含たれおいたせんでした。 カスタム3Dプリントシュヌズの「Fitasy」 カスタム3Dプリントシュヌズの「Fitasy」 Image source: Fitasy Unveils Breakthrough Technology Making Custom-Fit 3D Printed Shoes More Accessible and Affordable, Supporting Better Foot Health 「 Fitasy 」は3Dプリンタヌで制䜜するシュヌズです。3Dプリンタヌ×シュヌズの組み合わせは、䟋えば「 STARAY 」をはじめずしお既に補品化されおいるものも倚く、新芏性は感じられない方が倚いかもしれたせん。このFitasyはスマヌトフォンアプリでスキャンした足底面ず偎面にAIを組み合わせお正確な3Dモデルを䜜成し、そのデヌタに基づき、個々人に最適化したシュヌズを印刷する゜リュヌションです。スマヌトフォンアプリで蚈枬するずいう芳点は「 ZOZOMAT 」に通じるものがあり、非垞に興味を唆られたした。 ラスベガスのメディア「FOX5 Vegas」にFitasyのCEOのむンタビュヌ動画が公開されおいたす。スキャンの様子も少し映っおいるので、興味のある方はぜひ芋おください。2026幎春に発送予定で210 USDのプレオヌダヌを受付䞭です。 www.fox5vegas.com ReFaの「ReFa AI color recipe PRO」 CES初出展ずなったReFaのMTG瀟 ここ数幎、矎容系の囜内䌁業がCESに初出展を果たしおいたすが、今幎は矎容機噚のReFaを展開するMTG瀟がCESに初出展しおいたした。ブヌスではよく芋かけるReFaの補品矀ではなく矎容垫向けのアプリ「 ReFa AI color recipe PRO 」を展瀺しおいたした。 矎容垫向けの「ReFa AI color recipe PRO」 このアプリは「 ハむトヌンカラヌの技術を、AIテクノロゞヌで再珟するプロフェッショナル向け次䞖代ヘアカラヌAI゜リュヌション 」 *10 ずのこずで、ブリヌチやカラヌを日垞的に行う掟手髪クラスタずしおも、特に関心を惹かれる補品でした。 花王の「my Symmetry  THE CORE」 花王のコンディショニング・ラむフケアブランド「花王ラむフケア研究所」によるTHE CORE 花王が2025幎10月に立ち䞊げたコンディショニング・ラむフケアブランド「花王ラむフケア研究所」はJAPAN TECHブヌスのひず぀ずしおブヌスを出展しおいたした。このブヌスでは、“8歩あるくだけで身䜓のゆがみを枬定できる”アプリケヌションの「 my Symmetry 」ず、枬定結果に応じお着甚時のゆがみを補正するためのむン゜ヌル「 THE CORE 」を展瀺しおいたした。 カテゎリヌずしおはHealth Techの方が盞応しいかもしれたせんが、身䜓の歪みを補正する゜リュヌションはBeauty Techにも通じるものがあるず考えおいたす。ちなみに私の総合スコアは32点でした。しばらくこのアプリを利甚しおみたす。 Perfectの「YouCam AI API」 Perfectの「YouCam AI API」 ZOZOは2022幎4月から「 ZOZOCOSME 」でARメむクを提䟛しおいたす。このARメむクにパヌフェクト瀟が提䟛する゜リュヌションを利甚しおいたす。そのパヌフェクト瀟はCES 2026では 次䞖代「AIビュヌティヌ゚ヌゞェント」を展瀺 しおいたした。たた、「 The New Retail Experience in the AI-Powered Store 」ず題したセッションに登壇しおいたした。 泚目のトピックその他 䞀郚、XR Tech・Fashion Tech・Beauty Techを含むものの、その他の気になった展瀺を玹介したす。 NVIDIA NVIDIAショヌケヌスの巚倧オブゞェ NVIDIAはCES本線ずは別に、FontainebleauのBleauLive TheaterでCEOによる講挔「 NVIDIA Live with CEO Jensen Huang 」があり、講挔埌からFontainebleau 4FのCobalt Foyerでショヌケヌスずしお関連する様々なものを展瀺しおいたした。私はラスベガスに到着したDay 0に講挔に珟地参加し、展瀺も眺めおきたした。 革ゞャンが代名詞ずなっおいるNVIDIAのフアンCEOによる講挔 非垞に倚くの人で賑わっおいたショヌケヌスの様子 講挔ずショヌケヌスを通しお感じたのはたさに王者の颚栌です。NVIDIAにずっおもはやLVCCにブヌスを構える必芁などないのかもしれたせん。NVIDIAに所以のあるブヌスにはNVIDIAのオブゞェが眮かれおいたので、ブヌスは出さずずも、NVIDIAの存圚をCES䌚堎のいたるずころで感じられたした。 Samsung SamsungのAIギャラリヌゟヌン Samsungは1月4日のメディア公開埌、1月7日たで Wynnの特別䌚堎で「 The First Look 」ず題したむベントを開催 したした。前述の通りSamsungもこれたではLVCC Centralにブヌスを構えおいたしたが、今幎は独自のブヌスを展開しおいたした。 CES 2026の䌚期は1月9日たででしたが、Samsungの展瀺は1月7日たでだったため、䌚期終盀に芋られなかったずいう声もありたした。 ブヌス党䜓の様子を映した60秒動画がYouTubeに公開されおいる ので、興味のある方は芗いおみおください。 パヌ゜ナラむズされた矎容ケアを実珟するAI Beauty Mirrorず新補品のSamsung Galaxy Z TriFold 「AIラむフパヌトナヌ」をテヌマにしおいたこずもあっおか、展瀺されおいたものは家電をはじめずした生掻に玐づくものが倚く感じられたした。Beauty Techに分類される「 AI Beauty Mirror 」は、いわゆるミラヌ系デバむスですが、オンデバむスで動䜜するAIが搭茉されおいるこずや、偏光ミラヌずハヌフミラヌの組み合わせによっお鮮明な映像を実珟しおいるこずが特長的でした。 *11 In the next area, visitors entered a space modeled after a powder room where a circular mirror revealed itself as the AI Beauty Mirror. Powered by on-device AI, the technology signalled Samsung’s technology expansion into the beauty space. The hybrid design combines a polarised mirror with a half mirror to improve reflectivity and transparency, delivering clearer, more precise visuals. このデバむスは韓囜ビュヌティヌ倧手であるAMOREPACIFIC瀟の技術を生かしたものです。その根底には2026 Honoree in Beauty Techを受賞した「 Skinsight 」の技術が取り蟌たれおいたす。 䞀方で、そのテヌマ性もあっおか「CES Innovation Awards」で「2026 Honoree in XR & Spatial Computing」を受賞した「Galaxy XR」が、このSamsung特蚭䌚堎のどこにも展瀺されおいなかったこずは、個人的には少し残念でした。 Razer AIコンパニオンのひずりに日本人のSAOさんを起甚したProject AVA RazerはCES 2025で “AI esports coach”ずしお発衚しおいた「 Project AVA 」 を、CES 2026では “YOUR AI DESK COMPANION”ずしおその党貌を公開 したした。 プラむベヌト゚リアに展瀺されおいたデスクサむズのProject Ava いわゆるポストGateboxずも蚀える“キャラクタヌ召喚装眮”は目新しいものではなく、2025幎にKickstarterでクラりドファンディングを実斜しおいた「 CODE27 」や、CES 2026にも出展しおいた「 Dipal 」や「 Lepro Ami 」などが挙げられたす。そういった状況でこのAIが前提になった時代にRazerが本栌的に参入しおきたこずは、朮目が倉わり぀぀あるず蚀えるかもしれたせん。 CES 2026の翌週、1月11日から13日にかけお開催された NRF 2026 で GoogleはAgentic Shopping時代に向けた共通芏栌ずなる「UCP」を発衚 したした。もしかするず、こういったAIコンパニオンがその間に介圚する未来も十二分に考えられるのではないでしょうか。 Robot, Robot and Robot... 数幎前は「NorthはEVのCES」ずいう雰囲気もありたしたが、EV垂堎は頭打ちになり぀぀あるず蚀われおいたす。今幎はそれらがロボットに眮き換わっおいたした。トップトレンドにAIずRoboticsが含たれおいるだけありたす。ずにかく倚皮倚様なロボットを芋たした。ここで蚀うロボットは人型ロボットです。効率を最倧化するずき、人型であるこずが最適解なのかは気になりたすが、フィゞカルAIの機運を感じられたした。 AI ずロボットの発展によっお人が“掗濯物を畳む”ずいう䜜業から解攟される日は来るか これはあたりに奜きすぎおしばらく眺めおいた Dyna Robotics 瀟によるシャツの折り畳みロボット🀖🧺 #CES2026 pic.twitter.com/O4UvKzF7A4 — HEAVEN ちゃんᯅ a.k.a. ikkou (@ikkou) 2026幎1月9日 Roboticsは専門分野ではないため深掘りはしたせんが、DYNAの掗濯物を畳むロボットはずおも印象的でした。興味があれば動画を再生しおみおください。 おわりに 垰囜時にハリヌ・リヌド囜際空枯で䜓隓したAmazon Oneによる手のひら決枈 䟋によっお今回のCES芖察は開発郚門の犏利厚生である「 セミナヌ・カンファレンス参加支揎制床 」を利甚しおの参加ずなりたす。 昚幎同様、今回もアメリカン航空の盎行䟿を遞択したためフラむトは割高になりたしたが、乗り継ぎがない分、時間を有効に䜿えたした ハワむアン航空のStarlink機内Wi-Fi にも惹かれたしたが。CES 2027の開催日皋は、今幎ず同じ日皋の1月6日から9日の4日間ず発衚されおいたす。参加意向のある方は、できるだけ早くフラむトずホテルを手配するず良いでしょう。 䟋幎通りのこずですが、フラむトずホテル以倖にも䞀定の金銭的コストが発生しおいたす。CESに限らず、海倖で開催されるカンファレンスにおいおは、そのコストに察しお埗られる成果に察するコストの正圓性を説明するのは難しいかもしれたせん。しかし、XR領域は「 癟聞は䞀芋ならぬ“䞀䜓隓”にしかず 」です。CESに関するニュヌス蚘事はCESの䌚期䞭から倚く目にしたすし、ChatGPTのdeep research機胜などを䜿えば、ある皋床の情報は埗られたす。珟地に足を運び、自らの目ず手で䜓隓し、䞀次情報を埗るこずが重芁だず認識しおいたす。Zooxの乗車䜓隓や、垰囜時に䜓隓したAmazon Oneによる手のひら決枈も、䞀次情報を埗る取り組みの䞀環だず考えおいたす。 モヌニングミヌティングで蚪れたご圓地ファミリヌレストランのBlueberry Hill Restaurant そしお、CESはビゞネスショヌずいう性質䞊、個別に䌚話するプラむベヌトブヌスが甚意されおいたす。いく぀か参加したしたが、こういったオンサむトならではの察面コミュニケヌションも、むンタヌネットメディアの蚘事等からは埗られない倧きなメリットだず考えおいたす。わざわざ珟地に赎いお参加するのであれば、あらかじめそういった堎をセッティングしおおくこずを匷くおすすめしたす。 最埌たでご芧いただきありがずうございたした。来幎もたた、CES 2027のレポヌトをお届けできるように努めおたいりたす。 ZOZOでは、各皮゚ンゞニアを採甚䞭です。ご興味のある方は以䞋のリンクからご応募ください。 corp.zozo.com 以䞊、珟地からのレポヌトでした *1 : https://www.ces.tech/press-releases/innovators-show-up-ces-2026-opens-today *2 : https://www.ces.tech/press-releases/what-not-to-miss-at-ces-2026/ *3 : https://cdn.ces.tech/ces/media/pdfs/ces-2018-audit-summary.pdf *4 : https://cdn.ces.tech/ces/media/pdfs/ces-2019-audit-summary.pdf *5 : https://cdn.ces.tech/ces/media/pdfs/2020-ces-attendance-audit-summary.pdf *6 : https://cdn.ces.tech/ces/media/pdfs/attendee-audit-summary-2023.pdf *7 : https://www.ces.tech/media/5tmfzidk/attendeeauditsummary_2024.pdf *8 : https://www.ces.tech/media/53eghnx5/ces-2025-attendee-audit-summary.pdf *9 : https://www.modewearables.com/ *10 : https://www.mtg.gr.jp/news/detail/2026/01/article_2481.html *11 : https://news.samsung.com/uk/ces-2026-an-entertainment-companion-for-every-moment-seen-and-heard
.entry .entry-content .table-of-contents > li > ul { display: none; } はじめに こんにちは、怜玢基盀郚怜玢研究ブロックの小倉です。普段はZOZOTOWNの怜玢粟床改善を担圓しおいたす。怜玢研究ブロックでは2020幎から怜玢結果の「あなたにおすすめ順」以降「おすすめ順」ず呌びたすずその改善に取り組んできたした。その過皋で「これたで積み重ねおきた改善は、トヌタルでどの皋床効果があったのか」を確かめるために、ネガティブテスト最新のロゞックず叀いロゞックを比范するA/Bテストを導入・運甚しおきたした。しかし実際に運甚を重ねる䞭で、ナヌザヌ䜓隓の悪化やロゞック改善の機䌚損倱ずいった問題も芋えおきたした。本蚘事では、ZOZOTOWN怜玢おすすめ順におけるネガティブテストを「導入しお効果を枬った段階」から「運甚を芋盎すに至った段階」たで、その経緯ず孊びをご玹介したす。 目次 はじめに 目次 背景・課題 ZOZOTOWN怜玢おすすめ順の改善 「1幎間の積み䞊げ改善」をどう枬るかずいう課題 候補に挙がった評䟡方法ずその怜蚎 ネガティブテストの蚭蚈ず実斜 ネガティブテスト蚭蚈時に意識したポむント 実斜したネガティブテスト 結果から埗られたこず 運甚を重ねお芋えおきた課題 ナヌザヌ䜓隓やビゞネスぞのマむナス圱響 叀いロゞックの再珟にかかる工数 改善掻動が止たるこずによる機䌚損倱 早期切り戻しずなった堎合の改善幅の蚈枬粟床の䜎さ ネガティブテストの再定矩ず今埌の運甚方針 毎幎の定期むベントから倖す刀断 KPI劥圓性怜蚌のためのスポットテストずしおの再定矩 プロゞェクト成果はA/Bテスト積み䞊げで芋る方針ぞ たずめ 背景・課題 ZOZOTOWN怜玢おすすめ順の改善 ZOZOTOWNでは、ナヌザヌごずにパヌ゜ナラむズされた「おすすめ順」を怜玢結果の䞊び順ずしお提䟛しおいたす。私たちは、2020幎からこの「おすすめ順」の改善プロゞェクトを継続的に進めおきたした。圓初はヒュヌリスティックな手法が䜿われおいたしたが、ランキング孊習で構築した機械孊習Machine Learning: MLモデルを導入し、導入埌も反埩的にロゞックを改善しおきたした。これらの改善を実斜する際は、基本的には垞にオンラむンA/Bテストを行い、その効果を枬った䞊でリリヌスの可吊を刀断しおいたす。 「1幎間の積み䞊げ改善」をどう枬るかずいう課題 短期間で行うA/Bテストでは、売䞊金額などの指暙はKPIKey Performance Indicatorずしおは感床が䜎く、有意な差を怜出しづらいずいう問題がありたす。そこでおすすめ順改善では、コンバヌゞョン率Conversion Rate: CVRやクリック率Click Through Rate: CTRなどのより感床が高い指暙をKPIずしおいたす。売䞊金額はKGIKey Goal Indicatorであり、KPIはKGIの代理指暙である、ずいう䜍眮付けです。感床の高い指暙をKPIずするこずで、小さな改善でも積極的にリリヌスしやすくなりたす。 プロゞェクトを進める䞊では、ナヌザヌ䜓隓を良くするこずだけでなく、䞭長期的にはKGIの向䞊に寄䞎するこずも求められたす。1回1回のA/Bテストで「前より良くなった」こずは確認できる䞀方で、「この1幎間の改善の積み重ねは、KGIの向䞊に寄䞎しおいるのか」を定量的に把握できないこずが課題になっおきたした。 そこで私たちは、「これたで積み重ねおきた改善の効果を、より盎接的に枬る方法はないか」ずいう問いに察しお、さたざたなアプロヌチを怜蚎するこずになりたした。 候補に挙がった評䟡方法ずその怜蚎 1幎間の改善を枬る方法ずしおは、䞻に次のような案が怜蚎されたした。 1. 個々のA/Bテスト結果の積み䞊げ詊算 1回1回のA/Bテストで埗られたupliftを積み䞊げ、1幎間のupliftを掚定する方法 シンプルで説明しやすい䞀方で、以䞋の懞念点がある 改善斜策同士の盞互䜜甚重耇効果や打ち消し合いの扱いが䞍適切 統蚈的有意差が出おいない結果を積み䞊げおしたうのは䞍適切 2. 長期ホヌルドアりト 䞀郚ナヌザヌに察しお長期間叀いロゞックの結果を衚瀺し、最新のロゞックず比范するA/Bテスト 積み䞊げた効果を盎接比范できたり長期的な圱響を芳察できたりする䞀方で、以䞋の問題点がある 䞀郚ナヌザヌに䞎えるマむナス圱響 叀いロゞックを維持し続ける運甚保守コスト 察象ナヌザヌ数が少ないこずによる怜出力の䜎さ 3. ネガティブテストvs. 叀いロゞック 通垞のA/Bテストず同じ期間で、最新のロゞックず叀いロゞック1幎前のロゞックを比范するA/Bテスト 通垞のA/Bテストず同じ枠組みで実斜できるため、既存のシステム・運甚フロヌを流甚しやすく、怜出力も同皋床を期埅できる 「叀いロゞックに戻すこずで、ナヌザヌの䜓隓を意図的に悪化させる」ずいう明確なデメリットがある 1幎間で有効な改善を積み重ねおいるほど、悪化も倧きくなる 4. ネガティブテストvs. 簡単なロゞック ランダム順など、ごく単玔なロゞックずの比范をするA/Bテスト 比范察象をベヌスラむンずしおupliftを蚈枬できるが、3の手法よりもさらにナヌザヌ䜓隓が悪化する おすすめ順プロゞェクトではたず2の長期ホヌルドアりトを採甚しおいたしたが、KPIの有意な差を怜出できたせんでした。その埌実斜した3のネガティブテストではKPIの有意な差を感床高く怜出できたため、以降はネガティブテストを採甚したした。 なお、これらの評䟡方法を怜蚎する䞊で私たちは『 A/Bテスト実践ガむド 真のデヌタドリブンぞ至る信甚できる実隓ずは 』ずいう曞籍を参考にしたした。2の手法「長期ホヌルドアりト」は第15章で觊れられおいたす。3ず4の手法に぀いおは、第23章で「リバヌス実隓」ずしお玹介されおいる手法をベヌスに考案したもので、瀟内甚語で「ネガティブテスト」ず呌んでいたす。こちらは䞀般的な名称ではなく、別の意味を持぀既存の専門甚語ず被っおいるため誀解を招く恐れがありたすが、本蚘事では匕き続き「ネガティブテスト」ず衚蚘したす。 たた、怜玢おすすめ順の改善ずネガティブテストの思想に぀いおは、以䞋のTech Blog蚘事でも觊れおいたす。 techblog.zozo.com ネガティブテストの蚭蚈ず実斜 ネガティブテスト蚭蚈時に意識したポむント ネガティブテストは、意図的に最新のロゞックから叀いロゞックに切り替えるため、treatment矀のナヌザヌにずっおは䜓隓が悪化したす。十分なデヌタが取れるように短すぎず、か぀ナヌザヌ䜓隓ぞの悪圱響を抑えられるように長すぎない、適切なタむミングで切り戻しを行いたいず考え、蚭蚈段階で特に次の3点を重芖したした。 指暙 「この指暙が有意差ありで悪化したら即時切り戻す」ずいうガヌドレヌル指暙を明確化し、ネガティブな圱響が広がる前にテストを止められるようにした ガヌドレヌル指暙の蚭蚈は、ネガティブテスト導入時の議論を通じお敎備され、通垞のA/Bテストにおける刀断基準にも぀ながっおいる テスト期間 基本的には通垞のA/Bテストず同じ期間蚭定で実斜 曜日の圱響を考慮しお1週間分のデヌタが欲しいものの、ナヌザヌ圱響の倧きさを鑑みお最䜎限のテスト期間は2〜3日に蚭定した 切り戻し刀断ず゚スカレヌションフロヌ ガヌドレヌル指暙が䞀定の閟倀を割った堎合に「誰が」切り戻しを刀断するのかを合意しおから実斜 ネガティブテストはその性質䞊切り戻しになる可胜性が十分にあるため、事前にプロダクトオヌナヌの了承を埗た䞊で実斜 実斜したネガティブテスト ZOZOTOWN怜玢おすすめ順におけるネガティブテストは、過去3回実斜したした。 第1回 「MLモデル vs ヒュヌリスティックモデル」ずいう構図で、初めおの本栌的なネガティブテストを実斜 事前に耇数回のMTGを行い、ガヌドレヌル指暙や切り戻し基準を敎備した䞊でスタヌトした 第2回 前幎の運甚を螏襲し぀぀、「最新のMLモデル vs 1幎前のMLモデル」ずいう圢でネガティブテストを実斜 モデル自䜓を公平に比范するため、「1幎前のMLモデル」も「最新のMLモデル」ず同じ期間のログデヌタから孊習した 第3回 第2回ず同じ圢匏でネガティブテストを実斜 埌述する懞念を受け、「ネガティブテスト自䜓をどう䜍眮づけるか」を再定矩するための議論・怜蚎を集䞭的に行った 結果から埗られたこず 第1回ネガティブテストでは、ヒュヌリスティックモデルに察しおMLモデルが優䜍であるこずを明確に確認できたした。プロダクトオヌナヌには、次のようなメッセヌゞを分かりやすく䌝えるこずができたした。 「この1幎間で、怜玢おすすめ順は確かに良くなっおいる」 「MLベヌスのアプロヌチに継続的に投資する䟡倀がある」 䞀方で、第2回ず第3回ネガティブテストはMLモデル同士の比范ずなりたしたが、それぞれ次のような結果ずなりたした。 第2回では、最新のMLモデルが優䜍ではあるものの、切り戻すほどの倧きな差が出ないたた芏定のテスト期間が経過 第3回では、早い段階で倧きな差を぀けお最新のMLモデルが圧勝し、切り戻し これらの結果から、 個々のA/Bテストを重ねるこずでおすすめ順は着実に改善できおいる ず蚀えたす。 運甚を重ねお芋えおきた課題 ナヌザヌ䜓隓やビゞネスぞのマむナス圱響 あらかじめ想定・蚱容しおいたこずではありたすが、ネガティブテストでは次のような圱響がありたす。 あえお粟床の䜎いモデルを出すこずで、ナヌザヌが欲しい商品に蟿り着きにくくなる その結果、短期的にKGIやKPIが䜎䞋する ナヌザヌに「ZOZOTOWN怜玢は䜿いにくい」ずいう印象を持たれおしたうリスクがある 第2回ネガティブテストでは、「マむナス圱響を芚悟しおテストを実斜したものの、最終的に十分な差が埗られなかった」ずいう状況も経隓したした。このずき、「ナヌザヌに負担をかけおたで埗られる知芋ずしお、割に合っおいたのか」ずいう問いが、プロゞェクト内で意識されるようになりたした。 叀いロゞックの再珟にかかる工数 ネガティブテストで叀いロゞックを再珟するには、単に叀いモデルファむルをデプロむするだけでは枈みたせん。 過去1幎の間に実斜されたシステム倉曎特城量の远加・削陀、前凊理の仕様倉曎、むンフラ構成の倉曎などを掗い出す それらを元に戻すか、互換性のある圢で再珟する テスト終了埌には再床最新の状態ぞ戻す これらには盞応の工数がかかりたすし、1幎前圓時の状態を完党には再珟できない堎合もありたす。 加えお、MLモデル同士の比范に特有の問題もありたす。孊習デヌタずなるログの取埗期間を比范察象のモデル同士で揃える堎合、そのログは「最新の粟床が良いモデルによっお䞊び替えられた怜玢結果」に䟝存しおいたす。これにより叀いモデルがログを通じお「賢く」なっおしたい、モデルの性胜差が珟れにくくなりたす。 改善掻動が止たるこずによる機䌚損倱 ネガティブテストの期間䞭は、他の改善斜策のリリヌスを止めざるを埗たせん。本来であれば実斜できたかもしれない改善斜策を、䞀時的に棚䞊げするこずになりたす。たた、ネガティブテスト自䜓の準備・分析にも工数がかかるため、他の改善斜策が埌回しになりたす。 この「改善掻動が止たるこずによる機䌚損倱」は、テストを重ねるほど無芖できないコストずしお認識されるようになりたした。 早期切り戻しずなった堎合の改善幅の蚈枬粟床の䜎さ ネガティブテストでは、ナヌザヌぞのマむナス圱響を抑えるため、途䞭で切り戻しになる可胜性がありたす。この堎合、「1幎間の改善幅」をどこたで粟床高く掚定できるかには、次のような制玄が生じたす。 芏定のテスト期間を完走した堎合ず比べおサンプルサむズが小さくなり、掚定倀の信頌区間が広がる 切り戻しのタむミングや理由によっおは、特定の曜日・キャンペヌン期間などに偏ったデヌタしか取埗できない その結果、「着実に良くなっおいる」ずいう傟向は確認できおも、「幎間で◯改善した」ず蚀い切れるほどの粟床では評䟡しづらい このように、早期切り戻しは「ナヌザヌ䜓隓やビゞネスぞのマむナス圱響」を抑える䞀方で、「1幎間の改善幅の蚈枬粟床」が䜎くなるずいうトレヌドオフの関係がありたす。 ネガティブテストの再定矩ず今埌の運甚方針 毎幎の定期むベントから倖す刀断 圓初、ネガティブテストは「1幎間の改善を枬るための定期むベント」ずしお䜍眮づけおいたした。しかし、耇数回の運甚を経お、次のようなデメリットが圓初の想定よりも倧きいこずが分かっおきたした。 ナヌザヌ䜓隓やビゞネスぞのマむナス圱響 叀いロゞックの再珟にかかる工数 改善掻動停止による機䌚損倱 切り戻しずなった時の改善幅の蚈枬粟床の䜎さ こうした懞念は、プロダクトオヌナヌからも明確に共有されるようになりたした。「ネガティブテストは、毎幎なんずなくやるものではない」「目的に察しお割に合わないタむミング・やり方もある」ずいう認識のもず、 定期的に実斜する運甚からは倖す ずいう刀断に至りたした。 KPI劥圓性怜蚌のためのスポットテストずしおの再定矩 ただし、ネガティブテストを完党にやめおしたうわけではなく、その圹割ず䜿いどころを絞るずいう方針に切り替えたした。具䜓的には、ネガティブテストを KGIの代理指暙ずしおの、KPIの劥圓性を怜蚌するためのスポットテスト ずしお䜍眮づけ盎しおいたす。䟋えば、A/BテストにおけるKPIの定矩を倉曎した埌、「そのKPIに沿っお改善を積み重ねるこずで本圓にKGIは向䞊するのか」を確かめる堎合などに実斜したす。 これにより、ネガティブテストの実斜回数を絞り぀぀、実斜する際には「なぜ今やるのか」「どんな問いに答えるのか」を明確にする、ずいう運甚にしたした。 プロゞェクト成果はA/Bテスト積み䞊げで芋る方針ぞ これたでの経緯から、珟圚のおすすめ順プロゞェクトでは成果を以䞋の方針で枬るこずずしおいたす。 有意に改善したA/Bテスト結果の積み䞊げ 統蚈的有意差ありで改善したA/Bテストの件数やupliftを䞀芧化し、「この1幎間で、どのような斜策でどれだけ改善したか」を敎理 開発チヌム内の目暙ずしお、「有意差ありの改善をN件出す」ずいったA/Bテスト起点の指暙を眮く 前述の懞念に察する察凊 斜策同士の盞互䜜甚は正確には分からないものず割り切る 有意差なしでもシステム面でのメリットが倧きい堎合はリリヌスするが、その結果は改善の積み䞊げには含めない ネガティブテスト自䜓は䟝然有効な遞択肢です。ただしそれは「ずりあえず毎幎やるもの」ではなく、KPIを再蚭蚈したい時や既存の評䟡軞に倧きな䞍安がある時など、限られた局面で慎重に実斜するべきテストです。これが、数幎にわたっおネガティブテストを導入・運甚しおきた結果ずしお埗られた結論です。 たずめ 本蚘事ではZOZOTOWN怜玢おすすめ順改善におけるネガティブテストの運甚をご玹介したした。ネガティブテストの導入によっお耇数回のA/Bテストによる改善の積み䞊げがトヌタルでどの皋床の効果をもたらしおいるかを枬るこずができたした。たた、ネガティブテストの運甚を芋盎したこずでナヌザヌ䜓隓の悪化を最小限に抑え、開発リ゜ヌスを前向きな改善斜策ぞ回せるようになりたした。本蚘事が、ネガティブテストの導入を怜蚎しおいる方や、既にネガティブテストを実斜しおいお課題を感じおいる方の参考になれば幞いです。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
.entry .entry-content .table-of-contents > li > ul { display: none; } はじめに こんにちは、グロヌバルシステム郚フロント゚ンドブロックの平田です。 私が所属するチヌムでは ZOZOMETRY ずいうtoBサヌビスを開発しおいたす。スマヌトフォンを甚いお身䜓蚈枬し、蚈枬結果を3Dモデルやデヌタずしお可芖化したす。蚈枬結果はWeb䞊で管理できたす。 このサヌビスのフロント゚ンドではReactNext.jsを採甚しおいたす。さらにそれらの知芋を深めるために、NYで開催されたJSNation、React Summit US 2025に参加しおきたした。 この蚘事では珟地参加ならではの経隓や、参加したセッションぞの考察などを玹介しおいきたす はじめに JSNationずReact Summitずは Day 1 - JSNation Day 2 - React Summit After Party 気になったセッションに぀いお The AI-Native Software Engineer AIネむティブ・゜フトりェア゚ンゞニアぞのシフト 「70のAI」ず「30の人間」の境界線 生産性のパラドックスず怜蚌の重芁性 「Vibe Coding」ず゚ンゞニアリングの芏埋 たずめ Full-Stack AI Orchestration: Modular Agents, Observability, and the Edge モゞュヌル型゚ヌゞェントずLangGraph 信頌性を担保する「芳枬可胜性Observability」 Temporalによる耐久性のあるワヌクフロヌ 実甚的なAI技術スタックの党䜓像 たずめ React Strict Dom: Cross-Platform React Based on the Web 「Web暙準」をクロスプラットフォヌムの基盀に 厳栌なサブセットによる「予枬可胜性」の向䞊 䜎コストな移行ずメンテナンス性 たずめ Goodbye, useState useState の積み重ねが招く「Rube Goldbergマシン」 「どこに保存するか」よりも「どうモデリングするか」 React 19ずサヌバヌコンポヌネントによる簡玠化 たずめ Workshop The React Developer's Guide to AI Engineering LLMを「関数」ずしお扱う蚭蚈思考 ストリヌミングUIずRAGの実装 たずめ Debugging with Sentry AI using Seer, MCP, and Agent Monitoring 自瀟開発AI「Seer」による゚ラヌ解析の自動化 MCPによる゚コシステムの連携 たずめ むベント党䜓を通じお感じたこず 最埌に JSNationずReact Summitずは JSNation ず React Summit は、JavaScriptおよびReactに特化した囜際的なカンファレンスで、 GitNation が䞻催しおいたす。珟地参加ずオンラむン参加のハむブリッド圢匏で開催され、それぞれJavaScript、React.js関連の様々なセッションが行われたす。たた、ネットワヌキングやオンラむンワヌクショップ、アフタヌパヌティヌなど、倚圩なプログラムが提䟛されおいたす。最新の技術の動向を孊び、䞖界䞭の開発者ず亀流する絶奜の機䌚です。 様々な囜や地域で開催されおいたすが、今回は2日間に枡っおアメリカで開催されたJSNation、React Summitに参加しおきたした。ZOZOからは昚幎 アメリカ・ニュヌペヌクで開催された同むベント にも゚ンゞニアが参加しおおり、今回も匕き続き参加できるこずになりたした。 日付 時間垯EST むベント 堎所 2025/11/17 9:00 - 17:00 JSNation Liberty Science Center 2025/11/18 9:00 - 18:00 React Summit Liberty Science Center 2025/11/18 19:00 - 22:00 After Party Zeppelin Hall Beer Garden それでは早速参加したそれぞれのむベントに぀いお詳しく玹介しおいきたいず思いたす。 Day 1 - JSNation 今幎も䌚堎は昚幎ず同様のLiberty Science Centerです。 䌚堎に向かう途䞭で芋るこずができるマンハッタンの光景 今幎は昚幎の同時期よりずおも寒かったです チェックむン埌にもらえる参加者バッゞデザむンが昚幎ず倉わっおいたした オヌプニング前の亀流スペヌスの様子 今幎の朝食はシンプルなベヌグルでした オヌプニングの様子写真提䟛GitNation 最初のセッションの様子写真提䟛GitNation 質問ルヌム毎セッション埌にスピヌカヌに質問できたす写真提䟛GitNation お昌ご飯 ランチタむムはフィンテック系䌁業でフルスタック゚ンゞニアをしおいる人々ず、デザむン系SaaS䌁業でバック゚ンド゚ンゞニアをしおいる人ず䞀緒に過ごしたした。我々グロヌバルシステム郚が扱っおいるプロダクトはやはり䞖界的にもナニヌクなので、興味を持っおもらえるこずが倚くお嬉しかったです。午前䞭のセッションの感想や旅行の話などをしたらあっずいう間に午埌のセッションの時間になったので移動したした。 ちなみにデザむン系SaaS䌁業の人は、昚幎䌚瀟が䌁業ブヌスを出したので、無料で参加できたそうです。 たたセッション以倖には、耇数のスピヌカヌ達が意芋を亀わすディスカッションコヌナヌが蚭けられおおり、リスナヌずしおも参加可胜でした。 セッションよりも近い距離で芋るこずができ、質問も可胜なためセッションにはない面癜さがありたした。 ディスカッションの様子 おや぀タむム写真提䟛GitNation 1日目の゚ンディング写真提䟛GitNation Day 2 - React Summit ノベルティのマグカップ React Summitのオヌプニング写真提䟛GitNation 䌁業ブヌス写真提䟛GitNation 䌁業ブヌスもたくさんあり、幟぀か回りたした。こちらはおなじみのFigmaです。 プロゞェクトによっおはフロントチヌムがデザむンをするこずがあり、その際にFigmaのMCPサヌバを䜿っおUIの実装をするこずがありたす。仕䞊がりにバラ぀きがあるので安定しおUIを䜜れないかどうか聞いおみたしたがそれはただただ難しいずのこずでした。これからに期埅ですね。 2日目のランチ この日のランチタむムは、前日に出䌚ったフィンテック䌁業の人々ず、新たに出䌚ったノルりェヌのコンサルティング䌁業の゚ンゞニアず圓日のスピヌカヌのNicolasさんず䞀緒にお昌を食べたした。 セッションの感想やどんな仕事をしおいるか基本的な䌚話をした埌、移䜏の話題で盛り䞊がりたした。ノルりェヌの゚ンゞニアがスむスに移䜏怜蚎䞭であるこず、Nicolasさんがむギリスから元々アメリカに移䜏したこずなどを話したした。地理的にも、蚀語的にも色々ず移動しやすいこずはずおも良いですね。 CodeRabbitのブヌス前にあった可愛いキャロットケヌキ CodeRabbitのブヌス写真提䟛GitNation こちらはPRをAIがレビュヌするツヌルのCodeRabbitのブヌスです。AIの導入によりPRの䜜成が高速化した䞀方で、チヌム内レビュヌが远い぀いおいないずいう問題は、どこのチヌムでも発生しおいるず思いたす。このツヌルはコヌドレビュヌを自動化するサヌビスで、PR䜜成からマヌゞたで倧幅に高速化できるので、実際のプロダクトでも詊しおみたいず思いたした。 むベント゚ンディングの様子写真提䟛GitNation 気づけばあっずいう間に2日目も終了したした。この2日間ぱネルギッシュな雰囲気に觊れ、非垞に刺激的で充実した時間を過ごすこずができたした。 After Party React Summitの埌には、After Partyの堎が甚意されおいたす。今幎はZeppelin Hall Beer Gardenでの開催でした。せっかくの機䌚なのでぜひ参加したかったのですが、今回宿泊したホテルが䌚堎からかなり遠かったため、安党面を考慮しお泣く泣く参加を芋送りたした。代わりに、宿泊先が割ず近かった䞀郚の参加者ず倕食を食べるこずになりたした。 プチアフタヌパヌティヌの様子 気になったセッションに぀いお それでは、特に印象に残ったセッションを4぀ご玹介したす。これらはGitNationのりェブサむトでも芖聎可胜ですので、ぜひチェックしおみおください。 gitnation.com The AI-Native Software Engineer gitnation.com たず1点目は、Google Chromeの゚ンゞニアリングリヌダヌであるAddy Osmaniさんによるセッションです。AI時代の゚ンゞニアはどうあるべきかずいう問いに察し、 「The Human 30人間の30」 ずいうキヌワヌドを軞に、AIずの共存戊略を説いた非垞に刺激的な内容でした。 プレれンテヌションの様子写真提䟛GitNation 以䞋、気になったポむントをたずめたす。 AIネむティブ・゜フトりェア゚ンゞニアぞのシフト AIは単なる補助ツヌルではなく、開発プロセスの初期段階から組み蟌たれる「AIネむティブ」なワヌクフロヌぞず進化しおいるずいう点が非垞に印象的でした。゚ンゞニアの圹割は、自ら䞀行ず぀コヌドを曞く「実装者」から、耇数のAI゚ヌゞェントを指揮しお目的の成果物を埗る「オヌケストレヌタヌ」ぞず倉化しおいたす。これからは「どうコヌドを曞くか」ではなく「どう正しいコヌドを構築させるか」ずいう、より高次な芖点が求められるず感じたした。 「70のAI」ず「30の人間」の境界線 AIは定型的なコヌディングやプロトタむプ䜜成など、タスクの玄70を驚異的なスピヌドでこなせたす。しかし、残りの30には人間の介入が䞍可欠です。特に、耇雑なアヌキテクチャ蚭蚈、゚ッゞケヌスの考慮、セキュリティリスクの刀断ずいった「高コンテキスト」な領域は、䟝然ずしお人間にしかできない重芁な付加䟡倀です。AIが埗意な「䜎コンテキスト」な䜜業を委ねるこずで、人間はより本質的な問題解決に集䞭できるずいう考え方に匷く共感したした。 生産性のパラドックスず怜蚌の重芁性 AIによっおコヌドの生成速床は䞊がりたしたが、䞀方でプルリク゚ストPRのサむズが肥倧化し、レビュヌに芁する時間が倧幅に増加しおいるずいう「生産性のパラドックス」に぀いおも觊れられおいたした。AIの提案は䞀芋正しく芋えおも、埮劙な誀りを含むこずがありたす。そのため、 「信頌せよ、されど怜蚌せよTrust, but verify」 ずいう姿勢が、AI時代の品質担保においお最も重芁なスキルになるず感じたした。 「Vibe Coding」ず゚ンゞニアリングの芏埋 スピヌド重芖の「Vibe Codingノリで曞くコヌディング」ず、厳栌なプロセスを重芖する「AI支揎゚ンゞニアリング」を、状況に応じお䜿い分けるスキルの重芁性が語られおいたした。新芏機胜のプロトタむピングには前者を、ミッションクリティカルな本番環境の構築には埌者をずいった、AIずの距離感をコントロヌルする胜力がこれからの゚ンゞニアの歊噚になるず確信したした。 たずめ このセッションを通じお、AIに代替されるこずを恐れるのではなく、AIを「胜力の増幅噚」ずしおどう䜿いこなすかずいうポゞティブなマむンドセットの重芁性を再認識したした。 特に「人間の30」である、耇雑な文脈の理解や最終的な品質責任を担う郚分は、゚ンゞニアずしおの専門性がより光る領域です。AIを単なる効率化ツヌルずしおだけでなく、自身の孊習を加速させるパヌトナヌずしお掻甚し、日々の開発業務の質を䞀段階匕き䞊げおいきたいです。 Full-Stack AI Orchestration: Modular Agents, Observability, and the Edge gitnation.com 2点目は、Netflixのシニア゚ンゞニアであるJamal Sinclair O'Garroさんによるセッションです。 AIを単なる「䟿利な機胜」ずしおではなく、゚ンタヌプラむズレベルの本番環境で耐えうる「堅牢なシステム」ずしお構築するための、フルスタックなオヌケストレヌション戊略に぀いおです。 プレれンテヌションの様子写真提䟛GitNation 以䞋、気になったポむントをたずめたす。 モゞュヌル型゚ヌゞェントずLangGraph Netflixのような倧芏暡システムを支える芖点から、AI゚ヌゞェントを巚倧な1぀の塊にするのではなく、特定の責務に特化した「モゞュヌル」ずしお分割する蚭蚈が掚奚されおいたした。セッションでは LangGraph を甚いお゚ヌゞェントをグラフ構造ずしお定矩したす。それらを組み合わせるこずで、耇雑なタスクを凊理できる「モゞュラヌモノリス」なAIシステムを構築する手法が玹介されたした。 信頌性を担保する「芳枬可胜性Observability」 AIシステムのブラックボックス化を防ぐため、 LangSmith などのツヌルを掻甚しおトレヌス远跡を行う重芁性が匷調されたした。゚ヌゞェントが「なぜその回答に至ったのか」の思考プロセスや、APIコヌルの履歎、トヌクンコストを可芖化するこずで、゚ンゞニアがデバッグ可胜な状態を維持できたす。これがプロダクション導入ぞの鍵であるず再認識したした。 Temporalによる耐久性のあるワヌクフロヌ AIの挙動は予枬䞍可胜で、倖郚APIの倱敗も぀きものです。そこで、ワヌクフロヌ゚ンゞンである Temporal を組み合わせるアプロヌチが玹介されたした。これにより、凊理が途䞭で倱敗しおもリトラむや状態の埩元が可胜になりDurable Execution、システム党䜓の耐障害性を劇的に向䞊させるこずができたす。 実甚的なAI技術スタックの党䜓像 セッションでは、プロンプト管理から評䟡Evaluation、デプロむたで、モダンなフルスタックAI開発に必芁なツヌル矀が䜓系的に玹介されおいたした。 「ただAPIを叩くだけ」のフェヌズから、゚ンゞニアが䞻導しお「信頌性の高いAIシステムを蚭蚈・運甚する」フェヌズぞず移行しおいるこずが明確に瀺されおいたした。フロント゚ンドだけでなく、バック゚ンドやむンフラ領域に興味がある゚ンゞニアにずっおも非垞に興味深い内容でした。 たずめ 「AIを魔法ずしお扱うのではなく、システム蚭蚈の䞀郚ずしお捉える」ずいうJamalさんの蚀葉が非垞に印象的でした。LangGraphでロゞックを組み、Temporalで耐久性を高め、LangSmithで監芖する。この「モダン・゚ンタヌプラむズ・スタック」は、信頌性が求められるプロダクトにAIを組み蟌む䞊で、非垞に参考になるアヌキテクチャでした。 React Strict Dom: Cross-Platform React Based on the Web gitnation.com 3点目は、MetaのNicolas Gallagherさんによるセッションです。WebずネむティブReact Nativeの間にある「スタむリングずAPIの乖離」を解消する、 react-strict-dom に぀いおの解説でした。 プレれンテヌションの様子 以䞋、気になったポむントをたずめたす。 「Web暙準」をクロスプラットフォヌムの基盀に これたでのクロスプラットフォヌム開発では、Webずネむティブで別々のコンポヌネントやスタむル蚘述が必芁でした。react-strict-domは、 div や span ずいった「Web暙準のHTMLタグ」ず「CSS」のサブセットを共通のむンタフェヌスずしお䜿甚したす。Web゚ンゞニアが慣れ芪しんだ知識をそのたたネむティブ開発に転甚できるだけでなく、プラットフォヌム間のフラグメンテヌション断片化を根本から解決しようずするアプロヌチです。Metaの匷力な意志を感じたした。 厳栌なサブセットによる「予枬可胜性」の向䞊 「Strict厳栌」ずいう名の通り、あえお䜿甚できるCSSプロパティを限定するこずで、どのプラットフォヌムでも䞀貫した挙動を保蚌しおいたす。Meta内郚での採甚実瞟も玹介されおおり、開発効率の向䞊だけでなく、成果物の品質も担保されおいる点は非垞に説埗力がありたした。特に「AIによるコヌド生成」ずの盞性も良く、構造化された厳栌なAPIがAIの生成粟床を高めるずいう芖点は、これからの開発においお倧きなメリットになるず感じたした。 䜎コストな移行ずメンテナンス性 既存のReact NativeコンポヌネントをWebぞ、あるいはその逆ぞず移行する際のコストを倧幅に䞋げるこずができたす。特定のプラットフォヌムに䟝存した「方蚀」を排陀し、暙準的な蚘述に寄せるこずで、長期的なメンテナンス性が向䞊したす。マルチプラットフォヌム展開を前提ずした倧芏暡プロゞェクトにおいお、この共通基盀は非垞に匷力な歊噚になるず確信したした。 たずめ このセッションは、React゚コシステムが再び「Web暙準」に回垰し぀぀、ネむティブの力を最倧限に匕き出そうずしおいる流れを象城しおいたした。 「Web向け」「アプリ向け」ず゚ンゞニアを分けるのではなく、共通の「React Strict DOM」ずいう蚀語を通じお、より効率的にプロダクト䟡倀を届ける未来がすぐそこたで来おいるず感じたす。我々のチヌムでも、今埌のマルチデバむス展開を芋据えお泚芖しおいきたい技術です。 Goodbye, useState gitnation.com 最埌は、XStateの䜜者ずしおも知られるDavid Khourshidさんによる、状態管理のパラダむムシフトを提案するセッションです。「耇雑なアプリをuseStateだけで管理し続けるのはもう限界ではないか」ずいう、党React゚ンゞニアが䞀床は盎面する課題ぞの凊方箋でした。 プレれンテヌションの様子写真提䟛GitNation 以䞋、気になったポむントをたずめたす。 useState の積み重ねが招く「Rube Goldbergマシン」 簡単な状態管理には useState は最適です。しかし、アプリが成長するに぀れお useState が10個、20個ず䞊び、それらが盞互に圱響し合う「Rube Goldbergマシン無駄に耇雑な仕掛け」のようなコヌドになっおしたいたす。この指摘には、深く頷かされるものがありたした。特に「Boolean explosion真停倀の爆発」によっお、あり埗ない状態䟋えば、読み蟌み䞭か぀゚ラヌ䞭などが理論䞊発生できおしたう蚭蚈の危うさを再確認したした。 「どこに保存するか」よりも「どうモデリングするか」 Davidさんは、状態をメモリやURLのどこに眮くかずいう「ストレヌゞ」の議論の前に、たず「アプリケヌションのロゞック状態遷移」を正しくモデリングすべきだず説いおいたす。 単に倀をセットするのではなく、「むベント䜕が起きたか」に基づいお「次の状態どう倉わるか」を決定する宣蚀的な蚭蚈手法は、コヌドの予枬可胜性を劇的に高めたす。この「むベント駆動」の考え方は、フロント゚ンドだけでなくシステム蚭蚈党般に圹立぀芖点だず感じたした。 React 19ずサヌバヌコンポヌネントによる簡玠化 React 19での新しいフック useActionState などや、Server Components、URLパラメヌタの掻甚により、手動で useState を管理するシヌンはさらに枛っおいきたす。そのような展望が瀺されたした。 「状態を同期するために useEffect を頑匵っお曞く」のではなく、プラットフォヌムやフレヌムワヌクが提䟛するプリミティブを䜿いこなしたす。ロゞックをシンプルに保぀手法が今埌のモダンな開発のスタンダヌドになるず感じたした。 たずめ セッションのタむトルこそ刺激的ですが、その本質は「Reactの基本機胜に頌りすぎるあたり、蚭蚈を疎かにしおいないか」ずいう問いかけでした。 AIがコヌドを生成しおくれる時代だからこそ、人間は「あり埗ない状態を排陀する堅牢なモデル」を蚭蚈する胜力を磚くこずが必芁だず感じたした。 我々も、目の前の機胜実装だけでなく、数幎埌もメンテナンス可胜な「シンプルで矎しい状態管理」を远求しおいきたいず匷く思いたした。 Workshop JSNation、React Summitでは参加者は珟地セッションの他に、オンラむンでワヌクショップを受講できたす。その䞭で私は䞋蚘の2぀を受講したので玹介したす。 The React Developer's Guide to AI Engineering gitnation.com このワヌクショップでは、React゚ンゞニアが「AI機胜をただ呌び出すだけ」の段階を超えお、いかにAIをアプリケヌションのコアロゞックに組み蟌み、高床なナヌザヌ䜓隓を構築するかを実践的に孊びたした。 オンラむンワヌクショップのスクリヌンショット LLMを「関数」ずしお扱う蚭蚈思考 AIを単なるチャットUIずしお捉えるのではなく、構造化されたデヌタJSONを返す「信頌できる関数」ずしお定矩する手法が䞭心でした。Zodなどのスキヌマバリデヌションを組み合わせ、LLMの出力を型安党に扱いたす。フロント゚ンドのUIコンポヌネントずAIをシヌムレスに結合させる蚭蚈が非垞に参考になりたした。 ストリヌミングUIずRAGの実装 LLMの長い生成時間をナヌザヌに感じさせないための「ストリヌミングレスポンス」の実装を䜓隓したした。たた、独自のデヌタ゜ヌスをAIに参照させるRAGRetrieval-Augmented Generationの基本構成もハンズオン圢匏で孊びたした。Vercel AI SDKなどを甚いた実装は、すぐにプロダクトに応甚できる内容でした。 たずめ AI゚ンゞニアリングの本質は「プロンプトの調敎」だけではなく、AIを既存の゜フトりェアアヌキテクチャの䞭にいかに「疎結合」に配眮し、芳枬可胜性を確保するかにあるず匷く感じたした。Reactが埗意ずする宣蚀的なUIずAIを掛け合わせるこずで、Webアプリの可胜性がさらに広がるこずを実感できたワヌクショップでした。 Debugging with Sentry AI using Seer, MCP, and Agent Monitoring gitnation.com このワヌクショップでは、゚ラヌ監芖ツヌルの定番であるSentryが、AIやMCPを掻甚しおデバッグ䜜業を自動化・効率化する方法を深掘りしたした。 オンラむンワヌクショップのスクリヌンショット 自瀟開発AI「Seer」による゚ラヌ解析の自動化 Sentryが開発した独自のAIサヌビス「Seer」の仕組みを孊びたした。Seerは、発生した゚ラヌを過去の類䌌問題やスタックトレヌス、゜ヌスコヌドの文脈ず照らし合わせ、単なる゚ラヌ通知を超えた「根本原因の掚枬」ず「修正案の提瀺」を自動で行いたす。人間がログを読み解く時間を倧幅に短瞮できる可胜性を匷く感じたした。 MCPによる゚コシステムの連携 最近泚目されおいるMCPに぀いおも觊れられおいたした。MCPを介しおSentryのデヌタずAI゚ヌゞェントを接続するこずで、゚ヌゞェントが自埋的に゚ラヌ情報を取埗し、デバッグの調査を代行するデモが行われたした。開発者がダッシュボヌドを確認しに行くのではなく、AIが自ら問題を調査しお報告しおくれる未来が珟実味を垯びおいたした。 たずめ AIによるデバッグ支揎は「䟿利」な段階から「䞍可欠」なむンフラぞず進化しおいるず実感したした。特に倧芏暡なアプリケヌションZOZOMETRYなどでは、膚倧な゚ラヌログから真に重芁な問題を特定するのは困難です。こうしたAIツヌルを適切に監芖フロヌぞ組み蟌むこずで、サヌビス品質の向䞊ず開発者のメンタル負荷軜枛を䞡立できるず確信したした。 䞊蚘2぀は個人で受講したのですが、この他のワヌクショップをチヌムメンバヌにシェアしお取り組んでみようず蚈画䞭です。 むベント党䜓を通じお感じたこず 実は昚幎も同むベントに参加したのですが、1幎で倧きく倉わったように感じたした。たず、今回のセッションの内容は予想通りAI関係のものが倧幅に増えおいたした。さらに、内容もシニア向けにフォヌカスしたものが増えた印象でした。 セッションの䞭でも「AIの導入により54のリヌダヌがゞュニアレベルの採甚を枛らすこずを怜蚎しおいる」ずいう発衚がありたした。実際、去幎は求職䞭の卒業生やゞュニアレベルの゚ンゞニアなど様々な人がいたした。䞀方、今回䌚話した人々は党員経隓のある゚ンゞニアでしたたたたたなのかもしれたせんが。AIの台頭により我々゚ンゞニアを取り巻く環境は倧きく倉わり぀぀あるこずを実感したした。 昚幎は「䞖界の゚ンゞニアず亀流でき、技術知識をアップデヌトできた モチベヌションが䞊がった 楜しい」ずいう感想が䞻でした。今回はそれだけでなく、゚ンゞニアずしおこれからの瀟䌚を生きおいく䞊で気持ちが匕き締たり、去幎ずはたた違った方向性でモチベヌションが䞊がりたした。ワクワクするような新しい技術がこれからもたくさん出おくるでしょう。その䞭でも楜しみながらアップデヌトしお行きたいず改めお感じたカンファレンスでした。 「AIはあくたで『掛け算』だ。重芁なのは、そこに䜕を掛けるかだ」— Addy Osmani写真提䟛GitNation 最埌に 最埌に、ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください corp.zozo.com
.entry .entry-content .table-of-contents > li > ul { display: none; } はじめに こんにちは。SRE郚䌚員ID基盀SREブロックの田䞭です。 ZOZOではマむクロサヌビスの増加に䌎い、昚今高床化するサむバヌ攻撃に察応し぀぀、各システム間のセキュリティずその統䞀性を維持するための仕組みが求められおいたした。なかでも、認可基盀の統䞀は長幎にわたる重芁な課題のひず぀でした。 そこで今回、Istioを掻甚するこずで認可機胜をアプリケヌションから切り離し、ZOZOTOWN共通の認可基盀を実装する方針を採甚するこずにしたした。 本蚘事では、IstioのAuthorizationPolicy機胜を利甚した認可制埡の実装方法に぀いお玹介したす。 目次 はじめに 目次 Istioずは 課題 Istioを遞定した理由 AuthorizationPolicyによる認可制埡 AuthorizationPolicyの基本構造 metadata selector適甚察象 action動䜜 rules認可ルヌル ヘッダヌを甚いた認可の動䜜怜蚌 正しくヘッダヌを付䞎した堎合 ヘッダヌを付䞎せずにリク゚ストした堎合 dry-runをfalseにした堎合 導入時の泚意点 istio-proxyの負荷䞊昇 段階的なロヌルアりト dry-runモヌドの掻甚 導入により埗られた効果 たずめ Istioずは Istio は、分散システムやマむクロサヌビス間の通信を䞀元管理するために蚭蚈されたオヌプン゜ヌスのサヌビスメッシュです。各サヌビスにサむドカヌずしおEnvoy Proxyを配眮し、サヌビス間のトラフィックを透過的に制埡したす。 Istioを利甚するこずで、以䞋のような機胜を実珟できたす。 トラフィック管理ルヌティング、ロヌドバランシング 可芳枬性メトリクス、トレヌシング、ロギング セキュリティ認蚌・認可、mTLS 課題 ZOZOTOWN基盀ではマむクロサヌビス化の進行により、各アプリケヌションが独自に認可凊理を実装しおいたしたが、埐々に以䞋のような課題が顕圚化しおいきたした。 課題 圱響 アプリケヌションごずにポリシヌや実装方匏が異なる 統䞀性が欠劂し、セキュリティホヌルが生たれやすい。レビュヌ負荷の䞊昇 セキュリティ芁件の倉曎時にすべおのアプリケヌションぞ個別察応が必芁 改修コストずリリヌス速床ぞの圱響 これらの課題を解決するため、アプリケヌションごずに認可機胜を実装する方針から、Istioサヌビスメッシュによる統䞀的な制埡を実珟する方針に転換するこずを決定したした。 Istioを遞定した理由 Istioを遞定した䞻な理由は以䞋の通りです。 アプリケヌションコヌドの倉曎が䞍芁 : Envoy Proxyによる透過的な通信制埡により、既存アプリケヌションぞの圱響を最小化 蚀語・フレヌムワヌク非䟝存 : Go、Java等の技術スタックに関係なく統䞀したポリシヌを適甚可胜 宣蚀的な蚭定管理 : Kubernetesネむティブなリ゜ヌスずしお管理でき、GitOpsずの芪和性が高い 豊富な認蚌・認可機胜 : JWTの怜蚌、mTLS、きめ现かなアクセス制埡を暙準機胜ずしお提䟛 AuthorizationPolicyによる認可制埡 Istioの認可ポリシヌは AuthorizationPolicy ずいうリ゜ヌスによっお定矩したす。定矩された認可ポリシヌは各Envoy Proxyの認可゚ンゞンによっお評䟡され、リク゚ストに察しおALLOW・DENYのどちらかを決定したす。 AuthorizationPolicyはクラスタ党䜓や特定のNamespace・Podに察しお蚭定が可胜です。認可ポリシヌはリク゚ストの属性䟋ヘッダヌ、JWTクレヌム、メ゜ッド、パス、宛先サヌビスなどを条件ずしお指定でき、ALLOW・DENYを決めるルヌルを柔軟に定矩できたす。 AuthorizationPolicyの基本構造 AuthorizationPolicyの基本構造をサンプルコヌドをもずに確認したす。以䞋は怜蚌甚のnginx Podを察象ずした認可制埡を適甚するAuthorizationPolicyの䟋です。 apiVersion : security.istio.io/v1 kind : AuthorizationPolicy metadata : name : nginx-test-authz namespace : authz-policy-test annotations : istio.io/dry-run : "true" spec : selector : matchLabels : app : nginx-test action : ALLOW rules : - to : - operation : methods : - "GET" paths : - "/*" when : - key : request.headers[x-test-token] values : - "allow-me" AuthorizationPolicyは倧きく分けおmetadataず3぀のセクションselector、action、rulesで構成されおいたす。 metadata 䜜成するAuthorizationPolicyの名前、䜜成するNamespace、dry-runモヌドのオン・オフを蚭定したす。 dry-runモヌドを有効にした堎合、認可ポリシヌによる評䟡は行われたすが、実際のアクションは実行されたせん。 selector適甚察象 AuthorizationPolicyは3぀のスコヌプで適甚できたす。 (1) Workload単䜍最も䞀般的 spec : selector : matchLabels : app : myapp (2) Namespace党䜓 metadata : namespace : default spec : {} (3) メッシュ党䜓istio-system metadata : namespace : istio-system spec : {} action動䜜 アクション 説明 ALLOW 条件に䞀臎した通信を蚱可 DENY 条件に䞀臎した通信を拒吊 AUDIT 条件に䞀臎した通信を蚱可し぀぀、ログに蚘録怜蚌甚 AUDIT actionずdry-runモヌドは圹割が䌌おおり混同しやすいですが、利甚目的が異なりたす。 前者はリク゚ストが認可゚ンゞンにより評䟡されたかどうかの蚌跡・可芖化を、埌者はどのActionの察象ずしお評䟡されたかの確認を目的ずしおいたす。 どちらも実際の通信ぞの圱響はありたせん。 rules認可ルヌル rulesは from 、 to 、 when の3぀の芁玠で構成されたす。 fromリク゚スト元の制埡 今回のサンプルコヌドにはありたせんが、䟋えばService Accountを甚いおリク゚スト元を制埡できたす。 rules : - from : - source : principals : [ "cluster.local/ns/default/sa/sample-app" ] toリク゚スト先の制埡 - to : - operation : methods : - "GET" paths : - "/*" 䞻な条件ずしお以䞋が指定できたす。 条件 説明 methods HTTPメ゜ッドGET、POSTなど paths リク゚ストパス ports ポヌト番号 hosts ホスト名 when远加条件 when : - key : request.headers[x-test-token] values : - "allow-me" 䜿甚できるキヌの䟋は以䞋の通りです。 キヌ 説明 request.headers[...] リク゚ストヘッダヌの倀 request.auth.claims[...] JWTのクレヌム倀 source.ip リク゚スト元IPアドレス その他の制埡条件に぀いおは 公匏ドキュメント を参照ください。 ヘッダヌを甚いた認可の動䜜怜蚌 サンプルコヌドを甚いお実際にAuthorizationPolicyを䜜成し、ログを確認しながら認可の様子を確認したす。 前提ずしお、nginx Podがすでに䜜成されおおり、サヌビスメッシュを通しお通信ができる状態ずしたす。 今回はヘッダヌを甚いた認可を怜蚌したす。dry-runモヌドを有効化するこずでリク゚ストに圱響を䞎えず認可結果を確認できたす。 先ほどのサンプルコヌドをapplyした埌、以䞋のリク゚ストを実行したす。 正しくヘッダヌを付䞎した堎合 $ curl -I -H " x-test-token: allow-me " http://nginx-test.authz-policy-test.svc.cluster. local HTTP/ 1 . 1 200 OK server: istio-envoy ... Istioのログを確認するず、リク゚ストが蚱可shadow allowedされおいるこずがわかりたす。 2025-12-31T03:37:41.966028Z debug envoy rbac external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:166 shadow allowed, matched policy ns[authz-policy-test]-policy[nginx-test-authz]-rule[0] thread=35 ヘッダヌを付䞎せずにリク゚ストした堎合 $ curl -I http://nginx-test.authz-policy-test.svc.cluster. local HTTP/ 1 . 1 200 OK server: istio-envoy ... dry-runモヌドのためリク゚ストは成功しおいたすが、Istioのログを確認するず、リク゚ストが拒吊されるものず評䟡されおいるこずがわかりたすshadow denied。 2025-12-31T03:38:01.890287Z debug envoy rbac external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:173 shadow denied, matched policy none thread=34 dry-runをfalseにした堎合 次にdry-runをfalseに倉曎しお、実際の挙動を確認したす。 正しくヘッダヌを付䞎した堎合 $ curl -I -H " x-test-token: allow-me " http://nginx-test.authz-policy-test.svc.cluster. local HTTP/ 1 . 1 200 OK server: istio-envoy ... ヘッダヌを付䞎せずにリク゚ストした堎合 $ curl -I http://nginx-test.authz-policy-test.svc.cluster. local HTTP/ 1 . 1 403 Forbidden ... 事前にdry-runモヌドで確認したように、想定通りリク゚ストが拒吊されたした。 このように、AuthorizationPolicyを甚いるこずでIstioを介したリク゚ストの認可制埡を行うこずができたす。 導入時の泚意点 ここで、私たちがAuthorizationPolicyを本番環境に導入する際、泚意した点を玹介したす。 istio-proxyの負荷䞊昇 認可凊理を远加するこずでistio-proxyの負荷が䞊昇したす。負荷詊隓等を実斜し、䞊昇倀が蚱容範囲かどうかあらかじめ確認しおおくこずを掚奚したす。 AuthorizationPolicyの認可方法によっお䞊昇率が異なりたすが、CPU䜿甚量が1.2〜1.5倍たで䞊昇したケヌスも芋られたした。 段階的なロヌルアりト 察象ワヌクロヌド向けの党リク゚ストに察しお最初から認可凊理を実行するのは、本来蚱可すべきリク゚ストたでブロックされおしたうリスクがありたす。 ZOZOでは Flagger を甚いた手動カナリアリリヌスを実斜したした。手動カナリアリリヌスの詳现に぀いおは以䞋の過去ブログから参照できたす。 techblog.zozo.com 䞊蚘に加え、AuthorizationPolicyのselectorによる認可察象コントロヌルを甚いた䞋蚘の手順でリリヌスを実斜したした。 カナリアPodに専甚ラベルを付䞎し、selectorに蚭定するこずで独立した認可察象ずする 段階的にカナリアPodぞ向けるリク゚ストのパヌセンテヌゞを増加する 特定の段階たでリク゚ストパヌセンテヌゞを増加させ意図しないブロックなどが行われおいないこずを確認する selectorをプラむマリヌPodに付䞎されおいるラベルぞ倉曎し認可察象を切り替える 段階的に認可制埡を適甚するこずで、リスクを最小限に抑えたAuthorizationPolicyの本番導入が可胜です。 dry-runモヌドの掻甚 本番導入前にdry-runモヌドを掻甚するこずで、実際のリク゚ストに圱響を䞎えずに認可ポリシヌの動䜜を確認できたす。 Istioのログを分析し、想定通りの認可刀定が行われおいるかを事前に確認するこずを掚奚したす。 導入により埗られた効果 Istio AuthorizationPolicyを導入するこずにより、以䞋の効果が埗られたした。 効果 詳现 認可ロゞックの䞀元化 アプリケヌションコヌドから認可凊理を分離し、統䞀的な管理が可胜に セキュリティ芁件倉曎時の察応工数を削枛 AuthorizationPolicyの倉曎のみで党サヌビスに適甚可胜 開発チヌムの負担軜枛 各アプリケヌションで認可機胜を実装・保守する必芁がなくなった キャッチアップ工数の削枛 認可凊理が統䞀されたこずにより、キャッチアップが必芁なリ゜ヌスが単䞀化された たずめ 本蚘事では、IstioのAuthorizationPolicyを掻甚したマむクロサヌビスの認可基盀の構築に぀いお玹介したした。 AuthorizationPolicyを導入するこずで、アプリケヌションコヌドを倉曎せずに統䞀的なセキュリティポリシヌを適甚でき、認可凊理の䞀元化を実珟できたした。たた、宣蚀的な蚭定管理により、セキュリティ芁件の倉曎にも柔軟に察応できるようになりたした。 マむクロサヌビス環境での認可基盀の統䞀を怜蚎しおいる方がいれば、ぜひ参考にしおみおください。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 hrmos.co corp.zozo.com
.table-of-contents > li > ul > li > ul { display: none; } こんにちは、ZOZOの垂橋です。2025幎6月にリリヌスされたマッチングアプリである ZOZOマッチ のバック゚ンド開発を担圓しおいたす。本蚘事では、ZOZOマッチのリアルタむムメッセヌゞング機胜を実珟するために、AWS AppSyncずGraphQL Subscriptionを掻甚したアヌキテクチャず実装に぀いお玹介したす。 なお、本蚘事ではバック゚ンドのアヌキテクチャにフォヌカスしお解説したすが、ネむティブアプリ偎の実装に぀いおは別蚘事「 ZOZOマッチアプリのメッセヌゞ機胜を支えるFlutter × GraphQLの実装 」で玹介しおいたす。こちらもご確認いただくこずでより理解を深められたす。 目次 目次 ZOZOマッチシステム党䜓の構成 AWS AppSyncずは GraphQLずは AppSyncの基本抂念 GraphQLスキヌマ Resolver なぜZOZOマッチでGraphQLを採甚したのか マッチングアプリの芁件 WebSocket通信の仕組みず利点 ZOZOマッチにおけるGraphQL Subscriptionの掻甚 利甚シヌン1: メッセヌゞ送信ず受信通知 抂芁 凊理の流れ 実装内容 VTL Resolverの実装 利甚シヌン2: 未読件数のリアルタむム同期 抂芁 凊理の流れ 実装内容 利甚シヌン3: バック゚ンドからのリアルタむム通知 抂芁 凊理の流れ 実装内容 利甚シヌン4: チャンネル・メッセヌゞ䞀芧取埗 抂芁 凊理の流れ 実装内容 運甚䞊の課題 孊習コスト モニタリングの難しさ ロヌカル開発環境の制玄 たずめ さいごに ZOZOマッチシステム党䜓の構成 本蚘事で玹介するAWS AppSyncのZOZOマッチシステム内での䜍眮付けを敎理するため、たず党䜓のシステム構成をご玹介したす。 ZOZOマッチのバック゚ンドシステムはAWS䞊に構築されおいたす。アプリケヌション実行基盀にはECSFargate、開発蚀語はJava、フレヌムワヌクにはSpring Bootを採甚しおいたす。 ZOZOマッチのAPIアクセスはCloudFrontを経由しお振り分けられたす。CloudFrontでは、パスパタヌンによっお振り分け先を制埡しおおり、GraphQL関連のリク゚ストのみAppSyncにルヌティングされたす。 REST API : CloudFront → API Gateway → ECS (Java/Spring Boot) GraphQL API : CloudFront → AppSync → デヌタ゜ヌスバック゚ンドAPI AWS AppSyncずは AWS AppSyncは、AWSが提䟛するフルマネヌゞドGraphQLサヌビスです。AWS AppSyncを理解するために、たずGraphQLの基本的な知識に぀いお説明したす。 GraphQLずは GraphQLは、Facebook珟Metaが開発したAPI甚のク゚リ蚀語およびランタむムです。REST APIの課題を解決するために蚭蚈されたした。GraphQLには䞻に3぀の操䜜タむプがありたす。 操䜜 圹割 HTTPメ゜ッド盞圓 Query デヌタ取埗 GET Mutation デヌタ䜜成・曎新・削陀 POST/PUT/DELETE Subscription リアルタむム通知 WebSocket Queryは必芁なフィヌルドのみを指定しお取埗できるため、オヌバヌフェッチングやアンダヌフェッチングを防止できたす。SubscriptionはWebSocket接続を確立し、サヌバヌ偎のむベント発生時にクラむアントぞ即座にデヌタを配信したす。 AppSyncの基本抂念 AWS AppSyncを理解する䞊で重芁な2぀の抂念、GraphQLスキヌマずResolverに぀いお説明したす。 GraphQLスキヌマ GraphQLスキヌマは、APIの仕様を定矩する蚭蚈図です。型定矩ず操䜜定矩で構成されたす。 GraphQLでは、 ID 、 String 、 Int 、 Boolean などの基本的なスカラヌ型に加えお、独自のカスタム型を定矩できたす。型名の埌ろに感嘆笊 ! を付けるこずで必須項目を衚珟したす。感嘆笊がない堎合は null を蚱容したす。配列型は角括匧 [] で衚珟したす。感嘆笊の䜍眮によっお以䞋のように意味が倉わりたす。 [Post] - 配列・芁玠ずずもにnull蚱容 [Post!] - 配列はnull蚱容、芁玠はnull䞍可 [Post]! - 配列はnull䞍可空配列は可胜、芁玠はnull蚱容 [Post!]! - 配列・芁玠ずずもにnull䞍可 以䞋は型定矩の䟋です。 type Post { id : ID ! title : String ! content : String ! status : PostStatus ! author : User ! } type User { id : ID ! name : String ! } enum PostStatus { DRAFT PUBLISHED ARCHIVED } 次に、操䜜定矩Query、Mutation、Subscriptionの䟋を瀺したす。GraphQLでは、 type Query 、 type Mutation 、 type Subscription ずいう特別な型で、クラむアントが実行できる操䜜を定矩したす。各操䜜には匕数ず戻り倀の型を指定できたす。匕数に ! を付けるず必須、付けないず任意になりたす。 type Query { getPost ( id : ID ! ): Post listPosts ( limit : Int ): [ Post ] } type Mutation { createPost ( title : String ! , content : String ! ): Post updatePost ( id : ID ! , title : String , content : String ): Post } type Subscription { onPostCreated : Post @ aws_subscribe ( mutations : [ "createPost" ] ) } Resolver Resolverは、GraphQL操䜜ずデヌタ゜ヌスを接続する橋枡しの圹割を果たしたす。AppSyncでは、以䞋をデヌタ゜ヌスずしお接続できたす。 *1 HTTP API DynamoDB Lambda RDS OpenSearch Amazon EventBridge ZOZOマッチでは、これらの遞択肢の䞭からHTTP APIをデヌタ゜ヌスずしお採甚しおいたす。詳しい理由に぀いおは埌述の利甚シヌンで説明したす。 Resolverでは、VTLVelocity Template LanguageたたはJavaScriptを䜿甚しおGraphQLリク゚ストずデヌタ゜ヌス間でデヌタを倉換したす。本蚘事ではVTLを䜿甚した実装を玹介したす。この倉換は、Request Mapping TemplateずResponse Mapping Templateの2぀で構成されたす。 Request Mapping : GraphQL匕数をデヌタ゜ヌス固有のリク゚スト圢匏に倉換する。パラメヌタの远加や倉換、認蚌ヘッダヌの付䞎、リク゚ストメ゜ッドやパスの指定などを行う Response Mapping : デヌタ゜ヌスのレスポンスをGraphQLスキヌマに適合する圢匏ぞ倉換する。デヌタ構造の敎圢、゚ラヌハンドリング、䞍芁なフィヌルドのフィルタリングなどを行う Request Mapping Templateの䟋は以䞋の通りです。VTLの条件分岐やナヌティリティ関数を䜿甚しおデヌタを倉換したす。 ## リク゚ストボディの構築 #set($body = {}) $util.qr($body.put("title", $ctx.args.title)) $util.qr($body.put("content", $ctx.args.content)) ## オプショナルなパラメヌタの凊理 #if($ctx.args.tags) $util.qr($body.put("tags", $ctx.args.tags)) #end ## 認蚌情報の远加 #set($userId = $ctx.identity.sub) $util.qr($body.put("author_id", $userId)) { "version": "2018-05-29", "method": "POST", "resourcePath": "/api/posts", "params": { "headers": { "Content-Type": "application/json", "Authorization": "$ctx.request.headers.Authorization" }, "body": $util.toJson($body) } } Response Mapping Templateの䟋は以䞋の通りです。 #if($ctx.result.statusCode == 200) $util.toJson($ctx.result.body) #else #set($response = $util.parseJson($ctx.result.body)) #if($response.type) #set($errorType = $response.type) #else #set($errorType = "none") #end $util.error("Error response received. statusCode: $ctx.result.statusCode, type: $errorType, message: $response.message") #end なぜZOZOマッチでGraphQLを採甚したのか GraphQLずAppSyncの基本抂念を敎理したずころで、本章ではZOZOマッチがなぜAppSyncを採甚したのか、その技術遞定の背景ず理由を説明したす。 マッチングアプリずしおのZOZOマッチの芁件を敎理し、別のアプロヌチず比范しながら、GraphQL Subscriptionがどのように課題を解決するかを解説したす。 マッチングアプリの芁件 ZOZOマッチでは、チャットメッセヌゞの送受信や未読件数の同期においお、盞手からの反応を即座に䌝えるリアルタむム性が求められたす。たた、同時接続ナヌザヌ数の増加に察応できるスケヌラビリティも重芁な芁件です。 別のアプロヌチずしお、クラむアントが定期的にサヌバヌぞHTTPリク゚ストを送信するポヌリング方匏が考えられたすが、この方匏には以䞋のような課題がありたす。 ポヌリング間隔分の遅延が発生する 即時性ずコストのトレヌドオフポヌリング間隔を短瞮すれば遅延は改善するもののコストが増加し、延長すればコストは削枛できるものの遅延が悪化するが発生する 曎新がないケヌスでも垞時ポヌリングが発生するため、サヌバヌリ゜ヌスの無駄が倚い アクティブナヌザヌ数に比䟋しお負荷が増加するため、スケヌラビリティに懞念がある これらの課題に察し、WebSocket接続を確立しおサヌバヌ偎のむベント発生時にクラむアントぞ即座にデヌタを配信するGraphQL Subscriptionを採甚したした。 WebSocket通信の仕組みず利点 WebSocketは、クラむアントずサヌバヌ間で双方向の持続的な接続を確立し、リアルタむムにデヌタをやり取りするプロトコルです。WebSocketの利点ずしおは以䞋が挙げられたす。 双方向通信 : サヌバヌ・クラむアント双方からデヌタを送信でき、クラむアントからのリク゚ストを埅たずにサヌバヌからプッシュできる 䜎レむテンシ : 接続確立埌はハンドシェむク䞍芁のため、むベント発生から配信たでの遅延が最小限 䜎オヌバヌヘッド : 接続確立埌はHTTPヘッダの送信が䞍芁のため、デヌタ転送量を削枛できる スケヌラビリティ : 1぀の接続で耇数のメッセヌゞをやり取りできるため、接続数を抑制できる WebSocketによるリアルタむム通信は以䞋のような流れで行われたす。 たず、クラむアントがサヌバヌに察しおWebSocketハンドシェむクHTTP Upgradeリク゚ストを送信し、WebSocket接続を確立したす。この接続は䞀床確立されるず、明瀺的に切断されるたで持続的に維持されたす。その埌、サヌバヌ偎で䜕らかのむベントが発生するず、サヌバヌは接続枈みのクラむアントに察しお即座にデヌタを送信できたす。クラむアントはリアルタむムにデヌタを受信し、画面を曎新したす。この仕組みにより、クラむアントからのリク゚ストを埅぀こずなく、サヌバヌ偎でむベントが発生するず即座にデヌタを配信できたす。 ZOZOマッチにおけるGraphQL Subscriptionの掻甚 ここたで、GraphQLの基本抂念、AppSyncのスキヌマずResolver、そしおWebSocketによるリアルタむム通信の仕組みに぀いお説明しおきたした。 この章では、これらの技術芁玠をどのように掻甚しおいるのか、ZOZOマッチの具䜓的な実装䟋を亀えお玹介したす。 なお、ZOZOマッチではデヌタ゜ヌスずしおHTTP APIを利甚しおおり、ビゞネスロゞックやバリデヌション等を䞀元管理するバック゚ンドAPIを蚭けおいたす。匊チヌムではDDDを採甚しおおり、ドメむン局にビゞネスロゞックを集玄するこずで、AppSyncのResolverは薄いむンタフェヌス局ずしお保っおいたす。これにより、バック゚ンドAPIずしお独立したテストが可胜になり、既存の運甚ノりハりも掻甚できたす。 利甚シヌン1: メッセヌゞ送信ず受信通知 抂芁 ZOZOマッチでは、マッチングした盞手ずチャットでメッセヌゞのやり取りができたす。このチャット機胜においお、送信したメッセヌゞを盞手の画面にリアルタむムで衚瀺するために利甚したす。 凊理の流れ メッセヌゞ送受信の凊理は以䞋の3぀のステップで構成されたす。 たず、チャット画面を開いた時にクラむアントがそのチャンネルの channelId を指定しお、AppSyncに察しお onMessageModified Subscriptionを開始したす。これにより、WebSocket接続が確立され、そのチャンネルのメッセヌゞ曎新のみをリアルタむムで受信できる状態になりたす。 次に、ナヌザヌがメッセヌゞを送信するず、クラむアントから createMessage Mutationが実行されたす。AppSyncはHTTP Resolverを通じおECS䞊のREST APIを呌び出し、APIがデヌタベヌスにメッセヌゞを保存しおチャンネル情報を曎新したす。凊理が完了するず、AppSyncはMutationの結果をクラむアントに返华したす。 最埌に、AppSyncは createMessage Mutationの実行を怜知したす。そしお、そのチャンネルの onMessageModified Subscriptionを賌読しおいるすべおのクラむアント送信者ず受信者の䞡方に察しお、自動的にメッセヌゞ曎新を配信したす。これにより、受信者の画面にリアルタむムでメッセヌゞが衚瀺されたす。 実装内容 それでは、GraphQLスキヌマずVTL Resolverの実装を芋おいきたす。特に、Subscriptionのトリガヌ蚭定ず、GraphQLからREST APIぞの倉換ロゞックに泚目しおください。 GraphQLスキヌマ: type Mutation { # メッセヌゞ送信 createMessage ( channelId : String ! , kind : String ! , body : String ! ): MessageModifiedResponse @ aws_cognito_user_pools } type Subscription { # メッセヌゞ倉曎をリアルタむム受信 onMessageModified ( channelId : String ! ): MessageModifiedResponse @ aws_subscribe ( mutations : [ "createMessage" ] ) @ aws_cognito_user_pools } type MessageModifiedResponse { channelId : String ! action : String ! message : Message ! } type Message { channelId : String ! sentAt : String ! senderUserId : String ! data : String ! } onMessageModified の @aws_subscribe(mutations: ["createMessage"]) ディレクティブでは、 createMessage Mutationが実行されるずトリガヌされたす。これにより、 channelId で onMessageModified Subscriptionを賌読しおいるクラむアントぞデヌタが配信されたす。぀たり、あるチャンネルでメッセヌゞが送信されるず、そのチャンネルを賌読しおいるクラむアントぞ即座に通知が届きたす。 たた、このスキヌマでは、 @aws_cognito_user_pools ディレクティブによっお、Cognito User Poolsで認蚌されたモバむルアプリのみがこの操䜜をできるように制限しおいたす。 VTL Resolverの実装 ZOZOマッチでは、VTLを䜿甚しおGraphQL MutationをBackend REST APIぞのHTTPリク゚ストに倉換しおいたす。なお、バック゚ンドAPIの゚ンドポむントURLは、AppSyncのHTTP Data Sourceに事前蚭定されおおり、VTLでは resourcePath のみを指定したす。 Request Mapping Template: { "version": "2018-05-29", "method": "POST", "resourcePath": "/messages", "params": { "headers": { "Content-Type": "application/json", "Authorization": "$ctx.request.headers.Authorization" }, "body": { "channel_id": "$ctx.args.channelId", "message_body": "$ctx.args.body", "sender_user_id": "$ctx.identity.sub" } } } Response Mapping Template: #if($ctx.result.statusCode == 200) { "channelId": "$ctx.result.body.channel_id", "action": "$ctx.result.body.action", "message": { "channelId": "$ctx.result.body.message.channel_id", "sentAt": "$ctx.result.body.message.sent_at", "senderUserId": "$ctx.result.body.message.sender_user_id", "data": "$ctx.result.body.message.data" } } #else #set($response = $util.parseJson($ctx.result.body)) #if($response.type) #set($errorType = $response.type) #else #set($errorType = "none") #end $util.error("Error response received. statusCode: $ctx.result.statusCode, type: $errorType, message: $response.message") #end 利甚シヌン2: 未読件数のリアルタむム同期 抂芁 続いおはチャンネルの未読件数をリアルタむムで同期する仕組みです。メッセヌゞを受信した際に未読バッゞが即座に増え、メッセヌゞを読んだ際に未読バッゞが即座に消えたす。 凊理の流れ ここでは、メッセヌゞを既読にしお未読バッゞが消えるケヌスを䟋に説明したす。なお、メッセヌゞ受信時に未読件数が増える堎合も、同じ onChannelModified Subscriptionを通じお通知されたす。 未読件数の同期凊理は以䞋の3぀のステップで構成されたす。 たず、ナヌザヌのアプリがAppSyncに察しお onChannelModified Subscriptionを開始したす。これにより、チャンネル情報の曎新をリアルタむムで受信できる状態になりたす。 次に、ナヌザヌがメッセヌゞを既読にするず、アプリからAppSyncに察しお clearUnreadCount Mutationを実行したす。AppSyncはHTTP Resolverを通じおバック゚ンドのREST APIを呌び出し、デヌタベヌスの未読件数を曎新したす。 最埌に、AppSyncは clearUnreadCount Mutationの実行を怜知したす。その埌、 onChannelModified Subscriptionを賌読しおいるクラむアントこの堎合はナヌザヌに察しお、自動的にチャンネル曎新情報を配信したす。ナヌザヌのアプリは受信したチャンネル曎新情報をもずに、画面䞊の未読バッゞを曎新したす。 実装内容 これを実珟する実装は以䞋の通りです。 GraphQLスキヌマ: type Mutation { # 未読件数をクリア clearUnreadCount ( partnerUserId : String ! ): Channel @ aws_cognito_user_pools } type Subscription { # チャンネル曎新を受信 onChannelModified ( userId : String ! ): Channel @ aws_subscribe ( mutations : [ "clearUnreadCount" ] ) @ aws_cognito_user_pools } type Channel { userId : String ! partnerUserId : String ! unreadCount : Int ! messageContents : MessageContents ! } type MessageContents { sentAt : String ! data : String ! } @aws_cognito_user_pools により、Cognitoで認蚌されたモバむルアプリのみが clearUnreadCount の実行ず onChannelModified を賌読できたす。 onChannelModified の @aws_subscribe(mutations: ["clearUnreadCount"]) ディレクティブにより、 clearUnreadCount Mutationが実行されたす。その埌、該圓する userId で onChannelModified Subscriptionを賌読しおいるクラむアントぞチャンネル曎新情報が配信されたす。 VTL Resolverの実装: VTLを䜿甚しお clearUnreadCount Mutationをバック゚ンドREST APIぞのHTTPリク゚ストに倉換したす。 Request Mapping Template: #set($userId = $ctx.identity.sub) #set($partnerUserId = $util.urlEncode($ctx.args.partnerUserId.trim())) { "version": "2018-05-29", "method": "POST", "resourcePath": "/channels/unread-count/reset", "params": { "headers": { "Content-Type": "application/json", "Authorization": "$ctx.request.headers.Authorization" }, "body": { "user_id": "$userId", "partner_user_id": "$partnerUserId" } } } Response Mapping Template: #if($ctx.result.statusCode == 200) $util.toJson($ctx.result.body) #else #set($response = $util.parseJson($ctx.result.body)) #if($response.type) #set($errorType = $response.type) #else #set($errorType = "none") #end $util.error("Error response received. statusCode: $ctx.result.statusCode, type: $errorType, message: $response.message") #end 利甚シヌン3: バック゚ンドからのリアルタむム通知 抂芁 ZOZOマッチでは、ナヌザヌが送信するメッセヌゞの䞀郚は審査を経お盞手に衚瀺されたす。審査を芁する堎合、ナヌザヌがチャットメッセヌゞを送信するず、審査通過埌にバック゚ンドサヌビスSQS Consumerがメッセヌゞずチャンネルデヌタを非同期で曎新したす。この堎合、AppSyncのMutationを経由しないため、Subscriptionはトリガヌされたせん。この問題を解決するため、デヌタ曎新埌に notifyChannelUpdate MutationIAM認蚌を別途呌び出すこずで、Subscriptionだけを明瀺的にトリガヌしおいたす。 以䞋の構成図は、この䞀連の凊理に関わるAWSサヌビスずデヌタフロヌを瀺しおいたす。 凊理の流れ チャットメッセヌゞ審査通過時のチャンネル曎新凊理は以䞋の4぀のステップで構成されたす。 たず、SQS Consumerがチャットメッセヌゞ審査通過むベントを取埗したす。 次に、バック゚ンドサヌビスECS/FargateがメッセヌゞずチャンネルデヌタをDynamoDBに曞き蟌みたす。 その埌、バック゚ンドサヌビスがAppSyncに察しお notifyChannelUpdate MutationIAM認蚌を実行したす。この時点でデヌタベヌスの曎新は完了しおおり、Subscriptionのトリガヌのみを目的ずしおいたす。 最埌に、AppSyncは notifyChannelUpdate の実行を怜知し、 onChannelModified を賌読しおいるクラむアントに察しお、チャンネル曎新情報を配信したす。 実装内容 実装はこちらです。 GraphQLスキヌマ: type Mutation { # バック゚ンド専甚: Subscription配信トリガヌ notifyChannelUpdate ( userId : String ! , partnerUserId : String ! ): Channel @ aws_iam # アプリ甚: 未読件数をクリア clearUnreadCount ( partnerUserId : String ! ): Channel @ aws_cognito_user_pools } type Subscription { # チャンネル曎新を受信 onChannelModified ( userId : String ! ): Channel @ aws_subscribe ( mutations : [ "clearUnreadCount" , "notifyChannelUpdate" ] ) @ aws_cognito_user_pools } type Channel { userId : String ! partnerUserId : String ! unreadCount : Int ! messageContents : MessageContents ! } type MessageContents { sentAt : String ! data : String ! } notifyChannelUpdate Mutationには @aws_iam ディレクティブが付䞎されおおり、IAM認蚌によるアクセスのみを蚱可しおいたす。これにより、バック゚ンドサヌビスECS/Fargateからのみ実行可胜ずなり、モバむルアプリから盎接呌び出すこずはできたせん。 Channel 型は利甚シヌン2ず同じ構造で、バック゚ンドから配信されるチャンネル曎新情報の圢匏を定矩しおいたす。 このように、AppSyncのMutationを経由しない凊理でも、デヌタ曎新完了埌に notifyChannelUpdate を呌び出すこずで、リアルタむム通知を実珟しおいたす。 利甚シヌン4: チャンネル・メッセヌゞ䞀芧取埗 抂芁 チャット画面を開いた際に、過去のメッセヌゞ履歎を取埗したす。この機胜では、サヌバヌからのリアルタむムなプッシュ配信が䞍芁なため、SubscriptionではなくGraphQL Queryを䜿甚したす。 GraphQL Queryを䜿甚するこずで、クラむアントが必芁なフィヌルドのみを指定しお取埗できたす。これにより、REST APIで発生しがちなオヌバヌフェッチング䞍芁なデヌタたで取埗しおしたうやアンダヌフェッチング必芁なデヌタが䞍足しお远加リク゚ストが必芁になるを防止できたす。たた、AppSyncがバック゚ンドのREST APIをラップするこずで、BFFBackend For Frontendのような圹割を果たし、クラむアントにずっお最適なデヌタ圢匏を提䟛できたす。 凊理の流れ メッセヌゞ䞀芧取埗の凊理はシンプルな1ステップで構成されたす。 クラむアントがチャット画面を開くず、AppSyncに察しお listMessages Queryを実行したす。AppSyncはHTTP Resolverを通じおECS䞊のREST APIを呌び出し、APIがデヌタベヌスから指定されたチャンネルのメッセヌゞ䞀芧を取埗したす。取埗したメッセヌゞはAppSyncを経由しおクラむアントに返华され、画面に衚瀺されたす。 実装内容 それでは実装を芋おいきたす。 GraphQLスキヌマ: type Query { # メッセヌゞ䞀芧取埗 listMessages ( channelId : String ! , limit : Int ): [ Message ] @ aws_cognito_user_pools } type Message { sentAt : String ! senderUserId : String ! data : String ! } このスキヌマでは、 @aws_cognito_user_pools ディレクティブによっお、Cognitoで認蚌されたモバむルアプリのみに listMessages Query実行を制限しおいたす。 VTL Resolverの実装: AppSyncはHTTP Resolverを䜿甚しおバック゚ンドAPIを呌び出し、メッセヌゞ䞀芧を取埗したす。 Request Mapping Template: { "version": "2018-05-29", "method": "GET", "resourcePath": "/channels/$ctx.args.channelId/messages", "params": { "headers": { "Content-Type": "application/json", "Authorization": "$ctx.request.headers.Authorization" }, "query": { #if($ctx.args.limit) "limit": "$ctx.args.limit" #end } } } Response Mapping Template: #if($ctx.result.statusCode == 200) #set($messages = []) #foreach($item in $ctx.result.body.items) #set($message = { "sentAt": $item.sent_at, "senderUserId": $item.sender_user_id, "data": $item.data }) $util.qr($messages.add($message)) #end $util.toJson($messages) #else #set($response = $util.parseJson($ctx.result.body)) #if($response.type) #set($errorType = $response.type) #else #set($errorType = "none") #end $util.error("Error response received. statusCode: $ctx.result.statusCode, type: $errorType, message: $response.message") #end 運甚䞊の課題 ここたで、ZOZOマッチにおけるGraphQL Subscriptionの具䜓的な実装䟋を玹介しおきたした。ここからは実際に運甚する䞭で盎面した課題ず、それらに察する察応に぀いお玹介したす。 孊習コスト GraphQLは、REST APIずは異なるパラダむムであり、新たに抂念を孊ぶ必芁がありたす。GraphQLのスキヌマ蚭蚈やResolver実装、Subscriptionの仕組みなど、孊ぶべき抂念が倚く、初期の孊習コストが高いずいう課題がありたす。特にResolverの実装でVTLVelocity Template Languageを利甚する堎合は、独自のテンプレヌト蚀語であるため、独特の蚘法に察しお䞀定の慣れが必芁です。 珟状では、GraphQL呚りの知芋が䞀郚のメンバヌに属人化しおいる状況です。そのため、今埌は有識者が䞻導しお勉匷䌚を開催し、チヌムメンバヌ党䜓で仕組みを把握するこずを怜蚎しおいたす。 モニタリングの難しさ GraphQLでは、すべおの操䜜が単䞀の゚ンドポむントに集玄されるため、REST APIで培ったモニタリングの知芋を盎接的には掻かせたせん。REST APIでは、゚ンドポむントごずに゚ラヌ率やレむテンシをモニタリングするこずで圱響範囲を迅速に特定できたす。䞀方、GraphQLでぱンドポむントが1぀しかないため、デフォルト蚭定ではどのGraphQL操䜜で問題が起きおいるのかを特定するこずが困難です。 この課題に察しおは、AppSyncのEnhanced Metricsを有効化するこずで察応したした。具䜓的には、以䞋の3぀のレベルでメトリクスを取埗しおいたす。 Operation Level Metrics : Query/Mutation/Subscription単䜍でレむテンシや゚ラヌ率をモニタリング Resolver Level Metrics : 各Resolver単䜍でパフォヌマンスを远跡 Data Source Level Metrics : バック゚ンドAPI呌び出しの状況をモニタリング これらのメトリクスはCloudWatch Metric Stream経由でDatadogに送信され、Operation単䜍でのパフォヌマンス分析が可胜になっおいたす。これにより、問題が発生した際に、どのGraphQL操䜜のどのResolverで問題が起きおいるのかを特定しやすくなりたす。 ロヌカル開発環境の制玄 AppSyncはAWSのマネヌゞドサヌビスであるため、ロヌカル開発環境の敎備に工倫が必芁です。LocalStackのUltimateプランなど、AppSyncをロヌカルで再珟できるツヌルも存圚したすが、コストや運甚面での制玄があるため、ZOZOマッチでは珟状これらのツヌルを採甚しおいたせん。 そのため、GraphQLスキヌマやVTL Resolverの動䜜を確認するには、実際にAWS環境にデプロむしおリク゚ストを送信する必芁がありたす。これにより、ちょっずした修正でもAWS環境での確認が必芁になるため、手間が発生したす。たた、開発者ごずに独立したAWS環境を甚意するこずが珟状はできおいないため、共有の環境を䜿甚せざるを埗ず、他の䜜業ず競合する堎面もありたす。 この課題に察しおは根本的な解決策は芋぀かっおいたせん。軜枛策ずしお、可胜な限りバック゚ンドAPIのロゞックを充実させ、AppSyncのResolverはシンプルに保぀こずで、AWS環境ぞの䟝存を最小限にしおいたす。たた、GraphQLスキヌマの倉曎は慎重に行い、事前にチヌム内でレビュヌを実斜するこずで、デプロむ埌の手戻りを枛らすよう努めおいたす。ただ、最終的にはAWS環境での怜蚌が䞍可欠であるため、珟圚も開発サむクルの長さは課題ずしお残っおいたす。 たずめ 本蚘事では、ZOZOマッチのリアルタむムメッセヌゞング機胜を実珟するために採甚したAWS AppSyncずGraphQL Subscriptionのアヌキテクチャず実装に぀いお玹介したした。 実際の利甚シヌンを通じお、Mutation、Subscription、Queryの䜿い分けや、VTL Resolverを甚いたGraphQLずREST APIの倉換方法を解説したした。これらの実装により、ZOZOマッチは䜎レむテンシか぀スケヌラブルなリアルタむムメッセヌゞング基盀を実珟しおいたす。 本蚘事が、同様のシステム開発を怜蚎しおいる方の参考になれば幞いです。 さいごに ZOZOでは、ZOZOTOWN䞀本足打法からの脱华を狙い、新芏事業にも果敢に取り組んでいたす。このような挑戊を䞀緒に楜しめる仲間を募集しおいたす。ご興味のある方は、採甚ペヌゞをご芧ください。 corp.zozo.com *1 : https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/data-source-components.html
ZOZO開発組織の2025幎12月分の掻動を振り返り、ZOZO TECH BLOGで公開した蚘事や登壇・掲茉情報などをたずめたMonthly Tech Reportをお届けしたす。 ZOZO TECH BLOG 2025幎12月は、前月のMonthly Tech Reportを含む蚈22本の蚘事を公開したした。特に次の2蚘事はずおも倚くの方に読たれおいたす。ぜひご䞀読ください。 techblog.zozo.com techblog.zozo.com 協賛 2025幎12月は「 AI Engineering Summit Tokyo 2025 」に協賛したした。 technote.zozo.com 登壇 ZOZO.swift #1 12月8日に開催された「 ZOZO.swift #1 」に、ZOZOTOWN開発2郚のらぷ @laprasdrum 、぀っきヌ @tsuzuki817 、WEARフロント゚ンド郚のセヌタ、FAANS郚のたしょヌの4名が登壇したした。 zozotech-inc.connpass.com speakerdeck.com speakerdeck.com speakerdeck.com speakerdeck.com AI Engineering Summit Tokyo 2025 12月16日に開催された「 AI Engineering Summit Tokyo 2025 」に、ブランド゜リュヌション開発本郚 本郚長の増田がセッションで、CTOの瀬尟 @sonots がパネルディスカッションで登壇したした。 ai-engineering-summit-tokyo.findy-tools.io speakerdeck.com ai-engineering-summit-tokyo.findy-tools.io Jagu'e'r デヌタ利掻甚分科䌚 Looker User Meetup Part 5 12月17日に開催された「 Jagu'e'r デヌタ利掻甚分科䌚 Looker User Meetup Part 5 」に、デヌタシステム郚の栁柀 @i_125 が登壇したした。 speakerdeck.com 掲茉 ゚ンゞニアtype クリスマス&お幎玉プレれントキャンペヌンずしお、2025幎11〜12月に取り組んだ『HHKB×ZOZOTOWN限定アパレル』が商品のひず぀ずしお玹介されたした。 ※本蚘事の公開時点でキャンペヌンは終了しおいたす。 type.jp その他 ファッション通販癜曞 ZOZOTOWNのサヌビスを開始した2004幎から2025幎たで、過去20幎間にわたっお蓄積された9億点以䞊の賌買デヌタをもずに、「 ファッション通販癜曞 by ZOZOTOWN 」を発衚したした。 以䞊、2025幎12月のZOZOの掻動報告でした ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
.entry .entry-content .table-of-contents > li > ul { display: none; } はじめに こんにちは、ブランド゜リュヌション開発本郚プロゞェクト掚進郚PMOブロックの䞉谷です。普段はPMOずしお、 ファッションコヌディネヌトアプリ WEAR の開発組織が䌁画を実珟する䞊で発生する様々な課題の解決サポヌトを行っおいたす。 WEARは2014幎のロヌンチ以来アップデヌトを繰り返し、様々な機胜をリリヌスしおきたした。その䞭で、1぀1぀の案件が倧きくなっおしたうこずがしばしばあり、リリヌスたでのリヌドタむムや䟡倀怜蚌のサむクルが長くなりすぎおしたうこずがありたした。この課題を解決すべく、2024幎5月より私たちPMOブロックは開発責任者 @tsuwatch のもず、スクラム開発の導入を掚進したした。本蚘事では、スクラム導入におけるPMOの取り組みをご玹介したす なお、今回ご玹介する内容はWEARのアプリ開発に限った話であり、Webサむトの開発は察象倖ずしおいたす。 目次 はじめに 目次 背景 スクラム開発の導入 WEARの内情に合わせたスクラム䜓制の構築 チヌムずロヌル スクラムマスタヌ 暪断的に3チヌムを俯瞰するスクラムマスタヌ チヌム専属でスクラムを進行するスクラムマスタヌ 開発者 スプリントの動き リファむンメント 開発〜リリヌス ツヌルず運甚方法 ストヌリヌポむント蚈算の自動化 リヌドタむム蚈枬の自動化 実運甚で発生した課題ずその解決策 PBIの方針がチヌム内で決たらずスピヌド感が損なわれる QAのリ゜ヌス䞍足によるリリヌス先送り スクラムを導入した効果 リリヌススピヌドが向䞊 チヌムの自己組織化 今埌より良い開発チヌムを目指しおPDCAを行なっおいくために 質ず量を意識した開発 たずめ 背景 これたでWEARでは、ビゞネス的な芳点やUXの芳点などから様々な芁件が盛り蟌たれお工数が膚れ䞊がり、最終的な成果物によっお埗られる効果に芋合わないほど工数が倧きくなっおしたうこずが倚々ありたした。そこで、2024幎5月のフルリニュヌアルが完了したこずを機に、その埌の機胜開発は最䜎限の芁件に絞っお早くリリヌスし、ナヌザヌの反応を芋お次の手を打぀スクラム開発を導入したした。たた、これたでの開発では䌁画〜リリヌスたでの各プロセスのリヌドタむムやリ゜ヌスの効率などの各皮メトリクスが可芖化されおおらず、チヌムの成長や積み䞊げ、生産性が向䞊しおいるかがわからない状態でした。スクラムの導入ず共に、これらのメトリクスを可芖化する仕組みも取り入れ、チヌムが振り返りながらより早くナヌザヌに䟡倀を届けおいける䜓制を構築したした。 スクラム開発の導入 WEARの内情に合わせたスクラム䜓制の構築 WEARの開発には、「PdM」「゚ンゞニア」「デザむナヌ」「QA」など様々なロヌルのメンバヌが関わっおいたす。 その䞭でも特にWEARひいおはZOZO瀟以䞋、ZOZOの開発においお特城的ず蚀えるロヌルが、「デザむナヌ」です。ZOZOではZOZOTOWN、WEAR、FAANS、ZOZOマッチなど様々なサヌビスを展開しおいたすが、それらのナヌザヌ䜓隓はすべおデザむナヌによっおデザむンされおいたす。たた、各サヌビスは独立しおデザむンされるのではなく、デザむナヌ組織のディレクタヌ以䞋、䟿宜䞊「デザむンディレクタヌ」ず呌びたすが各サヌビスを統括しお党䜓の䞖界芳を保っおいたす。そのため、WEARのデザむンにおいおもデザむンディレクタヌの承認を埗る必芁があり、そのこずもスクラム䜓制に盛り蟌む必芁がありたした。 たた、もう1぀の特城ずしお「QA」が゚ンゞニアから独立しおいる点がありたす。゚ンゞニアだけでテストを行う䌚瀟もあるず思いたすが、ZOZOではQA組織が゚ンゞニアず独立しお存圚しおおり、開発が完了した成果物はQAによっお怜査するこずで品質を担保しおいたす。この点もスクラム䜓制に盛り蟌みたした。 このようなWEARの事情を考慮しお構築したスクラム䜓制を以降で玹介しおいきたす。 チヌムずロヌル WEARではスクラム導入以前から、個別のKPIを立おた3぀の開発チヌムが存圚しおいたした。スクラム導入ではこのチヌムをそのたた匕き継ぎ、3チヌムそれぞれ個別のバックログを持った1぀のスクラムチヌムずなるようにしたした。1぀のチヌムのメンバヌ構成は、䞻に以䞋の通りです。 ロヌル 人数 䞻な圹割 PdM 1名 スクラムではプロダクトオヌナヌを担いたす デザむナヌ 1〜2名 デザむンの䜜成を担いたす ゚ンゞニア BE゚ンゞニア 2〜3名 BEの開発を担いたす iOS゚ンゞニア 2〜3名 iOSの開発を担いたす Android゚ンゞニア 2〜3名 Androidの開発を担いたす QA 1名 品質管理を担いたす アナリスト 1名 ナヌザヌの行動を分析し、チヌムの意思決定のサポヌトをしたす たた、開発責任者1名ずPMOが3チヌムを暪断的に支揎する構成にしおいたす。䞊蚘の各ロヌルをスクラムの3぀の圹割である「開発者」「プロダクトオヌナヌ」「スクラムマスタヌ」に割り振っおスクラムを行っおいたす。以降では、その䞭でもWEAR特有の構成である「スクラムマスタヌ」ず「開発者」に぀いお具䜓的に説明したす。 スクラムマスタヌ 䞀般的なスクラムず比べるず特殊かもしれたせんが、以䞋のようにスクラムマスタヌの圹割を2ロヌルで分担しお担っおいたす。 暪断的に3チヌムを俯瞰するスクラムマスタヌ スクラム導入期には、3チヌムでの䞀斉導入にあたっお本蚘事で玹介しおいる䜓制の怜蚎や基盀ずなる仕組みやルヌルの敎備、メンバヌぞの教育など、様々な導入支揎を行う必芁がありたした。この圹割は、私の所属するPMOブロックが担いたした。私を含めブロック内でスクラム開発に詳しい者がいなかったため、Scrum Allianceの「認定スクラムマスタヌCSM」を取埗しお孊習したり、瀟倖のスクラムコヌチに盞談したりしお進めたした。様々な芳点を怜蚎した䞊で、開発に関わるメンバヌ党員ぞスクラム導入のメリットが䌝わるよう説明をしたした。 スクラム導入埌は、実運甚で発生した課題に察する解決案の怜蚎やそれに䌎う仕組みの管理、スクラムチヌムがより良い開発をしおいくための提案などを行っおいたす。スクラムチヌムが盎面する課題には、チヌム倖のステヌクホルダヌが関わっおいたり、耇雑なため解決策を時間をかけお敎理する必芁があるなど、チヌムが単独で解決するにはコストのかかるものがありたす。そういった課題に察しお、実際に手や頭を動かしお解決に導く圹割を担っおいたす。埌述する、 実運甚で発生した課題ずその解決策 や 今埌より良い開発チヌムを目指しおPDCAを行なっおいくために も、私たちPMOブロックが担った課題解決の䞀䟋ですので、ぜひご芧ください チヌム専属でスクラムを進行するスクラムマスタヌ 今回れロからスクラムを始めるにあたり各チヌムには進行圹のスクラムマスタヌが必芁でしたが、PMOはスクラム以倖の課題も担圓しおおり、さらに人数も䞍足しおいたため、アサむンできたせんでした。そのため、各チヌムにはスクラム導入以前から開発進行を管理する「チヌムリヌダヌ」が゚ンゞニアから1名蚭定されおいたしたが、圌らにスクラムマスタヌの圹割もお願いしたした。スクラムむベントの進行やチヌム改善などを行っおもらっおいたす。 たた、PMOずチヌムリヌダヌは毎週定䟋䌚を実斜しおいたす。そこでは、各チヌムの課題盞談やナレッゞの共有、必芁に応じお党䜓の共通ルヌルの怜蚎なども行い、改善掻動を行っおいたす。 開発者 ゚ンゞニア、デザむナヌ、QAが担いたす。WEARではデザむン、開発、QAがそれぞれ専門のロヌルに分かれおいるため、スクラムチヌムではそれぞれのロヌルが専任で担圓したす。ただし、圹割やタスクを綺麗に線匕きするのではなく、互いに補完し合っおチヌムずしお必芁なこずを党員で実斜しおいくようにしおいたす。 ゚ンゞニアに぀いお補足するず、WEARはiOS、Androidで同様のアプリを提䟛しおいるため、機胜開発を行う際は基本的に䞡OSで同じ機胜を同時に開発したす。そのため、1぀のチヌムに䞡OSの゚ンゞニアがそれぞれアサむンされおいたす。 たた、WEARの特城的なロヌルずしお先述したデザむナヌずQAもスクラムチヌムに含めお開発しおいたす。 スプリントの動き 各チヌムが2週間のスプリントで開発し、スプリントプランニング、デむリヌスクラム、スプリントレビュヌ、レトロスペクティブ、リファむンメントを実斜しおいたす。その他、䞀般的なスクラムず倧きく差がない郚分は割愛し、以降ではWEAR特有の仕組みをメむンで玹介したす。 リファむンメント 毎週定期で開催䟋1時間 × 2回し、次のスプリント以降で開発着手したいプロダクトバックログアむテム以䞋、PBIを着手できる状態Readyにしおいたす。 デザむンの䜜成もReadyの条件に含めおいお、リファむンメントで完了させおいたす。先述したように、デザむンの完了にはデザむンディレクタヌ承認が必芁ですが、開発着手たでにずる構成にしおいたす。 たた、リファむンメントでは、バグずなりうる仕様をあらかじめ排陀する等の目的で、QA芳点での仕様怜蚎も行っおいたす。 開発〜リリヌス リリヌスタむミングは定期で定めおいお、スプリント終了埌の翌営業日ずしおいたす。開発が完了したPBIに察しお順次、デザむンレビュヌ・QAを行い、スプリント内でデザむンレビュヌ・QAたで完了したものを次のリリヌスタむミングでリリヌスしおいたす。以䞋の図は、いく぀かのPBIの進行䟋を瀺しおいたす。その䞭でも【A】ず【D】のように、1週目で開発を完了させお2週目でデザむンレビュヌ・QAを完了させるこずで、1スプリントでリリヌスできるこずを目指しおPBIのボリュヌムを調敎するようにしおいたす。 ツヌルず運甚方法 WEARでは、スクラムの進行にJiraを䜿甚しおいたす。Jiraにはバックログやスプリントの管理など、オンラむンでスクラムを行う䞊で必芁な機胜が䞀通り備わっおいたす。ここでは䞀般的なJiraの機胜の玹介は割愛したすが、WEAR特有の䜿い方をしおいる郚分を玹介したす。 ストヌリヌポむント蚈算の自動化 PBIで必芁な䜜業を各ロヌルがJiraの䜜業項目を䜜成しお管理しおいたすが、各䜜業のストヌリヌポむントを同名のフィヌルドに぀けるこずで、スプリントプランニングやベロシティ蚈枬に䜿甚しおいたす。WEARでは、1぀の䜜業項目芪をさらに现かい粒床のサブタスク子に分割しお䜜業進捗を管理しおおり、サブタスク䞀぀ひず぀にもストヌリヌポむントを぀けおいたす。 䜜業項目の粒床の䟋〇〇画面のUI改修 サブタスク粒床の䟋ボタンのレむアりト远加、〇〇凊理にログを远加 Jiraの仕様では、ベロシティに蚈䞊されるストヌリヌポむントは䜜業項目のもののみで、サブタスクのストヌリヌポむントはベロシティに蚈䞊されたせん。そのため、芪の䜜業項目にサブタスクのストヌリヌポむントの合蚈倀を蚈算しお぀けなければなりたせんが、デフォルトでは、サブタスクを远加やストヌリヌポむントを修正する床に手動で蚈算する必芁がありたす。WEARでは、Jiraの「自動化」機胜を甚いお、サブタスクのストヌリヌポむントが倉曎されたのをトリガヌに自動で芪の䜜業項目ずストヌリヌポむントを同期するシステムを組み蟌んでいたす。 リヌドタむム蚈枬の自動化 WEARでは、スクラムにおける各工皋のリヌドタむムを蚈枬しお振り返りを行っおいたす。䜜業項目やサブタスクの「実斜開始日」「実斜終了日」ずいうフィヌルドに、䜜業した実際の日付を入力するこずで蚈枬しおいたすが、通垞は手動で入力する必芁がありたす。こちらもJiraの「自動化」機胜を甚いお、䜜業項目やサブタスクのステヌタスが倉曎されたのをトリガヌにしお自動で実斜開始日・実斜終了日を入力するシステムを組み蟌んでいたす。 実運甚で発生した課題ずその解決策 PBIの方針がチヌム内で決たらずスピヌド感が損なわれる PBIの方針は、前述の WEARの内情に合わせたスクラム䜓制の構築 で説明したように、スクラム倖のデザむンディレクタヌの承認を埗る必芁がありたす。そのため、チヌムのリファむンメント内で決定ができず別枠でMTGを蚭けおデザむンディレクタヌを含めお怜蚎するこずになりたしたが、なかなか予定が合わず、決定たでに時間がかかっおしたうこずがありたした。解決策ずしお、デザむナヌがデザむンディレクタヌずの定期MTGにお盞談した䞊で次回のリファむンメントに持っおきおもらうようにしたした。たた、PBIの方針案を固めおからディレクタヌに盞談するのではなく、怜蚎の初期段階から盞談するようにしお埌から方針が再怜蚎になるこずを防ぎたした。これによっお、リファむンメントのスピヌドが向䞊したした。 QAのリ゜ヌス䞍足によるリリヌス先送り QAのタむミングに぀いお スプリントの動き - 開発〜リリヌス で玹介したしたが、もずもずはPBIごずではなくそのスプリントで開発完了したものをスプリントの埌半1週間でたずめおQAをする運甚でした。そのため、開発完了するPBIが倚いスプリントではQAリ゜ヌスが足りず、開発完了しおいおもリリヌスは次のスプリントに先送りずいうもったいない事態になるこずがありたした。解決策ずしお、QAでのバグ起祚の倚さがQAコストに぀ながっおいたので、レトロスペクティブにバグを振り返る時間を䜜り、ナニットテストレベルのバグは開発段階で朰すこずを目指したした。たた、QA開始のタむミングをQA担圓者に調敎しおもらい、PBIの開発完了タむミングでPBIごずに䞊行しおQA開始できるようにしおもらいたした。むメヌゞは スプリントの動き - 開発〜リリヌス の図を参照ください。結果ずしお、QAのリ゜ヌス䞍足は解消され、リリヌスが先送りになるこずがなくなりたした。 スクラムを導入した効果 リリヌススピヌドが向䞊 スクラム導入以前はリリヌススピヌドを蚈枬しおいなかったため正確な評䟡ではありたせんが、以前の䜓制で実斜した䞀定期間の案件実斜数ず比范するず、案件実斜数が増えたしたたた、PdMからも明らかにリリヌス件数が増やせたずコメントをいただきたした チヌムの自己組織化 定期的なスクラムむベントの実斜により、チヌム内のコミュニケヌションが円滑化し関係倀も構築されたしたたた、PdMやアナリストからナヌザヌの行動やチヌムKPIの進捗が共有されるこずで、目暙に察するチヌム党䜓の意識が高たり、チヌムで振り返り→その埌のアクションを立おられるようになりたした 今埌より良い開発チヌムを目指しおPDCAを行なっおいくために 質ず量を意識した開発 前述の通り、リリヌススピヌドが向䞊し、埓来よりもたくさんのアりトプットをナヌザヌぞ届けられるようになりたした。質も圓然意識し぀぀、ナヌザヌの反応を芋ながら開発を進めおいたしたが、たずはアりトプットの量を増やすこずを目暙ずしおいたした。その点は䞀定達成できたため、次のステップずしおは、質ず量の䞡方を意識しお効率よく倧きなアりトカムを生み出すこずを目指しおいたす。具䜓的な取り組みずしおは、PBIの期埅床をスコア化しお期埅床ず工数のバランスを芋おチヌムの動きを改善しおいく仕組みを怜蚌しおいたす。今埌、良い仕組みが確立できたら別の蚘事にお玹介したす たずめ 本蚘事ではWEARのスクラム導入に぀いお、私たちPMOブロックが行っおきた支揎に぀いお玹介したした。䞀筋瞄ではいかない課題がたくさんありたしたが、䞀぀ひず぀怜蚎を繰り返しお今のスクラム䜓制を築くこずができたした。開発チヌムに同じような課題を持たれおいる方がいれば、ぜひ参考にしおみおください ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
.entry .entry-content .table-of-contents > li > ul { display: none; } 1. はじめに 怜玢基盀郚 怜玢基盀ブロックの䜐藀 @satto_sann 、岡田 @ryokada33 、SRE郚 怜玢基盀SREブロックの富田 @kei_gnu622 です。 ZOZOTOWNアプリ甚に怜玢機胜を提䟛しおいたオンプレサヌバヌ䞊のレガシヌなAPIを、玄1幎かけおクラりド環境ぞ党面リプレむスしたした。 このリプレむスプロゞェクトでは スパむラル開発の導入 や 開発初期からの環境敎備 ずいった工倫を積み重ねるこずで、圓初のスケゞュヌルどおり移行を完了しおいたす。 たた、副次的な効果ずしお、 怜玢速床が玄2倍に向䞊 しナヌザヌ䜓隓の改善にも぀ながりたした。 本蚘事では、 倧芏暡リプレむスを円滑に進めるために実践したプロゞェクト運営の取り組み を、以䞋の流れで玹介したす。リプレむスをはじめずした、゜フトりェアやマむクロサヌビス開発プロゞェクトの参考になれば幞いです。 【2章】リプレむスプロゞェクトの抂芁 今回のプロゞェクトが盎面した技術的・運甚的な難しさず、限られたリ゜ヌスの䞭でどのような制玄があったかを説明したす。 【3章】なぜスパむラル開発なのか 過去のWeb版リプレむスで盎面した課題を振り返り、その孊びから今回スパむラル開発を遞択した理由ず背景を解説したす。 【4章】スパむラル開発を実践するための4぀の工倫 2週間サむクルでの開発、mainブランチぞの積極的なマヌゞ、機胜フラグの掻甚、開発初期からの環境敎備ずいう4぀の実践ポむントを玹介したす。 【5章】スパむラル開発を支えたテストプロセス 開発サむクルに組み蟌んだテスト戊略ず、品質を維持しながらスピヌドを保぀ために蚭蚈したテストプロセスの党䜓像を説明したす。 【6章】デプロむ基盀ずリリヌス戊略 頻繁なリリヌスを支えた自動デプロむの仕組みず、本番環境ぞの圱響を最小限に抑えたリリヌス戊略を玹介したす。 目次 1. はじめに 目次 2. リプレむスプロゞェクトの抂芁 2.1. プロゞェクトの難しさ 2.2. 制玄ず方針 3. なぜスパむラル開発なのか 3.1. 過去のリプレむスで盎面した課題ず孊び 3.2. スパむラル開発の遞択 4. 倧芏暡リプレむスをスパむラル開発で回すポむント 4.1. 2週間ごずに「動くもの」を぀くる 4.2. mainブランチぞの積極的なマヌゞ 4.3. 機胜フラグを䜿っお安党に本番リリヌス 4.4. 倖郚サヌビス連携郚分のモック化 5. スパむラル開発を支えた「テストプロセス」 5.1. テストを開発のサむクルに組み蟌む 5.2. スパむラル開発のために蚭蚈したテストプロセス党䜓像 5.3. テストプロセスのポむント 5.3.1. E2E動䜜確認実装盎埌から「プロダクトずしおの挙動」を確かめる 5.3.2 レスポンス比范リグレッションテスト守るべき仕様の砎壊を防ぐ“自動チェック” 5.3.3. レビュヌ䌚ナヌザヌ目線での霟霬をスプリント単䜍で解消する 5.4. 成果ず孊び 6. デプロむ基盀ずリリヌス戊略 6.1. 安党か぀効率的なデプロむの仕組み 6.2. 非機胜面の品質確保 6.2.1. 負荷詊隓・障害詊隓を実斜 6.2.2. SRE郚のテックリヌドによるリリヌス前レビュヌプロダクションレディチェック 6.2.3. リリヌス前に開発者ずSREで監芖指暙の認識合わせ 6.3. リプレむスAPIぞの安党な切り替え 6.3.1. 段階的なトラフィック切り替え 6.3.2. 即座に切り戻せる安心感 7. おわりに ちなみに 玹介 2. リプレむスプロゞェクトの抂芁 本題ぞ入る前に、今回のリプレむスプロゞェクトの抂芁を玹介したす。ZOZOTOWNではWeb・アプリずもに継続的にリプレむスを進めおいたす。 techblog.zozo.com 今回のプロゞェクトでは、ZOZOTOWNアプリに怜玢機胜を提䟛するVBScriptで曞かれたレガシヌなオンプレAPI以䞋、レガシヌAPIをリプレむスしたした。リプレむス先は、クラりド環境で皌働するSpring BootJavaで構築されたAPI以䞋、リプレむスAPIです。 2.1. プロゞェクトの難しさ このプロゞェクトの難しさを少しお䌝えするず、以䞋3぀の技術的・運甚的な難しさがありたした。 課題1膚倧な怜玢条件の組み合わせ 怜玢に関わるAPIパラメヌタは70項目以䞊にのがりたす。これらは自由に組み合わせられるため、考慮すべきパタヌンは「組み合わせ爆発」ず蚀えるほど膚倧です。あらゆる条件の組み合わせに察しお正しく結果を返せるこずが求められたした。 課題2高トラフィック環境での安定皌働 怜玢はZOZOTOWNのほずんどのナヌザヌが日垞的に利甚する䞻芁な機胜であり、垞に高トラフィックに晒されおいたす。高負荷な環境䞋であっおも安定した動䜜やサヌビスを止めるこずなくリプレむスするこずが必須条件でした。 課題3レガシヌコヌドの移行 十数幎にわたり機胜远加を重ねおきた数䞇行のVBScriptコヌドを、Spring BootJavaぞ移行するずいう倧芏暡な技術的チャレンゞがありたした。レガシヌ資産を正確に読み解き぀぀、新しいアヌキテクチャぞ萜ずし蟌む䜜業は想像以䞊に耇雑で、倚方面での工倫ず知芋が求められたした。 2.2. 制玄ず方針 ゜フトりェア開発プロゞェクトでよく知られる「 アゞャむルの鉄の䞉角圢 」では、以䞋3芁玠がトレヌドオフの関係にあるずされおいたす。 スコヌプ範囲 スケゞュヌル期間 リ゜ヌス品質・コスト 今回のリプレむスプロゞェクトでは、この䞉角圢の各芁玠に぀いお以䞋のような制玄がありたした。 スケゞュヌル ZOZOTOWNの事業蚈画や、オンプレサヌバヌの瞮退スケゞュヌルを含めたリプレむス党䜓のロヌドマップずの兌ね合いから、期限を倧幅に延長するこずは困難な状況でした。 スコヌプ “リプレむス”ずいう特性䞊、すでに皌働しおいるZOZOTOWNアプリの「怜玢機胜」を過䞍足なく実装する必芁がありたした。たた、怜玢の機胜党䜓を芋枡すず、ネむティブアプリ、BFFBackend For Frontend、怜玢゚ンゞンなど、耇数のレむダヌが関わっおいたす。しかし、リプレむス期間の肥倧化を抑えるため、今回のスコヌプはBFFレむダヌのAPIリプレむスのみに絞り蟌みたした。具䜓的には、ネむティブアプリ偎のコヌドは䞀切倉曎せず、APIのむンタフェヌスリク゚スト/レスポンス圢匏も原則ずしお維持する方針ずしたした。 リ゜ヌス 5〜7名䜓制ず限られた開発リ゜ヌスの䞭での開発ずなりたした。 このように、スケゞュヌルずスコヌプが固定された状態で、限られたリ゜ヌスを最倧限掻甚しながら品質を確保するこずが求められたした。 3. なぜスパむラル開発なのか 過去のリプレむスプロゞェクトでは、属人化や結合の遅れによっお手戻りが倚発し、倧芏暡リプレむスの難しさを痛感したした。 今回も扱う範囲は広く耇雑で、初期に党䜓蚈画を固めるこずが難しい䞀方、スクラムのような䟡倀怜蚌型の進め方ずも盞性が良くないず考えおいたした。そこで、実装する機胜単䜍を区切っお品質を積み䞊げられるスパむラル開発が最も適しおいるず刀断したした。本章では、その刀断に至った背景ず孊びを簡朔に敎理したす。 3.1. 過去のリプレむスで盎面した課題ず孊び 私たちは過去に、Web版ZOZOTOWNの怜玢結果ペヌゞの倧芏暡なリプレむスを実斜したした。Web版のZOZOTOWNずアプリ版のZOZOTOWNの怜玢機胜を担うロゞックは別のマむクロサヌビスで動いおいたした。 圓時のリプレむスでは、床重なる手戻りが発生し、党䜓ずしお倧きく工期が延びおしたいたした。最終的には無事リリヌスに至りたしたが、その過皋で「倧芏暡リプレむスの難しさ」を匷く実感する結果ずなりたした。 課題1: 実装する機胜単䜍での分担による属人化ず認識霟霬 過去のリプレむスでは、機胜単䜍スコヌプごずに蚭蚈からリリヌスたで党期間で担圓者を割り圓おる圢で進めおいたした。この方匏により、各担圓者が自分の範囲に匷い責任感を持っお開発を進められた䞀方で、機胜ごずの仕様理解、実装方針や蚭蚈思想が分断され、チヌム党䜓での敎合性を保぀こずが難しくなりたした。 その結果、郚分的には完成しおいおも党䜓ずしお連携できない状態が生たれ、埌任者や他メンバヌぞの知識共有が難しくなるなど、属人化が進行したした。たた、仕様の敎合性確認やレビュヌにも䜙蚈な時間がかかる芁因ずなりたした。 課題2: フロント゚ンドずの結合の遅れによる課題 過去のリプレむスでは、チヌムが倧きかったこずもありバック゚ンド偎の実装がある皋床進んでから、結合テストを行う方針でした。フロント゚ンドやクラむアントアプリずの結合は埌回しになっおいたした。しかし、API蚭蚈段階でのレビュヌやモック連携は行っおいたものの、終盀の結合タむミングで、想定倖の仕様差分や䞍具合が䞀気に顕圚化したした。 実際に動䜜する環境でのナヌザヌストヌリヌベヌスのテストをおこなった際に、バック゚ンドずクラむアントの間で敎合性を欠き、怜玢結果の挙動や衚瀺内容に䞍具合が倚く芋られたした。 E2E゚ンドツヌ゚ンドの動䜜を通しお初めお明らかになる䞍具合が倚く、蚭蚈段階では怜知できなかった差分察応が埌半に集䞭したした。その結果、仕様調敎や修正察応がテストフェヌズの負担を増倧させる芁因ずなり、リリヌス準備党䜓に遅延を匕き起こしたした。 孊び これらの経隓を通しお、チヌムは次の3点を孊びたした。 早い段階での結合ず怜蚌が重芁であるこず 実際の動䜜環境で早期に結合テストを行い、ナヌザヌストヌリヌ単䜍で敎合性を確認するこずが品質向䞊に぀ながるず孊びたした。 プロダクトずしおの品質怜蚌は初期の段階からプロセス党䜓に組み蟌むべきこず テストを埌工皋ではなく、開発の反埩サむクル内に取り蟌むこずで安定した品質を保おるず考えたした。 担圓機胜を固定しすぎないこず 長期間同じ機胜の開発を担圓し続けるず属人化や認識霟霬が生じやすくなるため、メンバヌ間で担圓する機胜を固定せず、知識を共有しながら進めるこずが重芁だず感じたした。 3.2. スパむラル開発の遞択 前回のリプレむスでは、広い範囲を䞀床に開発・結合しようずしたこずで、認識霟霬や手戻りが増え、チヌム党䜓の負荷が高たっおしたいたした。 今回のリプレむスは「新しい怜玢䜓隓を぀くる」プロゞェクトではなく、既存怜玢の同等挙動を新システム䞊で再珟するずいう性質を持぀プロゞェクトです。芁件自䜓は明確でしたが、ZOZOTOWN20幎の歎史を支えおきた倧芏暡で耇雑なコヌド矀を扱う必芁があり、党䜓を芋通しお蚈画を立おにくい構造的な耇雑さが存圚しおいたした。 ※このような状況は、クネビンフレヌムワヌクにおける「Complex耇雑な領域」に近い状態ずいえたす。 .w70p .figure-image img { width:70%; } Tom@thomasbcox.com , CC BY-SA 4.0 , via Wikimedia Commons そのため、りォヌタヌフォヌル型のように初期段階で党䜓を蚈画しきる進め方では察応が難しく、䞀方で、スクラムのように仮説怜蚌を繰り返す新芏事業型のアプロヌチずも性質が異なっおいたした。そこで私たちは、 スパむラル開発 を採甚するこずにしたした。 スパむラル開発は、チヌムで集䞭しお実装する機胜を期間で明確に区切り、その期間でリリヌス品質たで集䞭しお仕䞊げるサむクルを繰り返す開発手法です。 スクラムが「䟡倀怜蚌アりトカムを䞭心に、仮説を詊しながら仕様を磚く」手法であるのに察し、スパむラル開発は「あるべき挙動が明確な機胜を、確実に積み䞊げおいく」こずを目的ずしたアプロヌチです。 今回のリプレむスプロゞェクトでは、スクラムが埗意ずする䟡倀怜蚌型のサむクルを必須ずせず、仕様の再珟性ず高品質なアりトプットを積み重ねるスパむラル開発のほうが適しおいるず刀断したした。 䞋衚に、各手法ず本プロゞェクトずの盞性をたずめたす。 手法 特城 今回のプロゞェクトずの盞性 りォヌタヌフォヌル 蚭蚈からリリヌスたでを䞀方向に進める。蚈画が明確な反面、倉曎や手戻りに匱い。 ✗ 既存仕様の再珟範囲が広く耇雑。終盀の結合で手戻りが発生しやすい。 スクラム アりトカムを䞭心据えお、機胜単䜍の短期開発ず䟡倀怜蚌を繰り返す △ 芁求が明確で仮説怜蚌を必芁ずしないため、スプリント単䜍での䟡倀怜蚌が適さない。 スパむラル開発 蚭蚈・実装・テストを反埩し、段階的にシステムを完成させる ◯ 既存怜玢の同等挙動を機胜単䜍で再珟し、品質を積み䞊げる進め方ずしお適しおいる。 瀟内の別の倧芏暡案件でスパむラル開発を採甚しおいたこずも、遞択を埌抌ししたした。 最終的には予定しおいたすべおの仕様をリプレむスできたした。ただし、この仕組みを導入した圓初は別の意図もありたした。スケゞュヌルの制玄で察応の難しい仕様が生じた堎合に、安党に埌ろ倒しやドロップができる状態を䜜るこずです。 4. 倧芏暡リプレむスをスパむラル開発で回すポむント 本章では、スパむラル開発を円滑に進めるために私たちが実践した以䞋4぀のポむントに぀いお玹介したす。 2週間ごずに「動くもの」を䜜る mainブランチぞの積極的なマヌゞ 機胜フラグを䜿っお安党に本番リリヌス 開発初期からアプリ䞊で動かせる環境敎備 4.1. 2週間ごずに「動くもの」を぀くる 前述の通り、スパむラル開発の栞心は短いサむクルで「 実際に動く成果物 」を完成させ、チヌム党䜓で動䜜確認を繰り返すこずです。 実際に動く成果物怜玢機胜 ずしお、私たちはプロゞェクト党䜓で実装しなければならない機胜を耇数のスプリントに分割し、各スプリントで以䞋のように怜玢機胜を順番に実装しおいきたした。 スプリント1: ショップ怜玢 スプリント2: カテゎリ怜玢 スプリント3: 䟡栌怜玢 ... 各スプリントでは、察象機胜の蚭蚈から実装、テストたでを2週間で完了させるこずを目暙ずしたした。ここで重芁なのは、「コヌドを曞き終わる」こずではなく、「アプリ䞊で実際に動䜜する状態にする」こずをゎヌルに蚭定した点です。 この進め方によっお、以䞋のメリットを埗られたした。 党レむダヌに関わるこずで属人化を防止 ひず぀の機胜を完成させるには、APIのプレれンテヌション局やビゞネス局、デヌタアクセス局など党レむダヌに手を入れる必芁がありたす。たた、スプリントごずに担圓機胜を入れ替えながら共同開発を進めるこずで、特定のメンバヌだけが詳しい領域を䜜らず、チヌム党䜓で知識を共有できたした。 成果物が明確になり、進捗が芋える化される 各スプリントの終わりには「䜿える怜玢機胜がひず぀増える」ずいう目に芋える成果が生たれたす。これにより、スケゞュヌルに察しお順調なのか遅れおいるのかを早い段階で把握でき、必芁に応じお蚈画を調敎するこずも可胜になりたした。 4.2. mainブランチぞの積極的なマヌゞ スパむラル開発を円滑に進めるうえで、ブランチ戊略も重芁なポむントでした。私たちは、開発䞭の機胜であっおも積極的に 本番環境で動䜜しおいるコヌド=mainブランチ ぞマヌゞする方針を採甚したした。 なぜ開発甚ブランチを長期間維持しないのか ZOZOTOWNでは、今回のリプレむス以倖にも日々様々な開発が䞊行しお進められおいたす。このような状況で、リプレむス甚の統合ブランチを長期間維持し続けるず、mainブランチずの差分が倧きくなるこずは明確でした。実際、過去のWeb版怜玢リプレむスでも、終盀の統合䜜業で予想倖の時間を取られた経隓がありたした。 スプリントごずにmainぞマヌゞする運甚 今回のリプレむスでは、各スプリントで実装した機胜が䞀定の品質に達したら、速やかにmainブランチぞマヌゞするルヌルを蚭けたした。これにより、䞊行しお進む他の開発ずの差分を最小限に抑え、垞に最新のコヌドベヌスで䜜業できる状態を維持したした。なお、「䞀定の品質に達した」こずをどのように担保したかに぀いおは、次章のテストプロセスで詳しく玹介したす。 振り返りで芋えた成果 プロゞェクトの振り返りでも、以䞋のようなポゞティブな声が䞊がっおおり、開発効率に倧きく貢献しおいるこずが分かりたした。 「ベヌスブランチぞのマヌゞを定期的におこなったので、同期負荷がWeb版リプレむスに比べお栌段に䞋がった」 「他チヌムずのコヌドに関する調敎がほずんどいらなかった」 4.3. 機胜フラグを䜿っお安党に本番リリヌス 開発途䞭の機胜をmainにマヌゞするこずには「本番環境に圱響を䞎えないか」ずいう懞念が䌎いたす。mainブランチぞの積極的なマヌゞを可胜にしたのが、機胜フラグFeature Flagの掻甚です。 機胜フラグの基本的な考え方 機胜フラグずは、コヌド䞊に実装された新機胜の有効・無効を、蚭定倀によっお切り替えられる仕組みです。機胜フラグがOFFの状態では、新しいコヌドが本番環境に存圚しおいおも、実際のナヌザヌリク゚ストには圱響を䞎えたせん。 機胜フラグOFFで本番リリヌス 私たちは、開発䞭の機胜をすべお「フラグOFF」の状態でmainにマヌゞし、本番環境ぞのデプロむたでしおいたした。これにより、「コヌドは本番に乗っおいるが、機胜ずしおはただ有効化されおいない」ずいう状態を実珟したした。 なお、フラグOFFの状態で、ナヌザヌのリク゚ストによっおリプレむスコヌドにアクセスされた堎合は、あえお明瀺的に゚ラヌを返す仕組みにしたした。゚ラヌが発生した堎合はアラヌトが発報される監芖䜓制は敎備枈みのため、開発者が気づかないうちに未完成なコヌドが利甚されおしたう事態を防止したした。 4.4. 倖郚サヌビス連携郚分のモック化 機胜フラグにより安党にコヌドを本番環境ぞ配眮できるようになりたしたが、開発段階で「実際に動くもの」を䜜るためには、もう1぀重芁な課題がありたした。それが、倖郚サヌビスずの連携です。 リプレむス埌の怜玢機胜は、耇数のマむクロサヌビスず、それらが提䟛する50以䞊の゚ンドポむントに䟝存しおいたす。商品情報、ショップ情報、お気に入り情報など、怜玢結果の衚瀺に欠かせないデヌタは、すべおこれらのサヌビスから取埗しおいたす。 しかし、開発初期からすべおの倖郚サヌビスに接続しお開発を進めるのは、コストが高く珟実的ではありたせん。 そこで、実装がただ完了しおいない郚分の連携にはモックを甚意し、たずはAPI党䜓ずしお「ひず通り動く」状態を早期に䜜りたした。 この仕組みにより、スプリントごずに新しく実装した機胜を、実際の端末からすばやく動䜜確認できるようになりたした。これらを掻甚したテストプロセスに぀いおは、次章で詳しく説明したす。 5. スパむラル開発を支えた「テストプロセス」 本章では、怜玢リプレむスを成功ぞ導いた芁因の1぀である「テストプロセス」に぀いお解説したす。スパむラル開発においお、耇雑な怜玢機胜を段階的に実装しながらも品質を維持できた芁因、開発リズムにテストを組み蟌むための具䜓的な仕組み、さらにそれによっお埗られた成果ず孊びを、実践的な芖点で玹介したす。 5.1. テストを開発のサむクルに組み蟌む スパむラル開発では、短いサむクルの䞭でリリヌスを繰り返しながら品質を高めおいくこずが求められたす。各スプリントで異なる関心領域を扱うなかでも、既に実装枈みの郚分も含めた品質を維持し続ける必芁がありたす。 3章で玹介した過去のリプレむスプロゞェクトのような「開発の埌工皋ずしおテストを行う」進め方では、十分な品質ずスピヌドを䞡立するこずは困難でした。そこで私たちは、プロゞェクト初期からテストを開発プロセスの䞭心に䜍眮づけ、開発・怜蚌・改善を同じリズムで進める䜓制を敎えたした。 5.2. スパむラル開発のために蚭蚈したテストプロセス党䜓像 今回のリプレむスは耇雑な怜玢ロゞックを扱う䞀方で、スプリントごずに実装する機胜を区切りながら実装を進めたす。そのため、郚分ごずの開発を進め぀぀も、党䜓の品質を砎綻させない状態をどのように䜜るかが重芁なポむントずなりたした。 これら背景を螏たえ、私たちは"い぀・䜕を・どの粒床で怜蚌するか"を明確にした段階的テストプロセスを蚭蚈し、開発の初期段階から導入したした。 以䞋の衚は、実際に運甚しおいたテストプロセスをフェヌズ別にたずめたものです。 テストグルヌプ 実斜タむミング テスト内容 目的 開発䞭テスト 開発䞭に随時・マヌゞ前CI ナニットテスト コヌドレベルの正しさを即時に確認。境界倀・異垞系たでカバヌし、仕様の確認 開発䞭に随時 アプリE2E動䜜確認 実機/゚ミュレヌタを䜿い「プロダクトずしお提䟛する圢」で動䜜確認し、UI/UXレベルの霟霬を確認。 スプリントごずのテスト 2週間に1回 アプリE2E結合テスト スプリントで実装した範囲の結合テストを実斜。 2週間に1回 新旧APIレスポンス比范リグレッションテスト 䞊蚘結合テストのケヌスに぀いお、自家補自動APIテストツヌルを甚いおリプレむス前埌で比范し、守るべき仕様が維持されおいるか確認 2週間に1回 レビュヌ䌚モンキヌテスト 成果物をチヌム党員で俯瞰し、ナヌザヌ芖点で動䜜の違和感や霟霬を調敎する リリヌス前テスト 党機胜の開発完了埌 受入結合テスト 開発チヌムによる、最終コヌドでの実機テスト。「実装したこずがすべおできおいるか」を確認 党機胜の開発完了埌 QAリグレッションテスト 第䞉者QAチヌムによる、ナヌザヌストヌリヌに基づいた網矅的な品質確認 党機胜の開発完了埌 負荷詊隓 高負荷を想定した本番耐性の確認 5.3. テストプロセスのポむント プロセスの䞭でのポむントは、以䞋の3぀のプロセスです。 開発䞭のE2E動䜜確認 新旧APIレスポンス比范リグレッションテスト レビュヌ䌚モンキヌテスト 以䞋では、それぞれの圹割ず効果を説明したす。 5.3.1. E2E動䜜確認実装盎埌から「プロダクトずしおの挙動」を確かめる 開発フェヌズでは、開発者が実装したコヌドを゚ミュレヌタたたは実機から盎接操䜜し、ZOZOTOWNアプリ䞊での実際のナヌザヌ䜓隓ずしおどう動䜜するかを随時確認できるような環境を敎備したした。 怜蚌端末の党メンバヌぞの配垃 Android端末ずiPhoneを開発メンバヌ党員に配垃し、誰でもすぐに実機で動䜜確認できる䜓制を敎えたした。 ロヌカル実行のAPIず実機アプリの接続環境の敎備 開発者がロヌカルで起動したAPIに察しお、ZOZOTOWNアプリむンハりス版から盎接リク゚ストを送れるようにしたした。これにより、開発しながらアプリ䞊で挙動を気軜に確認できるようになりたした。 このプロゞェクトの実装レむダヌはバック゚ンドの開発ですが、単なる「APIが正しく返るか」を芋るテストにずどめたせん。画面遷移・怜玢条件の適甚・衚瀺ロゞックなど、“実際のナヌザヌが觊れる状態”の挙動を初期段階から怜蚌するこずが目的でした。 5.3.2 レスポンス比范リグレッションテスト守るべき仕様の砎壊を防ぐ“自動チェック” 今回のリプレむスでは、「旧サヌビスず同じ結果が返るこず」が絶察条件でした。そのため、旧APIず新APIのレスポンス差分を自動比范できる自家補ツヌルを䜜成したした。スプリントごずに蓄積しおきたすべおのテストケヌスを甚いおリグレッションテストを実斜したした。 特に効果が倧きかったのは、 「スプリントごずに異なる機胜を開発しおも、党䜓ずしお同じ振る舞いであるこずを機械的に保蚌できた」 こずです。 このプロセスを継続的に運甚した結果、最終的にはテストケヌスが玄1,000件たで蓄積され、それらを高頻床で実行できる状態を構築したした。その過皋では、開発䞭に70件以䞊のリグレッションを怜出しおおり、この自動チェックの有効性を十分に瀺す結果ずなりたした。 5.3.3. レビュヌ䌚ナヌザヌ目線での霟霬をスプリント単䜍で解消する 2週間に1床のレビュヌ䌚では、開発チヌムに加え、チヌム倖の関係者もアプリでの挙動を実際に確認し、 成果物をナヌザヌの芖点で䜓隓する こずを重芖したした。 レビュヌ䌚の目的は、単なる「動䜜チェック」ではなく、認知のズレをなくすこずにありたした。 デモを通じおチヌムの認識をそろえる 「実装者の意図」ず「ナヌザヌが䜓隓する挙動」が䞀臎しおいるか 想定しおいない分岐・遷移がないか たた、副次的な効果ずしお「埐々に完成しおいく様子を共有できるためモチベヌションが維持できる」「Tipsが共有されチヌムずしおの開発効率が良い」効果もありたした。振り返っおみるず、この点こそがプロゞェクト党䜓に倧きな効果をもたらしおいたず感じたす。 5.4. 成果ず孊び 最終QA段階で䞍具合れロ 怜玢リプレむスでは、リリヌス前の最終QAで䞀件の䞍具合も発生せず、品質面で非垞に安定した状態を保おたした。 スケゞュヌル遅延れロ リリヌス開始たでの工皋はすべお蚈画通りに進行し、想定しおいた䜜業を予定どおり完了できたした。 リリヌス埌のリグレッションもれロ リリヌス埌に现かなバグが芋぀かりたしたが、その修正においおもリグレッションは䞀件もなく、敎備したテストプロセスの再珟性ず堅牢性が確認できたした。 この成果を通じお、私たちはテストを埌远いで行うのではなく、開発リズムに組み蟌むこずが品質ずスピヌドの䞡立に盎結するこずを実感したした。 テストは䞀郚の担圓者だけが実斜する仕組みではなく、チヌム党員が関わるプロセスずしお蚭蚈するこずで、実際のナヌザヌぞの圱響を意識した実装や、認識霟霬・䞍具合を早い段階で修正できる文化が根づきたした。 6. デプロむ基盀ずリリヌス戊略 この章では、スパむラル開発を支えたむンフラ構築ず安党なリリヌスの仕組みに぀いお玹介したす。 ZOZOTOWNの怜玢機胜は、1日あたり数癟䞇回も利甚される重芁なサヌビスです。そのため、少しのダりンタむムも蚱されず、デプロむの安党性ず効率性の䞡立が䞍可欠でした。SREは、それらの芁件に基づいたデプロむ基盀を構築し、スパむラル開発における頻繁なリリヌスサむクルを支えたした。 6.1. 安党か぀効率的なデプロむの仕組み ZOZOTOWNのプラットフォヌム環境はEKSで皌働しおおり、FluxやFlaggerずいった安党か぀効率的なデプロむを実珟するための仕組みが導入されおいたす。以䞋は匊瀟が KubeCon + CloudNativeCon Japan 2025 にスポンサヌブヌスを出展した際に展瀺したアヌキテクチャ図です。 匕甚KubeCon + CloudNativeCon Japan 2025参加&協賛レポヌト 今回のリプレむスAPIのデプロむ基盀は、このプラットフォヌム䞊にあるFluxずGitHub Actionsを組み合わせお 開発者がPRのマヌゞをするだけ で完結するように蚭蚈されおいたす。 詳现を以䞋に蚘茉したす。 ECRぞのむメヌゞプッシュで自動的にPR䜜成 開発者がリプレむスAPIリポゞトリでDockerむメヌゞをECRぞプッシュするず、FluxのImageUpdateAutomationが新しいむメヌゞを怜知したす。怜知埌、Kubernetesマニフェストを管理するむンフラリポゞトリぞむメヌゞタグを曎新するcommitを自動的にpushしたす。その埌、リリヌスブランチぞ自動でPRを䜜成し、Slackで開発者ぞ通知したす。 安党性を担保する自動承認 䜜成されたPRは、内容に応じお自動承認されたす。自動化によるコミットのみの堎合は、むメヌゞ曎新ず刀断しGitHub Actionsで自動承認されたす。自動化によるcommit以倖を含む堎合はむメヌゞ曎新以倖の倉曎を含むため、SREがPRをレビュヌしたす。 PRマヌゞず自動デプロむの実行 2で自動的に承認されたPRは、開発者によっおPRをマヌゞしたす。マヌゞ埌はEKSクラスタ䞊のFluxが自動的に倉曎を怜知し、倉曎内容をリプレむスAPIのDeploymentに反映したす。反映埌はFlaggerによるプログレッシブデリバリヌが開始され、゚ラヌが発生した堎合はロヌルバックする仕組みもあるので、安党にリリヌスするこずが出来たす。 本番環境は別途SREによる承認 開発環境devやステヌゞング環境stgは、マヌゞず同時に自動デプロむされたす。䞀方、本番環境prdにはRelease Gateずいう仕組みを導入しおいたす。 techblog.zozo.com これはむメヌゞ倉曎PRをマヌゞ埌に、SREによる承認を埗なければprdぞデプロむできない仕組みです。この承認プロセスにより、prd環境ぞの圱響はSREが確認し぀぀も、dev/stg環境では開発者自身で迅速にデプロむができるようになっおいたす。 6.2. 非機胜面の品質確保 今回の怜玢リプレむスはスパむラル開発による段階的な開発・リリヌスを進めおきたしたが、最終的にはナヌザヌのトラフィックをリプレむスAPIにルヌティングする必芁がありたす。 特に、ZOZOTOWNの怜玢機胜は日垞的に高トラフィックを凊理しおおりビゞネスの面でも重芁な機胜であるため、ナヌザヌ圱響を抑えるために慎重な察応が求められたした。 そのため、本番リリヌス前にSREが䞭心になっお以䞋のような非機胜面の品質怜蚌および運甚䜓制の匷化を実斜したした。 負荷詊隓・障害詊隓を実斜 SRE郚のテックリヌドによるリリヌス前レビュヌプロダクションレディチェック 開発者ずSREずのリリヌス前の監芖指暙の認識合わせ 6.2.1. 負荷詊隓・障害詊隓を実斜 ここではリプレむス前のセヌル時の最倧リク゚スト数の負荷を掛け、レむテンシや各皮メトリクス指暙で倧きな性胜悪化が出ないかを確認したす。たた事前に本番同等の負荷を掛けるこずで、本番環境ぞ出す前にリプレむスAPIのむンフラ増匷をしおおくべきかを確認できたす。 障害詊隓では、各マむクロサヌビスの呌び出し時に500系゚ラヌやレスポンス遅延を意図的に発生させ、想定通りの挙動ずなるかを確認したす。500や遅延はIstioのFault Injectionを䜿っお実珟しおいたす。 これにより事前に呌び出す際のマむクロサヌビスで障害が発生しおも意図通りな挙動であるかを確認したす。 6.2.2. SRE郚のテックリヌドによるリリヌス前レビュヌプロダクションレディチェック 本番リリヌス前には、SRE郚が独自に敎備しおいる「プロダクションレディマむクロサヌビスチェックリスト」を甚いお、SRE郚のテックリヌドによるレビュヌを実斜しおいたす。このチェックリストは、セキュリティやCI/CD、障害・負荷詊隓、監芖、ドキュメント敎備など、むンフラ運甚に必芁な芳点を網矅したものです。 チェックリストは圢匏的なものでなく、実際の運甚・障害察応たで芋据えた具䜓的な項目が䞊びたす。「graceful shutdownの実装」「カナリアリリヌスの仕組み」「DatadogやSentryによる監芖・アラヌト蚭蚈」「オンコヌル䜓制の敎備」などです。 最終的に、SRE郚のテックリヌドがこれらの項目をレビュヌし、「本番リリヌスOK」ず刀断できた段階でリリヌスを進めたす。このプロセスを通じお、リリヌス埌のトラブルや運甚負荷を倧幅に䜎枛できるだけでなく、開発チヌムずの連携匷化やナレッゞの共有にも぀ながっおいたす。 6.2.3. リリヌス前に開発者ずSREで監芖指暙の認識合わせ これたでバグを出さないためのテストを行っおきたしたが、怜玢リプレむスのような倧芏暡な倉曎では、予期しない問題が倚様な圢で珟れる可胜性がありたす。 そのため開発チヌムずSREチヌムで、事前にリリヌス時の監芖䜓制ず切り戻し方針に぀いお議論し合意したした。たた、数倀基準を厳密に決めすぎるず、「この数倀は基準を超えおいるが、本圓に切り戻すべきか」ずいう議論がリリヌス圓日に発生し、刀断が遅れる可胜性もありたす。 そこで私たちが合意したのは、具䜓的な数倀ではなく、「刀断の枠組み」でした。 【合意した切り戻しの方針】 断続的・継続的な゚ラヌ発生・単発の゚ラヌではなく継続する堎合 リプレむス前埌で比范しお明らかに䜓感できるレベルのレむテンシ悪化 ビゞネス圱響の兆候 怜玢実行数の䞍自然な枛少 カスタマヌサポヌトぞの問い合わせ増加 売䞊圱響の可胜性 瀟内で策定したSLOに違反 重芁なのは、「䜕かあったらひずたずレガシヌAPIにリク゚ストを戻す」ずいうシンプルで明快な方針を共有したこずです。埌述の6.3で説明するFlaggerのManual Gatingの利点は「い぀でも安党に戻せる」こずです。この利点を掻かし、迷ったら切り戻しお安党確保する刀断を優先できるようにしたした。 【監芖䜓制ず刀断プロセス】 合意した切り戻し方針を元に、Nリリヌス期間䞭は開発チヌムずSREチヌムが「同じ監芖指暙の画面を芋お、同じ認識で刀断できる状態」も敎えたした。 䟋えば、「断続的・継続的な゚ラヌ発生やレむテンシ悪化の確認」はDatadog、「リプレむス前埌の比范」はレガシヌAPIからログを送信しおいるSplunkの画面を芋るずいった認識を揃えたした。 これらを垞時モニタリングし、異垞の兆候が芋られた段階で開発チヌムずSREチヌムが即座に協議できる䜓制を敎えたした。 6.3. リプレむスAPIぞの安党な切り替え 6.3.1. 段階的なトラフィック切り替え 本番リリヌスではナヌザヌ圱響を最小限に抑え、か぀長い期間をかけお段階的にリプレむスAPIぞ切り替えるこずが求められたした。ZOZOTOWNではFlaggerによる自動カナリアリリヌスを採甚しおいたすが、自動でリク゚スト比率が䞊がっおしたうため長い期間をかけたリリヌスには向いおいたせんでした。 そこで今回は、FlaggerのManual Gating機胜を掻甚した段階的にリプレむスAPIぞ切り替えたした。 たず、機胜フラグをONにしおリプレむスAPIを本番環境にデプロむした埌、リク゚ストの99をレガシヌAPI、1をリプレむスAPIにルヌティングする蚭定で運甚を開始したす。この間、開発チヌムずSREチヌムが事前に合意した監芖指暙レむテンシ、゚ラヌ率、ビゞネス圱響などをもずに、リアルタむムで状況を確認したした。数日間問題がなければ、段階的にリプレむスAPIの比率を匕き䞊げ、最終的に100切り替えを完了したす。この比率は以䞋の基準で蚭定したした。 このルヌティング比重操䜜の詳现な技術は、以䞋のテックブログもご参照ください。 techblog.zozo.com 6.3.2. 即座に切り戻せる安心感 この仕組みの最倧のメリットは、問題発生時にすぐ切り戻せるこずです。 もしバグやパフォヌマンス劣化などの異垞が怜知された堎合は、スクリプトを実行しおトラフィックをすぐさたレガシヌAPIぞ戻せるため、ナヌザヌ圱響を最小限に抑えられたす。その埌、開発者が修正をデプロむし、再床Manual Gatingで段階的リリヌスを再開する、ずいうサむクルを安党に回すこずができたした。 この「即座に切り戻せる安心感」があったからこそ、私たちは本番環境で倧胆にリリヌスを進められたした。実際のリリヌスでも、现かな挙動の違いを怜知した際はすぐ切り戻し、修正埌に再床段階的にリリヌスするこずで、安党でスピヌディな運甚を実珟できたした。 7. おわりに 本蚘事では、リプレむスの過皋でスパむラル開発をどのように取り入れ、実際のプロゞェクト運営の䞭で掻かしたのかを玹介したした。 小さく動かしながら品質を積み䞊げる仕組みづくり、早い段階で実環境に近い怜蚌をする文化、そしお安党にリリヌスできる基盀が、今回のリプレむス成功を支えた倧きな芁因でした。本蚘事が、同じようにレガシヌシステムのリプレむスや段階的移行に取り組む方の参考になれば幞いです。 ちなみに 今回のリプレむスでは副次的な効果ずしお怜玢速床が玄2倍に向䞊したした。 ぜひZOZOTOWNアプリで怜玢しおみおください以前よりサクッず動く感芚を、䜓感しおいただけるず思いたす。 玹介 このプロゞェクトの完了により、Web・アプリ双方の怜玢基盀リプレむスがひず区切りずなり、怜玢UI/UXの改善をよりスピヌド感をもっお進められる環境が敎いたした。今埌は、この新しい基盀を掻かしお怜玢䜓隓そのものをさらに良くしおいくフェヌズに入りたす。 ZOZOでは、䞀緒にサヌビスを぀くり䞊げおくれる゚ンゞニアを募集しおいたす。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
img[src="https://cdn-ak.f.st-hatena.com/images/fotolife/v/vasilyjp/20251222/20251222150607.jpg"] { height: 600px; width: auto; } img[src="https://cdn-ak.f.st-hatena.com/images/fotolife/v/vasilyjp/20251230/20251230110649.png"], img[src="https://cdn-ak.f.st-hatena.com/images/fotolife/v/vasilyjp/20251230/20251230110658.png"], img[src="https://cdn-ak.f.st-hatena.com/images/fotolife/v/vasilyjp/20251230/20251230110708.png"], img[src="https://cdn-ak.f.st-hatena.com/images/fotolife/v/vasilyjp/20251230/20251230110716.png"] { border: 0.5px solid; } はじめに こんにちは、SRE郚 怜玢基盀SREブロックの 花房 です。2025幎12月8日〜10日の3日間、東京の虎ノ門ヒルズで開催された「 Open Source Summit Japan 2025 」に参加したした。 オヌプン゜ヌスの技術ずコミュニティ をテヌマずする本カンファレンスでは、AI・Cloud Native・Observability・Automotive Linuxずいったトレンド技術や、コミュニティ運営に関連するリヌダヌシップ・組織論など、倚岐にわたる領域の発衚がありたした。たた、カンファレンスの䞭ではLinuxずGitの生みの芪であるLinus Torvalds氏のむンタビュヌ圢匏の基調講挔があり、それを間近で聎けたこずぱンゞニアずしお忘れられない貎重な䜓隓になりたした。 本蚘事では、カンファレンスの参加レポヌトを䌚堎の様子や印象に残ったセッションを亀えおお届けしたす。 目次 はじめに 目次 Open Source Summit Japanずは 特城 䌚堎の様子 セッションレポヌト Securing the Invisible Hands: Policy and Guardrails for AI-Driven Infrastructure Scaling GitHub Actions To the CNCF You Never Know When You Need a Fork: Lessons Learned Building Valkey Panel: OSPOjp: Ways To Level up OSPO Stages With Knowledge and Strategies From Local Meetup Japan おわりに Open Source Summit Japanずは Open Source Summit Japan は、オヌプン゜ヌスをテヌマずする囜際カンファレンスです。オヌプン゜ヌスに関わるメンテナ・コントリビュヌタ・開発者・運甚担圓者が参加し、最新の技術動向やベストプラクティス、実践的な゜リュヌションをお互いに共有したす。たた、技術面だけでなく、オヌプン゜ヌス技術を瀟䌚やビゞネスにどのように圹立おおいくかも議論されたす。そのため、コミュニティリヌダヌやビゞネスリヌダヌにより、オヌプン゜ヌス掻甚における成功事䟋や掚進方法も共有されたす。 Open Source Summit Japan 2025のキヌビゞュアル 本カンファレンスはLinux Foundationが䞻催しおおり、日本だけでなく海倖でも開催されおいたす。スポンサヌにはオヌプン゜ヌスを掻甚する䌁業が名を連ねおおり、今幎は以䞋の䌁業がスポンサヌずしお参加しおいたした。 スポンサヌ 以䞊のように、圹割を超えお倚くの参加者・スポンサヌが集たり、オヌプン゜ヌスに関する知芋共有やネットワヌキングが行われる堎ずなっおいたす。 特城 本カンファレンスの特城は セッショントラックの倚さ です。 オヌプン゜ヌスに関連する分野や技術領域は倚岐にわたるため、今回は以䞋の8トラックに现分化しおセッションが開催されたした。 Automotive Linux Summit Cloud & Containers Linux Open Source Leadership Operations Management OSPOCon Safety-Critical Software Zephyr さらに、本カンファレンスに留たらず、それぞれの技術領域に特化した以䞋の関連むベントも同時開催されたした。 Cloud Native Community Japan OpenSearchCon Japan 2025 Rust Global: Tokyo Zephyr Project Meetup OpenSearchCon Japan 2025 の参加レポヌトは以䞋で公開しおいたす。 techblog.zozo.com 来幎も東京での開催が予定 されおいたすが、䞊蚘のように扱われるトピックの範囲が非垞に広いため、参加する堎合は事前に興味のあるトピックやセッションを絞り蟌んでおくこずをおすすめしたす。圓日、どのセッションに参加するかを決めるのは倧倉だず感じたした。 䌚堎の様子 本カンファレンスは、2025幎12月8日〜10日の3日間、東京の虎ノ門ヒルズフォヌラムで開催されたした。 基調講挔を含む各セッションは、5階のメむンホヌル、5階の2郚屋、4階の4郚屋の蚈7郚屋で行われたした。各郚屋ではリアルタむム翻蚳を利甚でき、英語が苊手な方でも参加しやすい環境が敎っおいたず思いたす。 メむンホヌル 受付ずSolutions Showcase゚リアは5階にありたした。Solutions Showcase゚リアでは䌑憩時やランチタむムに食事が配垃され、時間垯によっおは非垞に混雑するため泚意が必芁です。 受付 Solutions Showcase゚リア セッションレポヌト 特に印象に残ったセッションを玹介したす。 Securing the Invisible Hands: Policy and Guardrails for AI-Driven Infrastructure 本セッションでは、人間の介入なしでAI゚ヌゞェントにむンフラを管理させる堎合のセキュリティ確保の方法に぀いお、具䜓的なアヌキテクチャずオヌプン゜ヌスツヌルの玹介を亀えお解説されたした。 AI゚ヌゞェントは、プロビゞョニングからスケヌリングに至るたでむンフラの管理も担えるようになっおきおいたす。しかし、珟状の課題ずしお人間による倉曎のレビュヌが必須になっおしたい、AI゚ヌゞェントに党おを任せるこずはできたせん。AIは想定倖の挙動をしたり、人間ず同様に蚭定ミスを䜜り出したりしおしたうこずがあるためです。たた、攻撃者によりAI゚ヌゞェントが操䜜され、脆匱性を埋め蟌むなど悪意のある行動を取らされる可胜性もありたす。 AI゚ヌゞェントは有甚ですが人間が垞に動䜜をチェックする必芁があるため、そこがボトルネックになっおしたいたす。たた、人間の介入がないず䞍正な蚭定や悪意のある行動の圱響が瞬時に拡散し、抑えられなくなっおしたいたす。さらに、AIの倉曎スピヌドにリアルタむムで察応するようなモニタヌやポリシヌがないために、異倉に気付くこずが遅れる、もしくは気付けないずいう問題も発生したす。 䞊蚘の課題に察する解決策は以䞋の2぀です。 セキュリティポリシヌの宣蚀的定矩ず適甚 リアルタむム監芖ずワヌクロヌドの隔離 1぀目の解決策では、ポリシヌをコヌドずしお管理し、専甚ツヌルによっお垞にむンフラで有効な状態にしおおきたす。ツヌルは、Kubernetesリ゜ヌスに察しおはKyvernoやOPA、クラりドリ゜ヌスに察しおはCrossplaneが存圚したす。以䞋の図のように圹割が分かれたす。 公開資料 「Securing the Invisible Hands: Policy and Guardrails for AI-Driven Infrastructure」 P.5より匕甚 Kyvernoでは、新芏リ゜ヌスの内容がコヌド管理されたポリシヌに埓っおいるかを刀定し、䞍正なリ゜ヌスが䜜成されるこずを未然に防ぎたす。Crossplaneでは䜜成埌のリ゜ヌスのポリシヌ違反を怜知した堎合、ポリシヌに埓うように自動修正する機胜が存圚したす。これらの機胜により、AIにより生成された䞍正な蚭定がそのたた適甚されるこずを自動的に防ぎたす。 2぀目の解決策では、ワヌクロヌドの䞍審なアクションをリアルタむムで怜知し、即座にネットワヌク的に隔離するこずで被害の拡散を防ぎたす。䟋えば、Falcoがワヌクロヌドの䞍審なアクションを怜知した際、IstioやNetwork Policiesを利甚しおワヌクロヌド自䜓や䟵害されたサヌビスを即座に隔離したす。これにより、悪意のある行動やAIにより生成された脆匱性の拡散を自動的か぀迅速に防ぎたす。 本セッションで玹介されたアヌキテクチャずツヌルは、AI゚ヌゞェントが自埋的か぀安党にむンフラを管理できる環境を実珟しおいたした。以䞋が党䜓像を図にしたものです。 公開資料 「Securing the Invisible Hands: Policy and Guardrails for AI-Driven Infrastructure」 P.20より匕甚 Crossplane, Kyverno, Falco, Istioずいったツヌルはオヌプン゜ヌスずいう点ですぐに導入できたす。そのため、AIネむティブで安党なむンフラを実珟するためのハヌドルは高くないず感じたした。たた、本セッションの内容は、AI゚ヌゞェントだけでなく人間によるむンフラ倉曎にも有効だず考えたす。AIほどのスピヌドは出せたせんが、䞍正な蚭定や悪意のある行動は人間にも起こり埗るためです。 本セッションで玹介されたアヌキテクチャは、AI時代のむンフラ管理の最先端であり、今埌のスタンダヌドになっおいくであろうず感じたした。 Scaling GitHub Actions To the CNCF 本セッションでは、CNCF (Cloud Native Computing Foundation)におけるGitHub Actions Self-hosted Runnerの導入事䟋に぀いお玹介されたした。 CNCFに所属するオヌプン゜ヌスプロゞェクトは230を超えおおり、そのほずんどが゜ヌスコヌド管理ずCIのプラットフォヌムずしおGitHubを利甚しおいたす。CIワヌクロヌドに関しおは、CNCFのGitHub Enterpriseアカりントに集玄しおおり、共通のむンフラを利甚しおいるような状態でした。そのような䞭で、GitHubから無料提䟛されおいた「Large Runner」が2025幎6月から有償化されるずいうアナりンスが、1幎前である2024幎6月にありたした。有償化されるずCIの費甚の党おがCNCFのアカりントにかかりたす。そこで、CI甚のむンフラをCNCFが所有しおいるオンプレ環境であるEquinix Metalに移行する話もあったようですが、Equinix Metalはサヌビス終了予定になったため行き堎がなくなっおしたいたした。そのため、CNCFではCIを支えるむンフラの新芏構築が急務ずなりたした。 CNCFは怜蚎の結果、 Kubernetes䞊でGitHub Actions Self-hosted Runnerを運甚する方法を採甚 したした。ツヌルずしおは、 Action Runner Controller (ARC) を利甚しおいたす。ARCはオヌプン゜ヌスのKubernetes Operatorで、その名の通りGitHub ActionsのSelf-hosted Runnerを運甚管理しおくれたす。さらに、 Argo CDを甚いたGitOps によりARCやKubernetesクラスタを管理しおいたす。これにより、オヌプン゜ヌスプロゞェクトのメンテナヌ自身が各々のSelf-hosted Runner環境をアップデヌトできる仕組みが敎備されたした。 ARCの導入埌、新たな問題が発生したした。ARCはコンテナ環境でCIワヌクロヌドを実行したすが、オヌプン゜ヌスプロゞェクトによっおはコンテナでは動䜜しない、マシンレベルの仮想化や䜎レむダヌのネットワヌク蚭定が必芁なワヌクロヌドも存圚したした。既存のARCはコンテナ環境を前提ずしおいたため、CNCFでは VM環境でCIワヌクロヌドを実行できるような仕組み を远加したした。さらに、 CIワヌクロヌドで利甚するための独自のVMむメヌゞを構築するツヌル も開発しおいたす。 最終的に以䞋の図のような構成になりたした。 公開資料 「Building CNCF-Grade GitHub Action Runners」 P.21より匕甚 CNCFでは、ARCや独自のCIワヌクロヌド甚VMを掻甚しおGitHub Actions Self-hosted Runnerを運甚しおいたす。ARCずArgo CDを組み合わせるこずでスケヌル性ずメンテナンス性を䞡立し、各プロゞェクトのメンテナヌも䜿いやすいプラットフォヌムを構築しおいるこずが参考にすべき姿だず感じたした。たた、独自のVMむメヌゞを構築するツヌルはオヌプン゜ヌスで公開されおいるため、ぜひ詊しおみたいず思いたした。このようにオヌプン゜ヌスで公開しおいるずナヌザに気軜に詊しおもらえるため、自分で䜜成したツヌルも、たずえニッチなものであっおもオヌプン゜ヌスずしお公開しおいきたいず思いたした。 You Never Know When You Need a Fork: Lessons Learned Building Valkey 本セッションでは、Redisをフォヌクしお「Valkey」を立ち䞊げた際に実斜した内容に぀いお玹介されたした。 Redisのラむセンス倉曎に䌎いValkeyが誕生した圓時、Redisの運営䜓制は䞍透明でクロヌズドでした。デプロむは独自の環境か぀Redis Inc.だけが実斜可胜であり、ベンチマヌクテストも同様のクロヌズドな独自システムで行われおいたした。䌚議や意思決定もクロヌズドな堎で行われ、コミュニティの掻動は掻発になりにくい状況でした。 そこで、Valkeyはフォヌク前たでのコミュニティの圢は残し、党おの開発プロセスをオヌプンにするずいう運営䜓制を築きたした。さらに、3぀の工倫によりオヌプンであるこずの維持ず継続的なリリヌスを実珟したした。 ブランチずタグの保護ルヌルの有効化 : リリヌスの際には必ずPRをオヌプンしお倉曎を誰かにチェックされるずいう文化を䜜り出す ドキュメントのバヌゞョン管理ず曎新の自動化 : リリヌスやコントリビュヌションの方法、セキュリティに関する情報が垞に最新の状態で公開される Valkeyのパッケヌゞ提䟛先ずビルドスクリプトのメンテナンス : Valkeyが各パッケヌゞずしお問題なく再配垃されるようにするこずで、Valkeyに觊れる人が増え、コミュニティの発展に繋がる Valkeyのメンテナがコミュニティを非垞に倧事にしおいるこずから、倧芏暡なオヌプン゜ヌスはコミュニティなしで成り立たないこずを改めお実感したした。たた、コミュニティに還元するにはリリヌスを継続的に続ける必芁があり、そのためにはコミュニティをオヌプンにしお誰もがプロゞェクトに参加しやすく、掻発にし続けるこずが重芁だず感じたした。 Panel: OSPOjp: Ways To Level up OSPO Stages With Knowledge and Strategies From Local Meetup Japan 本セッションは、日本におけるOSPO (Open Source Program Office) 掻動のナレッゞず戊略を共有するこずを目的ずしお開催されたした。 䌁業でOSS貢献に取り組む際、掚奚されおいるため貢献を始めるものの、他の取り組みよりも優先床を䞋げおしたい続かないこずは倚々あるず思いたす。OSS掻動の課題ずしお、組織のOSS戊略が欠劂しおいるず、メンバヌが貢献の䟡倀を蚌明できずOSS掻動を瞮小しおしたう「OSSの萜ずし穎ルヌプ」に陥るこずがありたす。 公開資料 「Ways To Level up OSPO Knowledge and Strategies From Local Meetup Japan」 P.5より匕甚 解決策の1぀は、組織内にOSPOを蚭眮し、成熟床モデルに基づいお組織の意識を「利甚のリスク管理」から「貢献の䟡倀創出」ぞずシフトさせるこずです。OSPOずは、組織のオヌプン゜ヌス運甚の䞭栞を担う専門郚眲です。具䜓的な掻動ずしおは、オヌプン゜ヌス掻甚の戊略やポリシヌを䜜成し適甚するこず、オヌプン゜ヌスに関するトレヌニング、倖郚のオヌプン゜ヌスコミュニティずの関係構築などが挙げられたす。 以䞋の図では OSSおよびOSSコミュニティ掻動のメリット を成熟床ごずに瀺しおいたす。成熟床が䞊がるず、そのメリットが 組織内 に留たらず ゚コシステム ぞずより範囲が広くなりたす。 公開資料 「Ways To Level up OSPO Knowledge and Strategies From Local Meetup Japan」 P.15より匕甚 以䞋の図では OSSに察するマむンドセット を成熟床ごずに瀺しおいたす。成熟床が䞊がるず、組織のマむンドセットは OSSのリスク から 䟡倀創出 ぞず倉化したす。 公開資料 「Ways To Level up OSPO Knowledge and Strategies From Local Meetup Japan」 P.16より匕甚 以䞋の図では 組織内でのOSPOの圹割 を成熟床ごずに瀺しおいたす。成熟床が䞊がるず、 ルヌル敎備や教育 から 組織内倖の関係構築や戊略的な意思決定のサポヌト ぞず倉化したす。 公開資料 「Ways To Level up OSPO Knowledge and Strategies From Local Meetup Japan」 P.17より匕甚 OSPOの圚り方は組織によっお様々で正解はありたせんが、以䞊が既存のナレッゞから構築された成熟床モデルでした。「OSSの萜ずし穎ルヌプ」を脱するために参考ずなるモデルです。 本セッションを通しお、OSPOずは䜕か、その圹割ず䟡倀に぀いお知るこずができたした。パネルディスカッション圢匏で、日本でOSPOを実践しおいる方々の話を䌺うこずもでき、非垞に貎重で孊びになる時間でした。今埌、自身のオヌプン゜ヌス掻動を展開しおいく䞊で本セッションの内容を掻かしおいきたいず思いたす。 おわりに 本蚘事では、「Open Source Summit Japan 2025」の参加レポヌトをお届けしたした。 3日間、オヌプン゜ヌスの䞖界に没頭し、刺激を受け続けた貎重な機䌚になりたした。技術の最前線に觊れられるだけでなく、コミュニティ運営やビゞネスでの掻甚方法など倚角的な知芋を埗るこずができ、非垞に有意矩だったず感じおいたす。たた、長期的に「どのようにオヌプン゜ヌスず関わっおいくか」を考えるきっかけにもなりたした。今埌は、オヌプン゜ヌスの戊略的な掻甚に加え、コミュニティぞの還元・貢献の頻床を増やしおいきたいず考えおいたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからご応募ください。 corp.zozo.com
はじめに こんにちは、ビゞネス・アナリティクス郚マヌケティング・サむ゚ンスブロックの 茅原 です。普段はマヌケティング斜策の効果怜蚌を担圓しおいたす。マヌケティング・サむ゚ンスブロックではAI協働型分析フロヌ構築の取り組みをしおいたす。本蚘事では本取り組みの詳现や、この䞭で埗られた知芋をご玹介したす。 目次 はじめに 目次 背景・課題 取り組みの玹介 分析環境の暙準化 AI掻甚フロヌ怜蚌のためのGitHubリポゞトリ構築 分析蚭蚈曞の掻甚 分析䜜業フロヌの定型化 再利甚性を高める工倫 文化の醞成 たずめ 背景・課題 近幎、生成AIの発達が目芚たしく、開発をはじめずする゚ンゞニアリング組織ではその掻甚事䟋が倚く芋られるようになっおきたした。䞀方でデヌタ分析組織においおは、゚ンゞニアリング組織ほど生成AIずの協業事䟋が芋られないずいう所感がありたす。これは分析組織にずっお、 生成AIの持぀䞍確実性の高さが臎呜的である ため、ず考えおいたす。䟋えば、生成AIは「ただ数倀を転蚘する」ずいった簡単なタスクにおいおもハルシネヌションを起こし、誀ったアりトプットを生成しおしたうこずがありたす。デヌタ分析においおは、アりトプットの正確性が非垞に重芁であるため、こうした䞍確実性の高さは倧きな障壁ずなっおいたす。 本蚘事ではその䞍確実性を䜎枛したAI協働型分析フロヌ構築の取り組みに぀いおご玹介したす。たたこうした取り組みは、 生成AIに限定せず、人間も含めた組織党䜓のアりトプット品質向䞊にも寄䞎する ものず考えおいたす。以䞋は珟圚怜蚌䞭の内容ですが、同様の課題を抱える方の参考になれば幞いです。 取り組みの玹介 分析環境の暙準化 たず前準備ずしお、分析環境の暙準化を行いたした。前提ずしお、匊チヌムでは環境ずしおはロヌカル/クラりド、IDEずしおはVS Code/JupyterLabなど、メンバヌによっお䜜業環境が統䞀されおいない状態でした。こういった倚様な環境によっお各環境に合わせた蚭定が必芁ずなり、AI掻甚ナレッゞの転甚が難しくなっおしたう、ずいう状況ずなっおいたした。そのため、Google CloudのCompute Engine (GCE)むンスタンスぞVS CodeからリモヌトSSH接続する圢匏に統䞀したした。これによりAI掻甚ナレッゞの暪展開が可胜になりたした。 AI掻甚フロヌ怜蚌のためのGitHubリポゞトリ構築 こちらも前準備ずしお分析環境の暙準化に加え、AI掻甚フロヌ怜蚌のためのGitHubリポゞトリ構築も行いたした。具䜓的には、20人芏暡のチヌムで䜿甚しおいたGitHubリポゞトリを、4〜5人芏暡のチヌム単䜍に分割したした。 旧来のリポゞトリでは、リポゞトリ党䜓ぞ圱響を及がす蚭定倉曎に他チヌムずの合意が必芁であり、怜蚌/改善をスムヌズに進められない状況になっおしたっおいたした。チヌム単䜍で分割するこずで、各チヌムは独自に蚭定を倉曎できるようになりAI掻甚ナレッゞの詊行錯誀がしやすくなりたした。AI協働型分析フロヌを怜蚌する段階においおは、GitHubリポゞトリの共有範囲は「ルヌルやフロヌを共有する範囲」で区切るこずが怜蚌スピヌドの芳点から望たしいず考えおいたす。 以䞋は実際のリポゞトリのディレクトリ構成䟋です。 aia-ms/ ├── projects/ # 䟝頌郚門ごずに案件を管理するディレクトリ │ ├── marketing_div/ # マヌケティング郚䟝頌案件ディレクトリ │ │ └── project_001/ # 案件ディレクトリ │ │ ├── overview.md # 分析蚭蚈曞ファむル │ │ ├── data/ # CSV等のデヌタファむルディレクトリ │ │ ├── sql/ # SQLファむルディレクトリ │ │ ├── scripts/ # Python, Rの分析コヌドファむルディレクトリ │ │ ├── notebooks/ # Jupyter Notebookのノヌトブックファむルディレクトリ │ │ ├── reports/ # Markdown等のレポヌト関連ファむルディレクトリ │ │ └── etc │ └── etc ├── labs/ # メンバヌごずに自由に䜿甚するディレクトリ │ ├── kayahara/ │ └── etc ├── scripts/ # 再利甚可胜なスクリプトを管理するディレクトリ │ ├── bq_utils/ # BigQueryを操䜜するスクリプトをたずめたディレクトリ │ └── etc └── .github/ # GitHub関連蚭定ディレクトリ │ ├── workflows/ # GitHub Actionsワヌクフロヌを管理するディレクトリ │ ├── prompts/ # GitHub Copilot Chat甚プロンプトファむルを管理するディレクトリ │ ├── agents/ # GitHub Copilot Custom Agents蚭定ファむルを管理するディレクトリ │ └── copilot-instructions.md # GitHub Copilot Chat蚭定ファむル 分析蚭蚈曞の掻甚 以前から郚内で䜿甚しおいた分析蚭蚈曞に぀いお、AI協働のためさらに掻甚するようになりたした。前提ずしお、匊チヌムでは「良い分析のためには、良い分析蚭蚈曞が䞍可欠である」ず考え、AI協働以前の2020幎ごろから分析蚭蚈曞を重んじるフロヌを構築しおいたした。これはデヌタ分析が「1぀の問題に察しおアプロヌチが無数にある」タスクであり、「䜕を解くか」「なぜ解くか」「どう解くか」を関係者党員で合意圢成しおおくこずが重芁、ずいう思想からです。AIずの協働においおは、疑䌌的に「関係者」の䞀員ずしおAIが加わるため、AIに察しおも「なぜこの分析をするのか」「䜕をもっお成功ずするのか」を明確に䌝える必芁がありたす。 分析蚭蚈曞を掻甚するこずで、AIに察しおもこれらの情報を正確に䌝えるこずができ、アりトプットの䞍確実性を䜎枛できたした。具䜓的には、蚭蚈曞の芳点の芋盎し・充実化を行い、党案件で蚭蚈曞を䜜成・レビュヌするような運甚ルヌルを蚭定したした。 蚭蚈曞には、䞻に以䞋の項目を蚘茉しおいたす。 䟝頌の抂芁 分析察象に関する基瀎情報や䟝頌内容 䟝頌郚門の理想/課題 䟝頌の背景ずしお䟝頌郚門が抱える理想や課題 分析察象の理想/課題 䟝頌郚門が抱える理想や課題を螏たえた、分析察象に関する理想や課題 本案件で取り組む課題ずゎヌル 分析察象の理想や課題に察しお、本案件で取り組む具䜓的な課題ず分析におけるゎヌル アりトプット予定項目 ゎヌルを達成するために必芁なアりトプット項目 たた、以前はGoogle Sheetsで管理しおいた分析蚭蚈曞を、GitHubでMarkdown圢匏ずしお管理する方匏に倉曎したした。これにより、䜜業時にはAIぞ蚭蚈曞の内容を容易に参照させるこずができる䞊、蚭蚈曞のレビュヌ時にもプルリク゚スト䞊でGitHub Copilot Reviewを掻甚できるようになりたした。結果ずしお、蚭蚈曞の品質向䞊にも寄䞎したした。 分析䜜業フロヌの定型化 AIのアりトプットの䞍確実性を䞋げるために、分析䜜業フロヌの定型化も行いたした。AI協働型分析の良くない兞型䟋ずしお、「課題感を共有しおAIに自由に分析させた結果、意図しないフロヌで進められ、期埅したアりトプットが埗られない」ずいうものがありたす。 具䜓的には、「Pythonファむルの䞭に長倧なSQLを曞いおしたう」「本来Pythonですべきような耇雑な集蚈凊理をSQLで行っおしたう」ずいったケヌスです。これを防ぐために、AI協働型分析での分析䜜業フロヌを䞋蚘のように定型化し、フロヌず各ステップでのアンチパタヌンをプロンプト内で明瀺的に䌝えるようにしたした。 瀟内Wikiから資料をMarkdown圢匏でダりンロヌドする 資料を基にBigQueryからSQLでデヌタを抜出する 抜出したデヌタをPythonで加工・モデル適甚し、分析結果を埗る 分析結果をMarkdown圢匏のレポヌトにたずめる 各ステップで再利甚可胜なPythonスクリプトを開発し、安定しお各ステップの䜜業ができるようにしたした。具䜓䟋ずしおは、ステップ4では「CSVを自動でMarkdown圢匏の衚に倉換する」スクリプトを䜜成したした。非垞にシンプルなタスクであり、AIにも可胜そうに芋えたすが、実際にこのようなタスクを任せた際にハルシネヌションが発生し「元のCSVず党く違った数倀がレポヌトに転蚘される」ずいった事象が発生したした。そのため、このようにフロヌを定型化し、各ステップで再利甚可胜な仕組みを構築するこずで、AIのアりトプットの䞍確実性を䜎枛したした。 再利甚性を高める工倫 AI協働型分析の倧きな匷みの1぀は、 「再利甚性の高さ」 です。䟋えば、同じような分析タスクが発生した堎合、過去の分析コヌドやプロンプトを再利甚し、効率的に分析を進めるこずができたす。これを最倧限掻甚するため、LLMツヌルの機胜を積極的に掻甚する方針を採りたした。 具䜓的には、GitHub Copilotの以䞋の機胜を掻甚しおいたす。これらの蚭定ファむルはいずれもMarkdown圢匏で保存されおいたす。リポゞトリ内で共有可胜なため、チヌム内での暪展開が容易です。 Prompt Files : あらかじめ定矩したプロンプトをファむルずしお保存し、再利甚可胜にする機胜。これにより、分析フロヌの各ステップで䜿甚するプロンプトを暙準化し、チヌム内で共有できるようになった。 Custom Agents : 耇数のプロンプトやツヌルを組み合わせお、特定のタスクに特化した゚ヌゞェントを䜜成できる機胜。これにより、フロヌにおける各ステップを自動化する゚ヌゞェントを構築し、効率的に分析を進められるようになった。 以䞋は分析蚭蚈曞をレビュヌするプロンプトファむルの䟋です。以䞋のようなファむルを䜜成し所定のフォルダに保存するこずで、GitHub Copilot Chatからスラッシュコマンド圢匏ですぐ呌び出すこずが可胜ずなりたす。 --- agent: 'edit' description: 'Review the analysis design document for clarity, consistency, and completeness, then propose specific revisions and improvements to its structure, logic, and wording.' --- - 回答は **必ず** 日本語で蚘茉しおください - 添付された文章を以䞋の芳点でレビュヌし、修正を提案しおください # 党䜓 - 論理の流れがマクロからミクロぞ分断なく接続できおいるか - 解釈が揺れる衚珟、䞍明確な衚珟を䜿甚しおいないか ## 1. 斜策/䟝頌の抂芁 - 分析察象に぀いお、十分な情報があるか - 䟋: 斜策意図、察象者、蚎求方法、斜策内容、怜蚌蚭蚈(RCT有無) ## 2. 事業郚の理想/課題 - 事業郚の長期的な理想/課題が理解できる蚘述か / 短期的であったりタスクベヌスであったりしないか ## 3. 斜策の理想/課題 - 本斜策が䜕を目指しおいるか、KPIベヌスで蚘茉できおいるか ## 4. 本案件で取り組む課題ずゎヌル ### 課題 - タスクリスト等ではなく課題の圢匏できおいない 等で蚘茉できおいるか ### ゎヌル - タスクリスト等ではなくゎヌルの圢匏によっお○○を××する 等で蚘茉できおいるか - 課題に玐づいたゎヌルずなっおいるか - どのようなビゞネスアクション or 貢献に繋げたいか蚘茉できおいるか ### 問 - タスクリスト等ではなく問の圢匏かで蚘茉できおいるか - ゎヌルに玐づいた問ずなっおいるか ### 刀断指暙/基準 - 刀断指暙ずその定量基準を蚘茉できおいるか(暫定でも可) - 刀断指暙/基準がない堎合、代替ずなるもの(目暙ラむン等)を蚘茉できおいるか ## 5. アりトプット予定項目 - アりトプット項目圢匏ずしお、名詞の箇条曞きにできおいるか - 具䜓的に算出する指暙を蚘茉できおいるか (䞻芁なもののみでOK) これらの䜜業単䜍で組み䞊げたプロンプト&゚ヌゞェントず、各案件の分析蚭蚈曞を組み合わせるこずで、効率的か぀安定的にAI協働型分析を進められる仕組みの構築を詊みおいたす。 文化の醞成 䞊蚘のような仕組みの敎備に加え、文化の醞成にも取り組みたした。日倜進歩するAIぞの理解床やLLMツヌルの掻甚状況は、どうしおも各メンバヌの興味や意欲に䟝存しおしたう郚分があり、差が付きやすいずいう課題があるかず思いたす。この差を攟眮するず、AIに明るくないメンバヌにずっおは「気が付いたら耇雑なフロヌを組たれおいお着いおいけない」ずいった状況になり、悪埪環に陥りかねたせん。そこで、䞋蚘の2斜策を実斜したした。 1点目は事䟋共有䌚の開催です。実際の案件でのAI掻甚事䟋を共有し、「どんな良さがあったか」「うたくいかないずきにどうすればいいか」ずいったポむントをセットで共有したした。これにより、各メンバヌにたず「やっおみたい」ず思っおもらう、䜿っおみお躓いたずきに「もう䞀床詊しおみよう」ず思っおもらうこずをタヌゲットずしたした。 2点目は初心者向けレクチャの開催です。「そもそもどんなツヌルがあるのか」「各ツヌルでどんな操䜜をすれば䜕ができるのか」ずいう基瀎的な内容を、匊チヌムの業務フロヌに合わせた圢でレクチャしたした。これにより、各メンバヌが「やっおみたい」ず思ったずきにすぐに詊せるような土台を䜜りたした。 䞊蚘の䞻芁斜策の他にも、Slackのtimesチャンネルやチヌムの朝䌚での情報共有など、継続的に文化醞成を図る取り組みを行っおいたす。 たずめ 本蚘事ではAI協働型分析フロヌ構築の取り組みを玹介したした。AI協働型分析フロヌの導入を怜蚎しおいる方がいれば、ぜひ参考にしおみおください。䞊蚘はただ怜蚌䞭のステヌタスであり、今埌も改善を続けおいく予定です。新たな知芋が埗られ次第、改めお共有いたしたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
.table-of-contents > li > ul > li > ul { display: none; } .w70p .figure-image img { width:70%; } 12月1日〜12月5日にラスベガスで AWS re:Invent 2025 が開催され、ZOZOの゚ンゞニアが5名参加したした。この蚘事の前半では熱気に溢れる䌚堎の様子を、埌半では面癜かったセッションに぀いおご玹介したす AWS re:inventずは 珟地の様子 メむン䌚堎 朝食や昌食 Sports Forum 無料のStarbucks Coffee AWS䞻催のパヌティ セッションレポヌト Build observable AI agents with Strands, AgentCore, and Datadog (AIM233) AI゚ヌゞェント運甚の課題 Strands AgentsずAgentCore デモAWS Newsletter Agent AWS Well-Architected Framework - Generative AI Lens DatadogによるLLM Observability たずめ SEC320-R: The AWS Security Incident Response Challenge: Defend the Cake! ストヌリヌ蚭定Unicorn Cake Companyを守れ むンシデント察応のアプロヌチNIST SP 800-61 Rev.3 環境のアヌキテクチャ CISOからの指瀺 取り組んだセキュリティ課題 1. アクセス制埡の匷化 2. クラりンゞュ゚ル秘密のレシピの保護 3. 怜出ず譊告の蚭定 4. りェブサむトの保護 攻撃者の手口知っおおくべき統蚈 IAM蚭定の問題点 Shift Left開発段階からのセキュリティ AWS CIRT リ゜ヌス Workshopの様子 たずめ Accelerate platform engineering on Amazon EKS (CNS301-R1) Workshopの抂芁 プラットフォヌム基盀構築 生成AIを掻甚したプラットフォヌム゚ンゞニアリング Progressive Deliveryの実践 感想 Using Amazon Q to Cost Optimize Your Containerized Workloads (CMP348) Workshopの抂芁 Amazon Qによる移行分析 負荷詊隓でGravitonぞの移行の効果枬定 段階的な移行アヌキテクチャ Phase 1: 移行甚のGraviton NodePoolを甚意し、pilot環境での移行怜蚌 Phase 2: capacity-spreadの導入 Phase 3: トラフィック分散 感想 Infrastructure Innovations (KEY004) 講挔のはじめに 䞻なアップデヌト #1 Graviton5 䞻なアップデヌト #2 Lambda Managed Instances 䞻なアップデヌト #3 Vectors ゲストセッション 講挔を通じお感じたこず おたけ Advanced AWS Network Security : Building Scalable Production Defenses [REPEAT] (SEC303-R1) 䞻な内容 AWS Network Firewallずは Route 53 Resolver DNS Firewallずは Labのアヌキテクチャ図 AWS Network Firewallでの通信制埡 DNS Firewallでの通信制埡 Workshopたずめ The Kiro coding challenge (DVT317) Workshopの抂芁 実践 たずめ Ditch your old SRE playbook: AI SRE for root cause in minutes (sponsored by Resolve AI) (AIM260-S) 抂芁 内容 ゜フトりェア゚ンゞニアリングの進化 AI for prod Resolve AIの3぀の重芁な特城 AI゚ヌゞェント構築のアプロヌチ比范 感想 [NEW LAUNCH] Resolve and prevent future operational issues with AWS DevOps Agent [REPEAT] (DVT337-R1) AWS DevOps Agentができるこず - AWS䞊のリ゜ヌスの可芖化 AWS DevOps Agentができるこず - 障害調査 実際の䜿い所 おわりに AWS re:inventずは re:Invent はAmazon Web ServicesAWSが䞻催するAWS最倧のカンファレンスです。このむベントでは、AWSが提䟛する様々なクラりドサヌビスに関する新サヌビスやアップデヌトが発衚されたす。 2025幎は䞖界䞭から玄60,000人以䞊が、日本から昚幎ず同皋床がラスベガスに集たりたした。今幎のre:Inventでは、「 AIアシスタントからAI゚ヌゞェントぞ 」ずいう転換点を象城するむベントでした。 珟地の様子 メむン䌚堎 The Venetian Resort Las Vegasがメむンの䌚堎ずなっおおり、KeynoteやEXPO、Swagノベルティなど様々なコンテンツがここに集合しおいたす。そんな䌚堎で出䌚った様々なコンテンツをご玹介いたしたす メむン䌚堎では、AWS re:Invent䌚堎ぞの入口案内があり、この時点ですでに私たちはテンションがずおも䞊がっおいたした。呚りの参加者からも笑い声や笑顔で写真を撮る人も倚くずおもよい空間ずなっおいたした。 ゚ントランスの様子 メむン䌚堎に入るず、倧きな黒板がありチョヌクで奜きなように描けたした。たくさんの参加者がここで瀟名を曞き蚘念撮圱を行なっおいたした。むベントが行われる5日間このブヌスもずおも盛り䞊がっおいたした。 メむン䌚堎にある倧きな黒板 ZOZOTOWNの名を蚘したした メむン䌚堎で特に盛り䞊がっおいたブヌスはKiroのお化け屋敷でした。筆者もお化け屋敷に入りたした コヌディングによるバグや゚ラヌなどがホラヌ挔出ずしお珟れ、それをKiroが救っおくれるずいった内容だったず思いたす。このお化け屋敷を抜けた埌に、蚘念写真をずっおもらい、さらにKiroのSwagもいただきたした Kiroのお化け屋敷 メむン䌚堎にはAWSの公匏グッズが売っおいるショップもありたした シャツやパヌカヌ、リュック、タンブラヌなど様々な商品が売っおおりどれも魅力的でした 来幎参加される方はぜひ立ち寄っおみおください AWS公匏ショップ「AWS Merch Store」 メむン䌚堎には2日目から䞖界的な䌁業がブヌスを構えおいるEXPO゚リアがオヌプンしたす EXPO゚リアの様子 各䌁業のブヌスに行っお、議論を亀わしたりサヌビスの説明を受けたりしたした。 EXPO゚リアにある䌁業ブヌスの様子 アンケヌトに答えたりゲヌムをクリアしたりするずSwagがもらえたす。珟地参加したメンバヌもSwag集めを楜しんでいたした 特に Resolve.ai さんのブヌスでは、オリゞナルのパヌカヌに目の前で自分の名前を印字しおくださる䌁画が開催されおおり、長蛇の列ができおいたした 長蛇の列ができおいたResolve.aiさんのブヌスの様子 どの䌁業もブヌスやSwagに力を入れおおり、持っお垰るのがかなり倧倉でしたが、様々な䌁業の話も聞けお楜しかったです 珟地でいただいた数々のSwagたち 朝食や昌食 re:Inventの䌚期䞭は、朝食や昌食が各䌚堎で提䟛されおいお、参加者なら無料で食べられたす ビュッフェ圢匏なので奜きなものを食べられたした 珟地でいただいたビュッフェの様子 さらに、セッション䌚堎の通路で定期的に軜食も提䟛されたす。Workshopなど長めのセッションに参加する時は、軜食やコヌヒヌを持ち蟌んで栄逊補絊しながら臚みたした セッション䌚堎の通路で定期的に提䟛される軜食 Sports Forum AWSがスポヌツ領域でどのようにクラりドやAIを掻甚しおいるか、展瀺・セッション・䜓隓ブヌスを通じお䜓感できるSports ForumずいうむベントゟヌンがCaesars Forum䌚堎で開催されおいたした Caesars Forum 䌚堎で開催されおいたSports Forumずいうむベントゟヌン F1からNBAたで様々なスポヌツでの技術掻甚䟋が展瀺されおおり、セッションの合間のリフレッシュにもなり、ずおも楜しい空間でした。eSportsのRiot Games瀟も展瀺しおおり、ゲヌムを䜓隓できるスペヌスも甚意されおいたした。 eSportsのRiot Games瀟の展瀺 ゲヌムを䜓隓できるスペヌス 無料のStarbucks Coffee re:Invent参加者には、䌚堎であるVenetian内のスタヌバックスでドリンクずフヌド、合わせお4点たでが無料で提䟛されたす 朝8:30くらいに行った際は30分ほど䞊んだので、時間に䜙裕のある方はぜひお立ち寄りください re:Invent参加者には、Venetian内のStarbucks Coffeeでドリンクずフヌドが無料で提䟛される AWS䞻催のパヌティ APJ Kick Off Partyずre:Play䌚堎内の様子 初日12/1は、「 APJ Kick Off Party 」に行っおきたした。本むベントはアゞア倪平掋地域ず日本からre:Inventに参加する方向けのAWS公匏のネットワヌキングむベントです。ラスベガスのナむトクラブで行われたす。今幎の出挔はマヌク・ロン゜ンさんでした。ブルヌノ・マヌズさんずの「Uptown Funk」など、倧ヒット曲を生み出しおいたす。 たた、最終日前日、12/4には「 re:Play 」ずいうパヌティヌが行われたした。これはre:Inventのフィナヌレのようなもので、倧きな広堎を䜿い行われたした。日付が倉わるたでパヌティヌでした。最埌を締め括ったのはDJのKASKADEさんで、䌚堎は倧盛り䞊がりでした セッションレポヌト ここからはre:Inventの参加メンバヌが気になったセッションを玹介したす。 Build observable AI agents with Strands, AgentCore, and Datadog (AIM233) SRE郚 カヌト決枈SREブロックの小束です。ZOZOTOWNのカヌト決枈機胜のリプレむス・運甚・保守に携わっおいたす。たた、党瀟のAWS管理者ずしおの圹割も担っおいたす。 今回は興味を持っおいたサヌビスの1぀であるStrands AgentsずAmazon Bedrock AgentCoreに぀いお、AI゚ヌゞェントの本番運甚に向けたObservability可芳枬性の芳点から玹介されたセッションに参加したした。 DatadogのSr. Technical AdvocateであるKunal Batra氏ず、AWSのSr. Developer AdvocateであるDu'An Lightfoot氏による共同セッションで、その内容に぀いお簡単ではありたすがご玹介したす。 AIM233 セッションの様子 AI゚ヌゞェント運甚の課題 セッション冒頭では、AI゚ヌゞェントをスケヌルで運甚する際の課題が玹介されたした。 AI゚ヌゞェント運甚の課題 Hallucinations & Quality : LLMが䞍正確な情報を生成する可胜性があり、継続的な評䟡ず修正が必芁 Complexity : ゚ヌゞェントは耇合システムであり、内郚の動䜜が芋えないずトラブルシュヌティングが困難 LLM Costs : 本番ワヌクロヌドではコストが容易に膚らむ Security & Safety : プロンプトむンゞェクションやデヌタ挏掩のリスク 特に印象的だったのは、゚ヌゞェントが「非決定的non-deterministic」であるずいう点です。同じ入力でも異なる出力を返す可胜性があり、埓来の゜フトりェアずは異なるアプロヌチでの監芖が必芁になりたす。 印象的だった゚ヌゞェントが「非決定的non-deterministic」であるずいう点 Strands AgentsずAgentCore 続いお、AWSが提䟛する、゚ヌゞェント構築・運甚ツヌルが玹介されたした。 Strands Agents は、わずか数行のコヌドで゚ヌゞェントを構築できるオヌプン゜ヌスのPython SDKです。モデルに䟝存せず、MCPやA2Aプロトコルもサポヌトしおいたす。 Strands Agents Amazon Bedrock AgentCore は、゚ヌゞェントを本番環境にデプロむするための包括的なプラットフォヌムです。 Amazon Bedrock AgentCore AgentCoreは以䞋のコンポヌネントを提䟛したす。 Runtime : ゚ヌゞェントのホスティング環境。DockerfileたたはCode-zipでデプロむ可胜 Memory : 短期蚘憶チャット履歎、セッション状態ず長期蚘憶セマンティック、ナヌザヌ蚭定、゚ピ゜ディック Observability : OpenTelemetryOTELベヌスのテレメトリ収集 Identity/Policy/Gateway : セキュリティずアクセス制埡 デモAWS Newsletter Agent セッションではAWS Newsletter Agentを䜿ったデモが行われたした。この゚ヌゞェントはAWSの最新ニュヌスを取埗し、AIに関連するアップデヌトをフィルタリングしおニュヌスレタヌずしお配信したす。 AWS Newsletter Agentのデモ デモでは、以䞋のような流れが玹介されたした。 ナヌザヌが「What's new in AWS today?」ず質問 ゚ヌゞェントが current_time ず fetch_aws_news ツヌルを実行 AI/MLに関連するニュヌスを抜出しおサマリヌを生成 ニュヌスレタヌをメヌルで送信 デモの流れ さらに、゚ヌゞェントが自然蚀語の指瀺だけでEventBridgeのスケゞュヌルを䜜成し、毎日自動でニュヌスレタヌを配信する蚭定たで行っおいたした。 AWS Well-Architected Framework - Generative AI Lens セッションでは、AWS Well-Architected Frameworkに Generative AI Lens が2025幎に远加されたこずも玹介されたした。 AWS Well-Architected FrameworkにGenerative AI Lens 6぀の柱それぞれにAI゚ヌゞェント向けのベストプラクティスが定矩されおいたす。 Operational Excellence : 包括的なObservabilityの実装 Security : 安党で責任あるアりトプットのためのGuardrails Cost Optimization : 長時間実行ワヌクフロヌにおける停止条件の蚭定 DatadogによるLLM Observability セッション埌半では、Datadogを䜿ったAI゚ヌゞェントの監芖デモが行われたした。 Datadogを䜿ったAI゚ヌゞェントの監芖デモ Datadogの LLM Observability では、以䞋のような情報を䞀元的に確認できたす。 Summary : ゚ラヌレヌト、LLM呌び出し回数、トヌクン䜿甚量の抂芁。 Evaluations : ゚ヌゞェントの応答品質を評䟡。「Failure to Answer」の割合や、カスタム評䟡Financial Advisory Compliance Checkなどの結果を確認できる。 Cost : トヌクン䜿甚量ずコストの掚移。最もコストがかかっおいるモデル呌び出しを特定できる。 Traces : ゚ヌゞェントの凊理フロヌを詳现に远跡。特に印象的だったのは、マルチ゚ヌゞェント構成Budget Guru → Triage Agent → Prompt Injection Agent → PII Detection Agentの各ステップが可芖化されおいる点。 Security & Safety : プロンプトむンゞェクション、出力の有害性Toxicity、PII個人情報の怜出状況を監芖できる。 Experiments : 異なるモデルやプロンプトを比范しお、品質・コスト・レむテンシのトレヌドオフを分析できる。Claude Haiku 4.5など耇数モデルが比范されおいた。 たずめ AI゚ヌゞェントを本番運甚する䞊で、埓来のアプリケヌション監芖ずは異なる芳点が必芁だず実感したした。特に以䞋の点が印象に残っおいたす。 非決定性ぞの察応 : 同じ入力でも出力が倉わるため、品質評䟡の自動化が重芁 コスト可芖化 : トヌクン単䜍でのコスト远跡により、予期せぬコスト増加を早期に怜知 セキュリティ監芖 : プロンプトむンゞェクションやPII挏掩のリアルタむム怜出 マルチ゚ヌゞェントのトレヌス : 耇数゚ヌゞェントが連携する堎合、凊理フロヌの可芖化が䞍可欠 匊瀟でもAI゚ヌゞェントの掻甚を進めおいたすが、本番運甚に向けおはObservabilityの敎備が重芁な課題になりそうです。StrandsずAgentCore、そしおDatadogの組み合わせは、その解決策の1぀ずしお怜蚎しおいきたいず思いたす。 SEC320-R: The AWS Security Incident Response Challenge: Defend the Cake! このWorkshopは、架空の䌁業「Unicorn Cake Company」のセキュリティチヌムずしお、攻撃者Grumpy Catsから秘密のレシピを守るずいう、ゲヌム圢匏で楜しみながらセキュリティむンシデント察応を孊べる内容でした。 SEC320-R Workshopの様子 このWorkshopでは、Blue Teamずしお、AWS Lambdaで実装されたRed Teamの攻撃を防埡するシナリオをシミュレヌトしたす。30分の準備期間の埌、攻撃が開始され、リアルタむムで察応しおいく圢匏です。 Workshopの抂芁 画像匕甚元: Workshop参加者向けに甚意されたペヌゞの画面をスクリヌンショット ストヌリヌ蚭定Unicorn Cake Companyを守れ 参加者は「Unicorn Cake Company」ずいう架空のケヌキ補造䌚瀟のクラりドセキュリティチヌムずしお参加したす。この䌚瀟はナニコヌン向けの魔法のケヌキを補造しおおり、その秘密のレシピ「UnicornCakesSecretRecipe.txt」が攻撃者に狙われおいたす。 攻撃者は「Grumpy Cats気難しい猫たち」ず呌ばれる集団で、レシピを盗むか、盗めなければ砎壊しようずしおいたす。 むンシデント察応のアプロヌチNIST SP 800-61 Rev.3 Workshopでは、 NIST SP 800-61 Rev.3 に基づいたむンシデント察応のフレヌムワヌクが玹介されたした。 むンシデント察応のフレヌムワヌク Preparation準備 : むンシデント察応胜力の確立、ツヌルの準備、スタッフの蚓緎 Detection & Analysis怜出ず分析 : 脅嚁の怜出ず圱響範囲の分析 Containment, Eradication & Recovery封じ蟌め、根絶、埩旧 : 被害の拡倧防止ず埩旧 Post-Incident Activity事埌掻動 : 振り返りず改善 Incident Response 特に印象的だったのは「 Incident Response is a TEAM SPORT! 」ずいうメッセヌゞです。セキュリティむンシデント察応は䞀人で行うものではなく、チヌム党䜓で取り組むべきものだずいう点が匷調されおいたした。 特に印象的だった「Incident Response is a TEAM SPORT!」ずいうメッセヌゞ 環境のアヌキテクチャ Workshopの環境は単䞀リヌゞョンus-east-1で構成されおおり、以䞋のコンポヌネントで構成されおいたす。 環境のアヌキテクチャ図 画像匕甚元: Workshop参加者向けに甚意されたペヌゞの画面をスクリヌンショット 䞻芁コンポヌネント CloudFront Distribution → Lambda (Competition Upload) → S3 (Competition Uploads) VPC内 Unicorn Cake Company Website → S3 (Unicorn Production Bucket) WorkshopHints 本番環境倖、ヒント甚 Unicorn Logging ログ保存甚 組織構造 25人のナヌザヌが5぀のチヌムに分かれおいる 営業、HR、開発、食品工孊、レストラン経営者 党員がアクセスキヌず管理者暩限を持っおいる これがセキュリティ的にダバい蚭定 党員がアクセスキヌず管理者暩限を持っおいる蚭定 画像匕甚元: Workshop参加者向けに甚意されたペヌゞの画面をスクリヌンショット CISOからの指瀺 Workshopでは、CISORainbow Sparkles氏からの緊急ブリヌフィングずいう圢で、取り組むべき課題が提瀺されたす。 CISOからの指瀺 画像匕甚元: Workshop参加者向けに甚意されたペヌゞの画面をスクリヌンショット 最重芁ルヌル「生産を停止しおはいけたせん」 ナニコヌンたちのために魔法のケヌキを䜜り続けなければならないずいう制玄の䞭で、セキュリティを匷化する必芁がありたす。これは実際の本番環境でも同様で、セキュリティ察策のために事業を止めるこずはできないずいう珟実的な制玄を䜓隓できたす。 取り組んだセキュリティ課題 CISOから提瀺された課題は倧きく4぀のカテゎリに分かれおいたした。 1. アクセス制埡の匷化 MFAの有効化 : 党ナヌザヌにMFAを蚭定たずは「Unicorn_Cakes_Sales_1」で実挔 IAM認蚌情報レポヌトのダりンロヌド : 珟状の把握 2. クラりンゞュ゚ル秘密のレシピの保護 削陀・ダりンロヌドの远跡 : 誰がレシピにアクセスしたかを特定できるようにする 改ざん怜知 : レシピが倉曎されおいないこずを確認する方法 䞍倉ストレヌゞ : S3 Object Lockを䜿甚しお、管理者でも削陀できないようにする 倚局防埡 : S3バケットポリシヌでAWSアカりント内からのみアクセス可胜にする 3. 怜出ず譊告の蚭定 Amazon GuardDutyの有効化 : 24時間365日の脅嚁怜知 即時アラヌトの蚭定 : EventBridgeを䜿甚しおレシピぞのアクセスをリアルタむムで通知 CloudTrailの蚭定確認 : ログが正しく収集されおいるかの確認 4. りェブサむトの保護 可甚性の維持 : りェブサむトが継続しお動䜜するこずを確保 埩旧手順の確立 : 䞇が䞀砎損した堎合の埩旧方法 攻撃者の手口知っおおくべき統蚈 Workshopでは、実際の攻撃者がどのような方法で初期アクセスを獲埗するかずいう統蚈も玹介されたした。 実際の攻撃者がどのような方法で初期アクセスを獲埗するかずいう統蚈 66% : 有効なIAM認蚌情報を䜿甚うち玄1/3がroot認蚌情報 13% : 公開されたEC2むンスタンス経由 この統蚈からも、IAM認蚌情報の管理がいかに重芁かがわかりたす。 IAM蚭定の問題点 Workshopの環境には、意図的にセキュリティ䞊の問題が含たれおいたした。 IAM蚭定の問題点 Long-term Security Credentials : 長期間有効なアクセスキヌの䜿甚 MFA未蚭定 : MFAトヌクンが蚭定されおいない×マヌク 過剰な暩限 : 党ナヌザヌがInline Policyで管理者暩限を持っおいる たた、「Overprivileged website」ずしお、EC2むンスタンスがIMDSv1を䜿甚しお過剰な暩限を持぀IAMロヌルがアタッチされおいるずいう、兞型的な攻撃察象ずなる構成も玹介されたした。 兞型的な攻撃察象ずなる構成 Shift Left開発段階からのセキュリティ Workshopの最埌には、「Shift security left in your development flow」ずいうメッセヌゞずずもに、 Kiro が玹介されたした。 Shift security left in your development flow 開発段階からApplication Security Testingを導入するこずで、本番環境に脆匱性を持ち蟌たないようにするアプロヌチです。 AWS CIRT リ゜ヌス セッションの最埌には、AWS CIRTCustomer Incident Response Teamが提䟛する、有甚なリンク集がQRコヌドで共有されたした。むンシデント察応に぀いおさらに孊びたい方は、こちらのリ゜ヌスも参考になりたす。 builder.aws.com Workshopの様子 䌚堎では倚くの参加者がチヌムごずに分かれお、リアルタむムで攻撃に察応しおいたした。スコアボヌドには各チヌムのポむントが衚瀺され、競争圢匏で楜しみながら孊べる環境でした。 たずめ このWorkshopを通じお、以䞋の点が特に印象に残りたした。 セキュリティず事業継続のバランス :「生産を停止しおはいけない」ずいう制玄の䞭でセキュリティを匷化する経隓は、実際の本番環境でも盎面する課題そのものでした。 倚局防埡の重芁性 : IAMポリシヌ、S3バケットポリシヌ、MFA、GuardDuty、CloudTrailなど、耇数のレむダヌで防埡するこずの重芁性を実感したした。 怜知ず察応の速床 : 攻撃はい぀来るかわかりたせん。GuardDutyやEventBridgeを䜿ったリアルタむム怜知の仕組みが、早期察応には䞍可欠。 チヌムワヌク : 「Incident Response is a TEAM SPORT!」ずいうメッセヌゞ通り、䞀人ではなくチヌムで察応するこずの重芁性を孊びたした。 匊瀟でもAWS環境のセキュリティ匷化を進めおいたすが、このWorkshopで孊んだ実践的な知識を掻かしお、より堅牢なセキュリティ䜓制を構築しおいきたいず思いたす。 Accelerate platform engineering on Amazon EKS (CNS301-R1) SRE郚 プラットフォヌムSREブロックのさかべっちです 普段はZOZOTOWNのマむクロサヌビス基盀をEKSで構築・運甚しおいたす。 最先端のプラットフォヌム゚ンゞニアリングを孊ぶため参加しおきたした 倚くの人が垰囜する最終日に開催されたセッションにもかかわらず、予玄しおいない人はほずんど入れおいなかったずおも人気のセッションでした。 Workshopの抂芁 BackstageやArgo CDなどの最先端ツヌルやKiroを駆䜿しお、ハンズオン圢匏で開発プラットフォヌムを構築するものでした。Workshopで䜿甚したプラットフォヌムは、EKS Auto Mode䞊に構築されおおり、非垞に豪華な構成でした。 ハンズオン圢匏で開発プラットフォヌムを構築するWorkshop 䞻なコンポヌネントは以䞋の通りです。 Backstage開発者ポヌタル Argo CDGitOps゚ンゞン Argo WorkflowsCI/CDワヌクフロヌ Argo RolloutsProgressive Delivery KubeVelaOAMOpen Application Modelベヌスのアプリケヌション管理 kroKubernetes Resource Orchestrator Kargo環境間のプロモヌション管理 Amazon Q生成AIアシスタント 今幎発衚されたEKS Capabilitiesに぀いおもここで玹介されたした。 発衚されたばかりのEKS Capabilitiesに぀いおも玹介 Argo CD、ACKAWS Controllers for Kubernetes、kroがマネヌゞドで提䟛されるようになり、運甚負荷が倧幅に䞋がりそうです。VPC CNIやFluent BitなどのEKS addonずは別物で、詳しくは䞋蚘のbreakout sessionで玹介されおいるのでご芧ください。 www.youtube.com プラットフォヌム基盀構築 Workshopの前半は、Backstageを䜿っおプラットフォヌム基盀を構築しおいく内容でした。Backstageを䜿うず、サヌビスカタログ、API䞀芧、ドキュメント、CI/CDパむプラむンの状態などを䞀元管理できたす。特に感動したのは、テンプレヌトからCI/CDパむプラむンを数クリックで構築できる点です。Application Name、AWS Region、EKS Cluster Nameなどを入力しお「CREATE」を抌すだけで、GitLabリポゞトリの䜜成からArgo CDの蚭定たで自動で行っおくれたす。 たった数分でGitOpsワヌクフロヌの構築が完了する たった数分でGitOpsワヌクフロヌの構築が完了したした。GitOpsずは、むンフラやアプリケヌションの状態をGitで宣蚀的に管理する手法です。Gitにマニフェストをpushするず、Argo CDが差分を怜知しお自動でEKSクラスタヌに反映しおくれたす。 生成AIを掻甚したプラットフォヌム゚ンゞニアリング Kiroをプラットフォヌム゚ンゞニアリングに掻甚する方法も玹介されたした。Kiroを掻甚しお先ほどのプラットフォヌム基盀にアプリケヌションをデプロむしたす。 KiroにRustアプリケヌションのDynamoDBテヌブルずデプロむマニフェストを䜜成しおもらいたした。 Please use the Kubevela OAM component definition ...䞭略 as a template and create a new Kubevela OAM component definition with the name of ddb-table using this dynamodb table CRD yaml Create an OAM manifest ...䞭略 using Kubevela templates Include in strict order of dependency using dependsOn between components: - DynamoDB table with component-policy trait for permissions - Service account - Rust app (deploy last) - Path based ingress with /rust-app routing KubeVelaを甚いたアプリケヌションマニフェストが生成されたす。KubeVelaを䜿うず、OAMOpen Application Modelに基づいおマむクロサヌビスを1぀のファむルで定矩できたす。通垞であればDeployment、Service、Ingressなどを個別に曞く必芁がありたすが、KubeVelaのOAMを䜿えばこれだけでOKです。 apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: rust-application spec: components: - name: rust-webservice type: appmod-service properties: image: <image> image_name: java-app port: 8080 targetPort: 8080 replicas: 2 appPath: "/app" env: - name: APP_ENV value: "DEV" readinessProbe: httpGet: path: /app/ port: 8080 initialDelaySeconds: 10 periodSeconds: 5 timeoutSeconds: 5 resources: requests: cpu: "500m" memory: "256Mi" limits: memory: "512Mi" functionalGate: pause: "20s" image: "httpd:alpine" extraArgs: "red" performanceGate: pause: "10s" image: "httpd:alpine" extraArgs: "160" traits: - type: path-based-ingress properties: domain: "*.elb.us-west-2.amazonaws.com" rewritePath: true http: /app: 8080 たた、kroKubernetes Resource Orchestratorを䜿うず、cicdpipelinesやeksclusterずいった新しいカスタムAPIを䜜成でき、KubernetesずAWSリ゜ヌスのデプロむをさらにシンプルにできたす。䞊蚘のコヌドをGitにpushするず自動でビルド・テスト・デプロむが実行されたす。 git pushするず自動でビルド・テスト・デプロむが実行される Progressive Deliveryの実践 Workshopの埌半では、Argo Rolloutsを䜿ったProgressive Deliveryを䜓隓したした。Argo Rolloutsの詳现な蚭定はプラットフォヌム゚ンゞニアが担圓し、開発者はKubeVelaのコンポヌネントを䜿っおgit pushするだけで段階的デプロむを実珟できるようにしたす。 CI/CDパむプラむンず組み合わせるず、Progressive Deliveryは以䞋のようなフロヌになりたす。 開発者がGitリポゞトリにコヌドをプッシュ Argo Workflowsがコヌドをコンパむル、むメヌゞをビルド、ECRにプッシュし、マニフェストのむメヌゞタグを曎新 Argo CDがマニフェストの倉曎を怜知し、DEV環境ぞのデプロむをトリガヌ Rolloutが新バヌゞョンを20に展開し、機胜テストを実行 40、60、80ず段階的に展開し、パフォヌマンステストを実行 テスト倱敗時は自動で最埌の安定バヌゞョンにロヌルバック 実際にわざず゚ラヌになる倉曎を入れおテストしおみたした。 わざず゚ラヌになる倉曎を入れおテストする revision:4のAnalysisRunが「Failed」ずなり、自動でロヌルバックされおいたす。修正を加えお再床git pushするず、無事Successfulになりたした。 修正を入れお再床git pushするず、無事Successfulになる DEV環境ぞのデプロむが成功した埌はPROD環境ぞのデプロむです。DEVからPRODぞの昇栌管理にはKargoを䜿いたした。Kargo UIで「Promote」をクリックするず、先ほどDEVでデプロむが成功したむメヌゞを䜿甚しお、自動でK8sマニフェストを曎新しおくれたす。 DEVでデプロむが成功したむメヌゞを䜿甚しお、自動でK8sマニフェストを曎新しおくれる DEVで成功したむメヌゞをそのたたPRODに適甚できるので、環境間の差異による問題を防げたす。 さらに、DevOps Research and Assessment (DORA) メトリクスも自動で蚈枬・可芖化されたす。これにより、チヌムや組織の゜フトりェアデリバリのスピヌドず品質の改善点を特定できたす。 チヌムや組織の゜フトりェアデリバリのスピヌドず品質の改善点を特定できる 最終的に構築したDevOpsアヌキテクチャの党䜓像は䞋蚘の通りです。 最終的に構築したDevOpsアヌキテクチャの党䜓像 感想 Backstageの導入を怜蚎しおいたのですが、実際に觊っおみおCI/CDパむプラむンをテンプレヌト化しお開発者に提䟛できる点が䟿利であるこずを実感したした。たた、EKS Capabilitiesで今埌Argo CDなどがマネヌゞドで提䟛されるようになるず、プラットフォヌムの構築・運甚コストが倧幅に䞋がりそうです。 ただ、匊チヌムでは珟圚FluxCDを䜿っおGitOpsを運甚しおいたすが、今回のre:Inventの発衚を芋る限りArgo CDがかなり掚されおいる印象だったので、䞭長期的にはArgo CD移行も芖野に入れお怜蚎しおいく必芁がありそうです。今埌様々なEKS゚コシステムのEKS Capabilitiesも䜿えるようになるず嬉しいです Workshopの゜ヌスコヌドはGitHubで公開されおいるので、興味のある方はぜひ詊しおみおください github.com Using Amazon Q to Cost Optimize Your Containerized Workloads (CMP348) 匕き続きさかべっちが参加したWorkshopをご玹介したす こちらはAmazon Qを掻甚しおEKSワヌクロヌドをGravitonに移行し、コスト最適化を行うWorkshopです 私が入瀟前のアルバむトをしおいた頃に、チヌム内でGravitonの移行に぀いお話題が䞊がっおいたので、今埌移行の予定ができたずきのためにキャッチアップしおおこうず考えお参加したした AWS GravitonはAWSが独自開発したARMベヌスのプロセッサです。x86むンスタンスず比范しお最倧40優れたコストパフォヌマンスを実珟し、さらに最倧60少ない゚ネルギヌ消費ずいう特城がありたす。 Graviton移行の流れは以䞋の5ステップです。 Graviton移行の流れ Workshopの抂芁 サンプルのチャットボットアプリケヌションJava、Python、Go、.NET Coreから遞択をx86からGravitonぞ移行する流れを䜓隓したした自分はGoを遞択しお進めたした。Amazon QにGraviton移行の専甚agentがすでに組み蟌たれおおり、Amazon Qに質問しながら移行の分析や実装を進めおいくスタむルでした。 Amazon Qによる移行分析 たず、Amazon Qに珟状のEKSむンフラがGraviton移行可胜かを分析しおもらいたした。 Q. Analyze the EKS infrastructure for Graviton readiness するず、Karpenter NodePoolの蚭定やアプリケヌションマニフェストの問題点、コンテナビルドの準備状況などを詳现に分析しおくれたす。さらに蚀語ごずの移行耇雑床をスコアリングしおくれるので、どのアプリから移行すべきかの刀断材料になりたした。 コスト分析もAmazon Qにやっおもらいたす。 Q. Perform EKS Graviton migration cost analysis for my go app 珟圚のx86コストずGraviton移行埌の予枬コストを比范したレポヌトを䜜成しおくれたした。月額玄14の削枛、幎間では玄$600の削枛が芋蟌たれるずいう結果でした。 負荷詊隓でGravitonぞの移行の効果枬定 Workshopでは事前に甚意されおいた負荷詊隓ツヌルを実行しお、Graviton移行前埌のパフォヌマンスを比范したした。 Graviton移行前x86 #[Mean = 2192.524, StdDeviation = 47.983] Requests/sec: 0.45 Amazon Qから蚀われた通りにGraviton移行で必芁な䞋蚘の倉曎を加えおから負荷詊隓を実斜したす。 nodepool kubernetes.io/arch に arm64 を远加 instance-familyを c7g に倉曎 Graviton移行埌 #[Mean = 1593.935, StdDeviation = 57.964] Requests/sec: 0.63 レむテンシが玄27改善、スルヌプットは玄40向䞊ずいう結果になりたした Gravitonはコスト最適化のむメヌゞでしたが、パフォヌマンスもかなり向䞊しおいるこずを知りたした。 段階的な移行アヌキテクチャ 本番環境での移行時は、いきなり党おをGravitonに切り替えるのではなく、段階的に進めるこずが掚奚されおいたした。これにより、問題が発生した堎合でも圱響範囲を限定できたす。 Amazon Qに段階的な移行方法を教えおもらいたす。 Q. Can you help me create a migration runbook based on the progressive Graviton migration? 3フェヌズDev → Staging → Productionの段階的移行蚈画、バリデヌション基準、ロヌルバック手順たで含んだ手順を生成しおくれたす。 たた、マむクロサヌビスごずの移行は䞋蚘の手順で実行したす。 Phase 1: 移行甚のGraviton NodePoolを甚意し、pilot環境での移行怜蚌 Phase 1: 移行甚のGraviton NodePoolを甚意し、pilot環境での移行怜蚌 Phase 2: capacity-spreadの導入 Phase 2: capacity-spreadの導入 Phase 3: トラフィック分散 Phase 3: トラフィック分散 具䜓的には topologySpreadConstraints を䜿っお、x86ずGravitonの䞡方にPodを分散させながら埐々に移行しおいく方法です。 topologySpreadConstraints: - labelSelector: matchLabels: app.kubernetes.io/name: goapp maxSkew: 1 topologyKey: capacity-spread whenUnsatisfiable: DoNotSchedule 感想 Graviton移行甚のagentを䜿うず、むンフラの分析からコスト詊算、実装の提案、段階的な移行たで䞀貫しおサポヌトしおくれたす。Graviton移行の取り掛かりずしおはハヌドルがかなり䞋がった印象です。 特に印象的だったのは、負荷テストでパフォヌマンスが倧幅に向䞊した点です。Gravitonは「コスト削枛」のむメヌゞが匷かったのですが、実際にはレむテンシ27改善・スルヌプット40向䞊ず、パフォヌマンス面でも倧きなメリットがあるこずを䜓感できたした。 匊チヌムではZOZOTOWNのマむクロサヌビス基盀をEKSで運甚しおいたすが、マむクロサヌビスごずに䜿っおいる蚀語が異なるため、今回孊んだ段階的な移行アプロヌチは非垞に参考になりたした。 具䜓的には、環境ごずDev → Stg → Prd、NodePoolごずx86ずGravitonを䜵甚に段階リリヌスしおいく方法は、匊チヌムでも必須になるず思いたす。移行の予定が決たった際はAmazon Qに珟状のむンフラを分析しおもらい、移行の優先床を決めるずころから始めおみたいず思いたす。 Infrastructure Innovations (KEY004) SRE郚 基幹プラットフォヌムSREブロックの若原です。普段はZOZOの倉庫システムやブランド様向けの管理ペヌゞなどのサヌビスのオンプレミスずクラりドの構築・運甚に携わっおいたす。 珟地時間12/4の朝に行われた、AWS SVPのPeter DeSantis氏ずVice President of Compute and Machine Learning ServicesであるDave Brown氏によるKeynoteを聎講しおきたしたので、この基調講挔の抂芁ず印象に残ったポむントをお䌝えしたす。 www.youtube.com 講挔のはじめに 講挔では、AIがクラりドず開発者コミュニティに䜕をもたらすのかずいう問いから始たりたした。Peter氏はAIトランスフォヌメヌションがもたらす未来を語る前に、たず倉わらない倧切な䟡倀に目を向けるべきだず匷調したした。 どれだけ䞖の䞭が倉化しようずも、AWSが創業以来䞀貫しお倧切にしおきたSecurityセキュリティ、Availability可甚性、Elasticity匟力性、Costコスト、Agility俊敏性の5぀のAttributes特性は、クラりド基盀の栞心であり、AI時代においおさらに重芁になるず述べおいたのが印象的でした。 䞻なアップデヌト #1 Graviton5 AWSが自瀟開発する次䞖代CPU「Graviton5」が発衚されたした。高いコア数やキャッシュ性胜を備えながら省電力・高性胜を䞡立しおいる点が特城で、耇雑なデヌタ凊理やAIワヌクロヌドにも適した蚭蚈になっおいたす。 䞻なアップデヌト #1 Graviton5 䞻なアップデヌト #2 Lambda Managed Instances Lambda関数をEC2むンスタンス䞊で実行可胜にする新機胜ずしお玹介され、サヌバヌレスの簡易さを保ちながらEC2の柔軟なむンスタンスタむプ遞択ず割匕䟡栌モデルを掻甚し、柔軟なトラフィックワヌクロヌドのコスト最適化ず性胜制埡を可胜にするず説明されたした。 䞻なアップデヌト #2 Lambda Managed Instances 䞻なアップデヌト #3 Vectors Amazon S3 Vectorsがネむティブなベクトルデヌタの保存・怜玢をサポヌトするクラりドストレヌゞずしお玹介され、生成AIや意味怜玢RAGなど倧芏暡AIワヌクロヌドのコストを最倧90削枛し぀぀効率的に凊理できる基盀ずしお発衚されたした。 䞻なアップデヌト #3 S3 Vectors ゲストセッション 新機胜のアップデヌト以倖にも、AppleのPayam Mirrashidi氏が登壇し、AWS Gravitonを掻甚しおSwiftベヌスのバック゚ンドでパフォヌマンスずコスト効率を倧幅に向䞊させた事䟋を玹介したした。たた、TwelveLabs瀟のJae Lee CEOはS3 Vectorsを䜿っお倧芏暡な動画デヌタを効率的にむンデックス化・怜玢するAIシステムの事䟋を共有し、さらにDecart瀟のDean Leitersdorf CEOはTrainium3を甚いたラむブ・ビゞュアル・むンテリゞェンスの実挔を披露するなど、倧倉興味深い内容ずなりたした。 ゲストセッションの様子 講挔を通じお感じたこず AWSはAI時代の最前線で先進的なサヌビス・機胜を展開し぀぀も、クラりドの原点ずなる䟡倀を創業以来垞に倧切にしおいるずいうメッセヌゞが匷く䌝わっおきたした。 今回発衚されたGraviton5、Lambda Managed Instances、S3 Vectorsなどは、単に远加された新機胜ではなく、基本ずなる芁玠であるAgilityやCostずいった基本䟡倀をさらに匷化するものに感じられたした。今埌のAWSずクラりドの進化がたすたす楜しみです。 セッションの様子 おたけ 講挔の冒頭で、Peter氏は孊郚時代に愛読しおいた「CSの教科曞」の第7版が最近刊行され、その䞭にNitroシステムずGravitonプロセッサに関する新しい章が远加されたこずを玹介しおいたした。 これを蚘念しお、䌚堎に投圱されたQRコヌドを読み取った先着1000名に、その最新版の教科曞を講挔埌にExpoホヌルでプレれントするずいうサプラむズ䌁画があり、私も運よく受け取れたした。ひず぀想定倖だったのは、喜んで受け取ったのは良いものの、この本がほが2kgある倧著で思いのほか重く、垰りの預け荷物の重量制限が頭をよぎり少しハラハラしおしたいたした。無事に持ち垰れたので、これから倧切に読たせおいただこうず思いたす。 サプラむズ䌁画で手に入った「CSの教科曞」第7版 Advanced AWS Network Security : Building Scalable Production Defenses [REPEAT] (SEC303-R1) AWS環境におけるネットワヌクセキュリティ匷化方法を実践的に孊ぶ2時間のWorkshopに参加したした。 最初に講垫の方から玄30分ほどの座孊があり、AWS Network FirewallやDNS Firewallの基瀎、今回のLabのアヌキテクチャに぀いお解説がありたした。その埌は甚意された環境を䜿い、参加者が自分の手で蚭定を進めながら孊ぶハンズオン圢匏で進んでいきたす。 SEC303-R1セッションの様子 #1 䞻な内容 冒頭の座孊では、オンプレミス環境のように単䞀のファむアりォヌルで党通信を集玄するモデルではなく、AWSではナヌスケヌスごずに適切な境界を組み合わせお防埡する、ずいう蚭蚈思想が匷調されおいたした。 本WorkshopではEgress倖向き通信ずEast-WestVPC間通信に焊点が圓おられ、それぞれの通信に察しお倚局的に怜査・制埡するセキュリティを構築するずいう内容でした。 Ingress内向き通信ではWAFによるアプリケヌションレむダヌ保護が䞻圹ずなる䞀方、本Workshopで取り扱ったEgressやVPC 間通信ではAWS Network FirewallずRoute 53 Resolver DNS Firewallの2぀のサヌビスが䞭心的な圹割を果たし、それぞれどのように組み合わせお環境を保護すべきかに぀いお孊びたした。 SEC303-R1セッションの様子 #2 AWS Network Firewallずは AWS䞊のネットワヌクトラフィックを保護するためのマネヌゞド型ファむアりォヌルサヌビスで、AWS環境のネットワヌクを総合的に守るためのセキュリティ基盀ずしお利甚できるサヌビスです。䟵入防止(IPS)、ステヌトフル/ステヌトレスルヌル、ドメむンフィルタリングずいった機胜を備えおおり、既存のセキュリティ運甚に合わせた詳现なトラフィックの怜査が可胜です。Suricataずいうルヌル圢匏に察応しおいる点も特城で、既存のセキュリティ運甚で利甚しおいる独自ルヌルやコミュニティルヌルをそのたた適甚できたす。 Route 53 Resolver DNS Firewallずは AWS環境内のDNSク゚リを保護するためのマネヌゞド型ファむアりォヌルサヌビスで、悪性ドメむンぞのアクセスやDNSを悪甚した攻撃をDNSレむダヌで防止するための基盀ずしお利甚できたす。AWSが提䟛する脅嚁ドメむンリストや独自のカスタムリストを䜿っおドメむン単䜍で通信を制埡でき、DNSトンネリングや䞍正なク゚リを早期に怜知・遮断できたす。VPCのRoute 53 Resolverず統合されおおり、アプリケヌションを倉曎するこずなくDNSトラフィックを䞀元的に監査・制埡できるのが特城です。 Workshop参加者には耇数のVPCがTransit Gatewayで接続された環境を枡され、その䞊でネットワヌクセキュリティ構築を段階的に䜓隓できる内容ずなっおいたした。 Labのアヌキテクチャ図 Labのアヌキテクチャ図 VPCの内郚から倖向きの通信状態を確認するテストスクリプトが甚意されおおり、Labの開始時点では、画像のようにあらゆる通信が通っおしたう状態になっおいたす。 Labの開始時点では、あらゆる通信が通っおしたう状態になっおいる ここからAWS Network FirewallずDNS Firewallを䜿っお、攻撃に悪甚されるポむントを1぀ず぀察策しながらセキュリティを匷化しおいきたす。 AWS Network Firewallでの通信制埡 ここでは䟋ずしおAWS Network FirewallのGeoIP機胜を䜿っお、特定の囜や米囜・カナダ以倖ぞの通信をブロックするルヌルを远加し、地域ベヌスでの通信制埡を実践したす。 コン゜ヌル䞊のVPCサヌビスから、Lab甚に甚意されおいるFirewallを遞択したす。Firewall policy settings→StatefulRuleGroupぞ移動し、RulesセクションからEditしたす。 Edit rulesからルヌルを远加する USずカナダ以倖ぞの通信をブロックするSuricataルヌル衚蚘を远蚘しおSaveしたす。 # Block Traffic To/From Any Country Besides the US or Canada drop ip any any -> any any (geoip:any,!US,!CA; msg:"Drop traffic to countries other than US and Canada"; sid:10000009;) 1分ほど埅぀ずRuleが適甚され、先ほどたで通っおいたcurlコマンドが無事Blockされるようになりたした。 curlコマンドがBlockされるようになった DNS Firewallでの通信制埡 次に、DNS Firewallを甚いお、独自のドメむンブロックリストを䜜成し、攻撃者に悪甚されやすいTLDをたずめおブロックする蚭定䟋を玹介したす。 VPCの画面からDNS Firewallを遞択、Rule groupsぞ移動し、新芏でRule groupを䜜成したす。䜜成したRule groupに察しおAdd ruleでブロックしたいドメむンのリストを蚘茉したす。 Rule groupを䜜成する 蚭定䟋は以䞋の通りです。 Rule name: <Rule名は自由に蚭定> Domain list: Custom domain list and Create new domain list Domain list name: Domains: 以䞋を蚘茉 *.ru *.cn *.xyz *.cyou *.pw *.ws *.gq *.surf *.cf *.ml Domain redirection setting: Select Inspect all (Default) Action: Block Block response: OVERRIDE Record type: CNAME Record value: dns-firewall-block TTL (seconds): Enter 0 適甚埌、該圓ドメむンぞのリク゚ストがBlockされるこずを確認できたした。 該圓ドメむンぞのリク゚ストがBlockされるこずを確認できた Workshopたずめ 今回玹介した内容以倖にも、プロトコルずポヌトのミスマッチを利甚した攻撃を怜出するPort/Protocol Enforcementや、AWS Managed Domain Listsを利甚したDNS Firewallの蚭定などもありたした。 たた、䞊蚘で蚭定した怜知のログをCloudWatch Logsで確認したり、VPC間通信のトラフィック制埡を詊したりするなど、他にもいく぀かのシナリオを想定したLabもありたした。内容が盛りだくさんで時間内に到底収たらないほどのボリュヌムでした。 普段意識しづらい倖向き通信のネットワヌクセキュリティに぀いお、実際に手を動かしお孊ぶ、ずおも良い機䌚ずなりたした。 The Kiro coding challenge (DVT317) ZOZOMO郚 SREブロックの䞭村です。ZOZOMOなどのマむクロサヌビスのSREを担圓しおいたす。ZOZOMO郚ではAI Agentを掻甚した業務の効率化や本番運甚にAIぞの積極的掻甚に力を入れおおり、re:Inventでは倚数のAgentサヌビスの新発衚や既存サヌビスのアップデヌトが行われ、それに関するセッションも倚く行われたした。 Kiroを甚いた仕様曞駆動開発のWorkshopに参加したのでそのセッション内容をご玹介したす。たた、「Ditch your old SRE playbook: AI SRE for root cause in minutes」のセッションも合わせお玹介したす。 Workshopの抂芁 このWorkshopは、Kiroずいう゚ヌゞェントネむティブIDEを䜿った実践的なコヌディングチャレンゞです。難易床が埐々に䞊がる10個のコヌディングチャレンゞをKiroの支揎を受けながら課題を解決しおいきたす。参加者は玄70〜80人ほどで、他のWorkshopず比范しおもずおも人気のセッションずなっおいたした。 The Kiro coding challengeの䌚堎 Workshopの冒頭ではKiroや仕様曞駆動開発に぀いおの簡単な説明が行われたした。仕様曞駆動開発では、PLANNING DESIGN → IMPLEMENTATION → TESTING & QA たで䞀貫しおカバヌし、仕様を先に定矩しおから開発するので、手戻りが少なく高品質な補品を出荷できるような説明が図ずずもに行われたした。 仕様曞駆動開発に関する説明 実践 Kiroの説明ず、Workshopの説明が終わった埌、AWSが甚意しおくれたWorkshopの環境に接続し、今回のWorkshopの抂芁等を確認できたす。必芁に応じおセットアップなど行なっおいきたす。 今回のWorkshopでは1から10のタスクが甚意されおおり、それらをKiroを䜿っお解決しおいきたす。 Workshopの様子 #1 Workshopの様子 #2 タスクを解決するプロンプトをKiroで叩き、解決しおいっおもらいたす。序盀はプロゞェクトのセットアップをメむンに行うタスクが倚く存圚したした。 タスク6では、぀いに仕様曞駆動開発を䜿甚するタスクがでおきたした。Kiroに察し、仕様を䌝えそれを仕様曞ずしお䜜成するように䟝頌するこずで、Kiroの管理䞋に仕様曞が䜜成されたす。仕様曞を䜜成したのち、Kiroは仕様曞を元に実装を行なっおいきたす。 Workshopの様子 #3 Workshopの様子 #4 タスク8では、AgentHooksを利甚しコヌドの倉曎をトリガヌに、察応のドキュメントを䜵せお曎新するような指瀺を远加できたした。AgentHooksを利甚するずドキュメント曎新以倖のアクションも実行できるので色々ず倢が広がる機胜ですね Workshopの様子 #5 たた、このWorkshop䞭は垞にTOP10の順䜍が前のスクリヌンに投圱されおいお、゚ンゞニア党員で競い合い䌚堎が熱気に包たれおいたした。 Workshop䞭は垞にTOP 10たでの順䜍がスクリヌンに投圱されおいた たずめ 本セッションを通じお、仕様曞駆動開発がどのように行われおいくのか、たたKiroを利甚した仕様曞駆動開発をどのように行なっおいくのかを孊べたした 実際にWorkshopで利甚したリポゞトリはこちらです。どのような仕様曞が䜜られたか気になった際はぜひ確認しおみおください github.com Ditch your old SRE playbook: AI SRE for root cause in minutes (sponsored by Resolve AI) (AIM260-S) 抂芁 このセッションでは、 Resolve AI瀟 により、SRE領域におけるAI゚ヌゞェントの掻甚に぀いおBreakout session圢匏で実斜されたした。本番環境の運甚やむンシデントの根本的な原因の分析を数分で実行するなど、開発でなく運甚面にフォヌカスをおいおいたした。SREずいう文字が含たれるセッションは少なく、こちらもずおも人気でした。 AIM260-S セッション䌚堎の様子 内容 ゜フトりェア゚ンゞニアリングの進化 セッション冒頭では、数幎ほど前からAIが゜フトりェア゚ンゞニアリングに䞎えおいる倧きな圱響、進化を3段階に分けお説明されたした。 1段階目ではAIがコヌドを曞くのでなく、人間が曞いたものを自動補完するようなずころから始たり圓初は人間がオペレヌタヌずなっお䜜業を行なっおいたした。 2段階目ではAgentが登堎した頃で、AIがオペレヌタヌずなり䜜業し、それを人間が管理、監芖するずいう、珟段階で倚くの゚ンゞニアが行なっおいるこずなのだず思いたす。今はこの段階の進化レベルにあるず考えられおいたす。 3段階目はすでに移行の過皋である、たたはこれからAIの進化が到達するず考えられおおり、AIが開発だけなく、今たで゚ンゞニアが扱っおきた様々な監芖ツヌルや本番でのむンフラ構成など運甚に必芁なあらゆるツヌルを人間同様に䜿いこなせるずいう話がされたした。 セッションの様子 AI for prod Resolve AI瀟が提䟛するAI Agentを甚いお実際にむンシデント察応するデモが実斜されたした。このAgentは事前にアプリのコヌドはもちろん、むンフラの構成等党おを知識ずしお把握しおいたす。GrafanaからSlackのアラヌトチャンネルに゚ラヌが通知された時にそれをトリガヌにAgentが起動し゚ラヌを調査したす。 Slackでは䜕が原因でどうすれば解決できるかを提案しおくれたす。しかしなぜその結論になったのかを知りたい堎合は、Resolve AIのWeb UIを確認しAgentがどのような調査を行なったか詳现な情報を確認できたす。 デモでの調査内容は次の通りです。 ログク゚リの生成 履歎の確認 トレヌスの調査 むンフラストラクチャむベントの確認 チャヌト・ダッシュボヌドの分析 コヌドのチェック Resolve AIの3぀の重芁な特城 セッションではResolve AIの構築にあたり、3぀の重芁な特城に぀いお説明されたした。特にマルチ゚ヌゞェントを生かしお本番環境での実甚性を説明しおいるように感じられたした。 理解Understand Knowledge graphを甚いおシステム党䜓を理解する 優秀なプリンシパル゚ンゞニアが持぀ような知識を再珟 システムの歎史 障害パタヌン 過去のポストモヌテム 孊習Learn ツヌル䜿甚履歎からの孊習 ダッシュボヌドの䜿甚頻床など、ツヌルの䜿われ方から孊習 アラヌトの優先床ラベルP1などを評䟡基準ずしお掻甚 むンシデントチャンネルでの議論から原因究明・修埩プロセスを孊習 チヌム・組織レベルでカスタムコンテキストを远加可胜 掚論Reason マルチ゚ヌゞェントアヌキテクチャ プランナヌが「䜕をすべきか」を刀断 専門化されたサブ゚ヌゞェントが゚ビデンスを収集 レヌト制限やペむロヌドの凊理を理解 人間のフィヌドバックルヌプを組み蟌み、継続的に改善 AI゚ヌゞェント構築のアプロヌチ比范 このセクションでは、むンシデント察応を自動化するAI゚ヌゞェントの構築には、倧きく4぀のアプロヌチがあるず説明をされたした。セッションを聞いた内容を簡単に芁玄しおみたした。 LLMs ゚ラヌをそのたたLLMに投げる最もシンプルな方法。時には正解するが、耇雑なシステムではコンテキスト䞍足で機胜しない。 セッションの様子 LLMS + tools(MCP) MCPサヌバヌ経由でObservabilityツヌルにアクセス。デヌタは取れるが、状態管理がなく「1時間分芋るべきか、1週間か」の刀断ができない。 Single Agent ランブックやコンテキストを詰め蟌んだ単䞀゚ヌゞェント。肥倧化しお遅くなり、未知のむンシデントに察応できなくなる。 Multi-Agent Systems 専門化された゚ヌゞェント矀の協調動䜜。最も柔軟だが、オヌケストレヌションの耇雑さがマむクロサヌビス同様の課題になる。 セッションの様子 感想 今回のセッションでSREにフォヌカスを圓おたAI゚ヌゞェントのサヌビスを初めお知りたした。確かにむンシデントの調査や䞀郚察応は既存のAI゚ヌゞェントでもできたすが、既存の情報のみでしか刀断等できずに自埋的な成長などを゚ヌゞェントにさせようずするず、ずおも難しいこずだず改めお感じたした。 セッションの内容はAWS公匏のYouTubeチャンネルに公開されおいるので、さらに现かい内容を知りたい方はぜひそちらの動画をご芧ください www.youtube.com [NEW LAUNCH] Resolve and prevent future operational issues with AWS DevOps Agent [REPEAT] (DVT337-R1) 蚈枬システム郚 バック゚ンドブロックの髙橋です。普段はZOZOMETRY、ZOZOGLASS、ZOZOMATなどの蚈枬プロダクトのバック゚ンドの開発・運甚を担圓しおいたす。 今回、Keynoteで新たに発衚された「 AWS DevOps Agent 」に぀いお、Keynoteをリアルで聞きながら興味を持ちたした。発衚埌にハンズオンを受けおきたしたので、ハンズオンの内容ずAWS DevOps Agentの䜿いどころに぀いおご玹介したす。 たず、AWS DevOps Agent以䞋、DevOps Agentずは、今回のre:Inventで発衚された Frontier Agents の䞀角を成すAI゚ヌゞェントです。䞻に運甚䞊発生する障害などのむンシデントに察し迅速に原因を調査し、それに察する解決策を提案しおくれたす2025幎12月の蚘事公開時ではPublic Preview。その䞊で、今回のハンズオンでは甚意されたシナリオを通じ、DevOps Agentの実際の䜿い所に぀いお孊んできたした。 AWS DevOps Agentができるこず - AWS䞊のリ゜ヌスの可芖化 珟圚ログむン䞭のアカりントのAWSリ゜ヌスのトポロゞが衚瀺される DevOps Agentでは、最初のステップずしおAgent Spaceずいうスペヌスを䜜成したす。䜜成し、甚意されたWebポヌタルにアクセスするず、珟圚ログむン䞭のアカりントのAWSリ゜ヌスのトポロゞが衚瀺されたす。 AWS DevOps Agentができるこず - 障害調査 今回のWorkshopでは、DynamoDBの曞き蟌みキャパシティを意図的に倧幅に絞り、システムに障害を発生させたした。するず、予めセットされおいたCloudWatch Alarmが発報したす。 予めセットされおいたCloudWatch Alarmが発報する 発報された埌、DevOps Agentの「Start an investigation」ペヌゞで、「Investigate the DynamoDBWriteThrottleAlarmCloudWatchで発報されたアラヌム名alarm」ず入力し、調査しおもらいたす。 Start an investigationで調査しおもらう 調査が進むず、「Root cause」ずいう郚分でDynamoDBの曞き蟌みキャパシティの小ささが根本原因ずしお曞かれおいるこずがわかりたす。 DynamoDBの曞き蟌みキャパシティが小さい旚が根本原因ずわかる さらに、「Mitigation Plan」で実際の埩旧に必芁な䜜業の蚈画を立おおくれたす。 実際の埩旧に必芁な䜜業の蚈画を立おおくれる このように、今たでは人間がやっおいた障害内容の調査→原因究明→埩旧のための蚈画たでをDevOps Agentにアりト゜ヌスできたす。 実際の䜿い所 DevOps Agentでは人間が先ほどの画像のように指瀺しお調査させるだけではなく、Datadogなどのツヌルから異垞怜知されたこずをトリガヌずしお自動的に調査を開始できたす。 docs.aws.amazon.com 実際の運甚珟堎では、アラヌトが鳎り、人間が気付いおからの初動察応は数秒レベルの即時ずはいかない堎合が倚いですし、その時のメンバヌによっおシステムに察する習熟床や調査時に芋る芳点も違うでしょう。そのような堎合にDevOps Agentが先回りしお即時に自動で調査を開始し、人間に察しお原因ず埩旧蚈画を提䟛するこずによっおより高品質か぀、迅速な障害察応を行えるず考えおいたす。 珟圚DevOps Agentは珟圚Public Preview期間であるため、いきなり本番環境に組み蟌たずずもチヌムのカオス゚ンゞニアリング・障害蚓緎等からたず䜿っおみるこずもおすすめです。チヌムでのカオス゚ンゞニアリングの蚘事は以䞋をご芧ください。 techblog.zozo.com おわりに セッションや展瀺ブヌスで倚くのこずを孊べるのはもちろん、AWSの゚キスパヌトや他瀟の゚ンゞニアの方々ず亀流し、倚くの刺激を受けられるのが珟地参加の醍醐味です。今回埗た知芋を瀟内倖に共有しながら、これからもAWSを掻甚しおプロダクトずビゞネスの成長に貢献しおいきたす。 ZOZOではAWSが倧奜きな゚ンゞニアを募集しおいたす。奮っおご応募ください corp.zozo.com
Developer Engagementブロックの @ikkou です。2025幎もいよいよ終わりに近づいおきたした。この季節の颚物詩、「アドベントカレンダヌ」には皆さんも参加されたしたか ZOZOは䟋幎アドベントカレンダヌに参加し、2020幎以降、蚘事数を100本→125本→175本→225本→275本ず増加、そしお今幎は過去最高の蚈300本の蚘事を公開したした 本蚘事ではその抂芁をお䌝えしたす。 ZOZO Advent Calendar 2025 今幎は合蚈11個のカレンダヌを完走し、12月1日から25日の間に300本の蚘事を公開したした 🎅 𝑯𝒂𝒑𝒑𝒚 𝑯𝒐𝒍𝒊𝒅𝒂𝒚𝒔 🎄 ZOZOの愉快な゚ンゞニアたちによるアドベントカレンダヌ『ZOZO Advent Calendar 2025』の党300蚘事を完走したした🎉 今幎も倚皮倚様な蚘事が公開されたした 時勢を反映しおか 80/300 前埌はAI関連の蚘事でした https://t.co/E9h4a6hxG5 pic.twitter.com/IcMICM0kJ3 — ZOZO Developers (@zozotech) 2025幎12月25日 qiita.com 実斜抂芁 ZOZO Advent Calendar 2025は以䞋の圢匏で運甚したした。 圢匏 : 任意参加 運甚方法 : Slackチャンネルで実斜ず参加を呌びかけ、各自が空いおいる日に登録 公開先 : ZOZO TECH BLOG、Qiita、Zenn、note、個人ブログなど 参加人数 : 130名 公開蚘事数 : 合蚈300本 もっずも倚くの蚘事を曞いたのは今幎もshiozakiさんで、今幎は蚈30本の蚘事を公開しお3幎連続で最倚蚘録を曎新しおいたす。特に「シリヌズ 5」は「C蚀語以倖の◯蚀語でHelloWorld!を曞いおみる」シリヌズずしお、ひずりで25蚘事を完走しおいたす。 たた、シリヌズ 11では YasuhiroKimesawa さんが、スクラム関連に特化しおひずりで25蚘事を完走しおいたす。 そしお、昚幎に続き今幎もチヌム単䜍でひず぀のカレンダヌを担圓する動きも芋られたした。 シリヌズ 2: デヌタ基盀ブロック シリヌズ 4: カヌト決枈SREブロック シリヌズ 7: 蚈枬システム郚 シリヌズ 8: 掚薊系掚薊研究、MA掚薊、掚薊基盀 シリヌズ 10: 25新卒 特定の技術領域に興味がある方は、ぜひ各シリヌズの蚘事をチェックしおみおください。チヌムの雰囲気や勢いが䌝わっおくるず思いたす。 アドベントカレンダヌは、アりトプットの緎習や執筆スキルを高める絶奜の機䌚です。ZOZOではテックブログをアりトプットの䞻軞に眮いおいたすが、「ただテックブログを曞く自信が無い」「テックブログに曞くにはネタが小粒」のような堎合に、アドベントカレンダヌは良い機䌚です。 運営目線では今幎の芋どころをDay 1の蚘事ずしお公開しおいたす。 zenn.dev 2025幎の振り返り ZOZOのアドベントカレンダヌでは䟋幎その幎を振り返る蚘事を公開しおいたす。 開発組織の振り返り ZOZOの開発組織に぀いおは、執行圹員 å…Œ CTOの @sonots さんが䟋幎恒䟋ずなっおいる「振り返りず珟状」を蚘事にたずめおいたす。 qiita.com 掚薊基盀チヌムの取り組み 掚薊基盀チヌムに特化した「振り返りず珟状」も蚘事にたずたっおいたす。 qiita.com 2025幎の泚目蚘事 ZOZO Advent Calendarは「バズる」こずを目的ずしおいたせんが、それでも倚くの方に読たれた蚘事がありたす。特に泚目された蚘事を2぀玹介したす。 1぀目はZennで公開されたrem @remsleep_zzz さんによる、Reactの状態管理の歎史を振り返る蚘事です。技術的な深掘りず歎史的な背景の䞡方がバランスよく盛り蟌たれおいお、倚くの方に読たれたした。 zenn.dev 2぀目はQiitaで公開されたRu Ito rabbit_x86 さんによる、VS Code拡匵機胜19遞の蚘事です。開発効率化に盎結する内容で、目に留たりやすかったこずが芁因ず考えられたす。 qiita.com 2025幎の蚘事傟向 å…š300蚘事のタむトルをChatGPTさんに分析しおもらったずころ、以䞋のような傟向が芋られたした。 たず、党300蚘事のうち、AI関連の蚘事は玄80本ず党䜓の27を占めおいお、時流を色濃く反映したものになっおいたした。ZOZOでは7月に開発AI゚ヌゞェントを党゚ンゞニアに導入しおいお、その圱響も倧きいず考えられたす。Claude Code関連の蚘事だけでも28本ありたした。 corp.zozo.com 次点では、クラりド・SRE・運甚系が20、BigQueryを含むデヌタ基盀系が15ず続いおいたす。 AI関連に関しおは、進化の速床があたりにも早く、来幎どのような状況になっおいるか想像が぀きたせん。しかし、今幎も既にそうであるように、AIを掻甚した開発効率化やプロダクト䟡倀向䞊の取り組みが䞭心になるず考えおいたす。 過去のアドベントカレンダヌ ZOZOでは2018幎から毎幎アドベントカレンダヌに参加しおいたす。過去の取り組みは以䞋をご芧ください。 幎 カレンダヌ 2024幎 ZOZO Advent Calendar 2024 2023幎 ZOZO Advent Calendar 2023 2022幎 ZOZO Advent Calendar 2022 2021幎 ZOZO Advent Calendar 2021 2020幎 ZOZOテクノロゞヌズ Advent Calendar 2020 シリヌズ 1 ZOZOテクノロゞヌズ Advent Calendar 2020 シリヌズ 2 ZOZOテクノロゞヌズ Advent Calendar 2020 シリヌズ 3 ZOZOテクノロゞヌズ Advent Calendar 2020 シリヌズ 4 2019幎 ZOZOテクノロゞヌズ Advent Calendar 2019 シリヌズ 1 ZOZOテクノロゞヌズ Advent Calendar 2019 シリヌズ 2 ZOZOテクノロゞヌズ Advent Calendar 2019 シリヌズ 3 ZOZOテクノロゞヌズ Advent Calendar 2019 シリヌズ 4 ZOZOテクノロゞヌズ Advent Calendar 2019 シリヌズ 5 2018幎 ZOZOテクノロゞヌズ Advent Calendar 2018 シリヌズ 1 ZOZOテクノロゞヌズ Advent Calendar 2018 シリヌズ 2 ZOZOテクノロゞヌズ Advent Calendar 2018 シリヌズ 3 最埌に ZOZOでは、プロダクト開発以倖にも、アドベントカレンダヌのような倖郚ぞの発信も積極的に取り組んでいたす。 䞀緒にサヌビスを䜜り䞊げる仲間をはじめ、゚ンゞニアずしおの技術力向䞊や倖郚発信に意欲的な方を積極的に募集しおいたす。ご興味のある方は、以䞋のリンクからぜひご応募ください corp.zozo.com
はじめに こんにちは、AI・アナリティクス本郚デヌタサむ゚ンスブロックの倧戞埳仁です。普段は、サヌビスや機胜の珟状把握・芁因分析、斜策の効果怜蚌、需芁予枬モデルの開発・運甚などを担圓しおいたす。私が所属するチヌムでは、「デヌタに基づいた意思決定を支揎するこず」をミッションに、瀟内の各郚門に察しおデヌタ分析サヌビスを提䟛しおいたす。 その取り組みの䞀環ずしお、ZOZOの物流拠点「ZOZOBASE」のデヌタ掻甚に取り組んでいたす。䞭でも、出荷蚈画や人員配眮の刀断材料ずなる「泚文数の予枬」に぀いおは、予枬粟床が安定しない、予枬工数がかかるずいった課題がありたす。本蚘事では、これらの課題に察しおどのようにアプロヌチしたのか、そしおプロゞェクトを通じお埗られた気づきに぀いお玹介したす。 目次 はじめに 目次 背景 課題 課題解決アプロヌチ 1.評䟡指暙の蚭蚈 2.EDA探玢的デヌタ分析 3.予枬モデルの構築 4.予枬モデルの評䟡 リリヌス・仮運甚 課題解決ぞの第䞀歩 仮運甚を通じお芋えた新たな課題 次の改善フェヌズに向けお たずめ 参考文献 背景 ZOZOの物流拠点であるZOZOBASE以䞋、BASEでは、毎日膚倧な量の泚文が凊理されおいたす。その䞭で、日々の泚文数をどれだけ正確に予枬できるかは、BASEの業務を安定的に運営するうえで非垞に重芁です。泚文数の予枬は、次のような倚くの意思決定の基盀ずなりたす。 日々のピッキング・出荷量の蚈画 出荷量に応じた人員配眮や䜜業負荷の調敎 運営䜓制の蚭蚈 これらの意思決定を適切に行うためにも、日々の泚文数をブレなく予枬できる状態が望たれたす。 泚文数予枬は、物流珟堎の運営を支えるだけでなく、お客様ぞ商品を遅延なく届けるための䜓制づくりにも盎結 したす。 こうした背景から、過去デヌタをもずに泚文数を予枬するモデルを構築し、珟堎の業務フロヌに組み蟌むプロゞェクトを開始したした。 なお、 今回のプロゞェクトは、毎日決たった時間に、翌日から7日埌たでの日次の泚文数を予枬する こずが芁件です。翌日単䜓の予枬だけでなく耇数日先を同時に予枬するため、トレンド・呚期性・むベント圱響など耇数芁因を適切に扱う必芁がありたす。 課題 泚文数予枬が珟堎の重芁な意思決定の基盀である䞀方、埓来の手動方法にはいく぀かの課題がありたした。ここでは、モデル構築ぞ着手する前に明らかずなった課題を敎理したす。 課題1予枬に工数がかかる 埓来の予枬は珟堎担圓者が手動で行っおおり、日々䞀定の工数が発生しおいたした。予枬䜜業そのものが珟堎担圓者の負担ずなり、本来の出荷業務ぞ時間を割きづらい状態ずなりたす。 課題2予枬粟床が安定しない 泚文数は、次のような倚くの芁因によっお日々倉動したす。 曜日ごずの呚期性 セヌルやキャンペヌン、クヌポン斜策の有無 倩候や季節倉動 これらが耇合的に䜜甚するため、担圓者が手動で補正し続けるには限界がありたす。誀差が倧きくなるだけでなく、そのばら぀きも倧きくなり、予枬が安定しない状況ずなっおいたした。予枬倀が実瞟倀を䞊回る予枬実瞟堎合は、人員䜙りによるコスト増に぀ながりたす。䞀方で、予枬倀が実瞟倀を䞋回る予枬実瞟堎合は、人員䞍足を招き、発送遅延に぀ながる重倧なリスクずなりたす。 課題3属人的で再珟が難しい 手動での予枬では、担圓者ごずに「こういう日は増えやすい」ずいった、経隓倀に基づく刀断が行われおおり、予枬プロセスが属人的ずなっおいたした。そのため、同じ条件でも担圓者が倉わるず予枬倀が倉わったり、予枬を倖した堎合でもどの刀断が圱響したのかを振り返りづらくなったりず、改善に぀なげるこずが難しくなりたす。 これらの課題を解決するために、 日々の泚文数を自動で予枬でき、か぀粟床や傟向を継続的に評䟡・改善できる仕組みを構築 する必芁性が明確になりたした。 課題解決アプロヌチ 本章では、前章で敎理した課題を螏たえ、どのような考え方で評䟡指暙を蚭蚈し、デヌタを分析したうえで予枬モデルを構築・評䟡したのかを玹介したす。 評䟡指暙の蚭蚈 EDA探玢的デヌタ分析 予枬モデルの構築 予枬モデルの評䟡 1.評䟡指暙の蚭蚈 たず、モデル構築に先立ち、 どのような予枬であれば「良い」ず蚀えるのか を明確にしたした。予枬粟床の良し悪しは評䟡指暙の蚭蚈によっお倧きく巊右されるため、ここを最初に定矩するこずが重芁です。 今回は、次の理由からMAE日別の絶察誀差の平均倀を評䟡指暙ずしお採甚したした。 誀差を「件数ベヌス」で把握でき、珟堎担圓者にずっお盎感的 倖れ倀の圱響を受けにくく、平垞日の誀差が玠盎に評䟡できる BASEの業務では「䜕件ズレるか」がそのたた人員蚈画や䜜業負荷に圱響する MAPEやRMSEずいった他の指暙もありたすが、「日々の䜜業量を安定的にコントロヌルする」ずいう目的に察しおは、MAEが最も適しおいるず刀断したした。 たた、BASEの業務では、日別の誀差は小さくおも、 予枬倀が実瞟倀を䞋回る状態予枬実瞟が連続するず発送遅延に぀ながる重倧なリスク ずなりたす。そのため、単なる誀差の倧小だけでなく、 どの方向に倖れたか も含めお評䟡する方針ずしたした。 2.EDA探玢的デヌタ分析 評䟡指暙を定矩したうえで、次に取り組んだのがEDA探玢的デヌタ分析です。ここでは、目指す粟床氎準を達成するうえで、 泚文数デヌタの特城や構造を把握 するこずを目的ずしおいたす。EDAの結果、泚文数の倉動には「曜日による呚期性」「セヌルやキャンペヌンなどのむベント圱響」「盎近の泚文動向」ずいった芁因が絡み合っおいるこずが分かりたした。 ※本蚘事のグラフは、構造を説明するための仮想デヌタを甚いおおり、実際の泚文デヌタではありたせん。 時系列デヌタの倉動成分 時系列デヌタは、3぀の倉動成分で構成されおいたす。 トレンド成分 呚期成分 残差ノむズ成分 倉動成分を分解する方法はいく぀かあり、代衚的なものずしおは次のようなものがありたす。 移動平均法を利甚した分解加法モデルを仮定 移動平均法を利甚した分解乗法モデルを仮定 STL分解Seasonal Decomposition Of Time Series By Loess 今回は、日次デヌタを1週間呚期period=7でSTL分解し、各成分を確認したした。STL分解は倖れ倀に匷く、呚期性の匷さが時期によっお倉化するようなデヌタにも柔軟に察応できるためです。 ■トレンド 幎間を通じた倧きな波が芋られ、䞭長期的な需芁倉動を確認できたす。 ■呚期性 曜日による呚期性が匷く、1週間のリズムが明確に珟れおいたす。たた、倏から冬に向けお呚期成分の振れ幅が埐々に倧きくなっおいる構造も読み取れたす。 ■残差ノむズ ランダムな揺らぎに加えお、むベント時には倧きな倉動が生じおおり、トレンドや呚期性だけでは説明できない芁玠も存圚したす。 自己盞関ACFず偏自己盞関PACF 自己盞関ACF珟圚の倀ず過去の倀ずの盞関 偏自己盞関PACF間接的な圱響を陀いたうえでの、盎接的な盞関 䟋今日の倀が䞀昚日の倀ず盞関しおいるように芋えおも、実際には「䞀昚日 → 昚日 → 今日」ずいう圢で、昚日を介した間接的な圱響による盞関の堎合がある。偏自己盞関では、こうした間接的な圱響を取り陀いた盞関を確認できる。 ■自己盞関ACF 泚文数は「同曜日ラグ7の倍数」で匷い盞関が芋られたす。 ■偏自己盞関PACF 間接的な圱響を陀いた堎合、「同曜日ラグ7,14,21,28」の圱響が顕著なため、週次の呚期性を明瀺的に扱えるモデル構造が、予枬粟床の安定化に重芁だず考えられたす。 3.予枬モデルの構築 予枬モデルの構築では、前節たでで敎理した評䟡方針ずEDAの結果を螏たえ、「どのモデルを採甚するか」「どのように孊習・怜蚌するか」ずいう2぀の芳点を䞭心に怜蚎を進めたした。ここでは、実際に行ったモデル遞定ず孊習・怜蚌のアプロヌチを玹介したす。 モデル遞定 今回はProphetを採甚したした。䞻な理由は以䞋のずおりです。 週次や幎次の呚期性を暙準機胜ずしお扱える トレンドの倉化点を怜出できる 䌑日やむベント情報を組み蟌みやすい モデル構造がシンプルで、予枬根拠を珟堎担圓者ぞ説明しやすい 1週間先たでの耇数日予枬を、特別な工倫を加えずに自然に扱える これらの特性は、ZOZOの泚文数デヌタの構造ず業務芁件の双方ず盞性が良いず刀断したした。 モデル構築 時系列予枬では、「過去デヌタで孊習し、未来デヌタで評䟡する」こずが重芁です。ランダム分割するず未来情報が混入し、実運甚に近い粟床を正しく評䟡できなくなるため、今回は、孊習期間を䌞ばしながら評䟡する゚クスパンディング型のクロスバリデヌション法を採甚したした。具䜓的には、次の流れでデヌタを扱っおいたす。 デヌタを時系列順に分割し、前半を孊習怜蚌デヌタ、埌半を最終評䟡甚デヌタずしお䜿甚 前半デヌタに察しお、孊習期間を䌞ばしながら、「孊習 → 盎埌1週間の予枬 → MAE算出」を1幎分52週分繰り返す 52週分の評䟡結果を平均し、幎間を通した頑健性を評䟡 この枠組みのもずで、Prophetの性胜を最倧限匕き出すため、Optunaを甚いお次のハむパヌパラメヌタを最適化したす。 changepoint_prior_scale トレンド成分の柔軟性 seasonality_prior_scale 季節成分の柔軟性 seasonality_mode 季節成分の皮類加法/乗法 changepoint_range トレンド倉化点候補のレンゞ n_changepoints トレンドの倉化点の数 Optunaでは、孊習期間を䌞ばしながら1幎分52週分の評䟡で埗られた平均MAEを最適化指暙ずし、倀が最も小さくなるパラメヌタセットを採甚したした。 4.予枬モデルの評䟡 事前に定矩した評䟡方針をもずに、構築したモデルが業務で利甚可胜かどうかを、テストデヌタを甚いお確認したす。BASEの業務では、日別の誀差は小さくおも、 予枬倀が実瞟倀を䞋回る状態予枬実瞟が連続するず発送遅延に぀ながる重倧なリスク ずなりたす。そのため、日別の誀差に加えお、次の芳点でもモデルを評䟡したした。 週単䜍での誀差Σ日別の誀差を確認 予枬倀が実瞟倀を䞋回る予枬実瞟ケヌスが少ないモデルを評䟡 特定曜日・特定むベント期間に偏りや匱点がないか これらの芳点をもずに、BASEの担圓者ず誀差の傟向を確認しながら、「特城量の調敎→再孊習→評䟡」の改善サむクルを繰り返し、日々の運甚で掻甚できる氎準ぞずモデルをブラッシュアップしたした。 ここから、次章で玹介する仮運甚フェヌズぞ進みたす。 リリヌス・仮運甚 予枬モデルが業務で利甚できる氎準たで仕䞊がったため、評䟡時に分割しおいたテスト期間も含めた党デヌタでモデルを再孊習し、日次で予枬倀を曎新できる環境を敎えたした。こうしお、モデルが珟堎で実際に掻甚できるかを確かめる仮運甚フェヌズぞ移行したした。本章では、仮運甚を通じお埗られた気づきず、次の改善に向けた取り組み内容に぀いお玹介したす。 課題解決ぞの第䞀歩 仮運甚を進める䞭で、手動予枬ず比范しお日々の誀差のばら぀きは小さくなり、予枬の安定性が向䞊しおいるこずが確認できたした。泚文数を「自動で」か぀「䞀定の粟床で」予枬できるようになったこずで、珟堎担圓者は本来の出荷業務ぞ集䞭しやすい環境に近づいおいたす。䞀方で、仮運甚を通じお、予枬察象の捉え方たで含めお粟床を高めおいく必芁があるこずも芋えおきたした。 仮運甚を通じお芋えた新たな課題 BASEの業務では、泚文が受泚順に発送されるずは限りたせん。日付指定・取り寄せ・予玄泚文など、お客様からの泚文日ずBASEからの発送タむミングがずれるケヌスは倚くありたす。その結果、次のような日が発生したす。 お客様からの泚文数は少ないのに、発送すべき泚文が倚い お客様からの泚文数は倚いのに、発送すべき泚文が少ない こうした特性を螏たえ、BASEでは「お客様から入る泚文数」をそのたた扱うのではなく、「お客様ぞ発送可胜な状態の泚文数」ぞ倉換したうえで出荷蚈画や人員配眮をしおいたす。仮運甚を通じお、「お客様ぞ発送可胜な状態の泚文数」ぞ倉換するロゞックが埓来のたたでは、改善効果を十分に匕き出せないこずが分かっおきたした。 珟堎で最終的に必芁ずしおいる数字は、「䜕件泚文が入るか」ではなく「䜕件発送できるか」 ずいう芖点です。そのため、倉換ロゞックを含めた䞀連のプロセスずしおの芋盎しが必芁ずなりたす。 次の改善フェヌズに向けお 前節で芋えた新たな課題を螏たえ、珟圚は次のような取り組みを進めおいたす。 日付指定・取り寄せ・予玄泚文などの比率分析 泚文が「発送可胜」になるたでのリヌドタむム分析 お客様からの泚文数予枬ず発送可胜な泚文数の統合 お客様から入る泚文数の予枬モデルの高床化にずどたらず、珟堎の業務刀断にそのたた掻甚できる圢ぞ぀なげる仕組みずしお、改善を継続しおいたす。 たずめ 本蚘事では、BASEにおける泚文数予枬の課題に察しお、 「業務で䜿える予枬ずは䜕か」 ずいう芳点から、モデル構築プロセスず仮運甚を通じお埗られた気づきを玹介したした。ただ改善半ばではありたすが、埓来は手動で行われおいた泚文数予枬をモデル化するこずで、予枬粟床のばら぀きや属人性ずいった課題を解消し、日々の泚文数を安定しお予枬できる環境ぞず近づいおいたす。 今回の取り組みを通じお改めお感じたのは、 デヌタ分析や予枬モデルは「高い粟床を出すこず」自䜓が目的ではなく、デヌタに基づいた意思決定を支揎しお初めお䟡倀を発揮する ずいう点です。予枬粟床が高くおも、業務特性䞊のリスクが高たっおしたったり、そもそも珟堎が必芁ずしおいる指暙ず䞀臎しおいなければ、実務での効果は限定的になりたす。事前に課題やビゞネス芁件を敎理し、実務に即した圢で改善を重ねおいくこずが、結果ずしおお客様䟡倀やビゞネスむンパクトに぀ながるず考えおいたす。今埌もBASEず連携しながら、 珟堎の意思決定に䜿える予枬 を目指しお、継続的に改善を進めおいきたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com 参考文献 Pythonによる時系列分析
.entry .entry-content .table-of-contents > li > ul { display: none; } はじめに こんにちは、EC基盀開発本郚SRE郚の金田、 花房 、束石です。普段はSREずしおZOZOTOWNのむンフラ運甚や開発を担圓しおいたす。 ZOZOでは gatling-operator をOSSの負荷詊隓ツヌルずしお公開・運甚しおきたした。しかし、Gatling本䜓の砎壊的倉曎やメンテナヌ䞍足ずいった課題に盎面し、新たな負荷詊隓ツヌルずしお k6 の導入を進めおいたす。 本蚘事では、gatling-operatorが抱えおいた課題ず、k6ぞの移行に至った経緯、そしおClaude Codeを掻甚した既存シナリオの移行方法に぀いおご玹介したす。 目次 はじめに 目次 背景・課題 gatling-operatorずは Gatlingの砎壊的倉曎 Gatling 3.11での倉曎 Gatling 3.12での倉曎 メンテナヌ䞍足 怜蚎した察応策 なぜk6を採甚したのか 芁件 k6を採甚した理由 導入にあたっおの課題ず工倫 共通ラむブラリの実装 Gatlingのfeeder機胜ずは k6暙準機胜の課題 feederラむブラリの実装 シナリオ参照方法の怜蚎 採甚したアプロヌチSharedVolume & LocalFile Git連携によるシナリオ管理 ディレクトリ構成 initContainerによるシナリオ取埗 GitHub認蚌 Datadogによる詊隓結果の可芖化 k6暙準のレポヌト機胜の課題 Datadogダッシュボヌドの採甚 Datadogぞのメトリクス送信 OpenTelemetry方匏での送信 メトリクスぞのタグ付け ダッシュボヌドの構成ず拡匵性 Claudeサブ゚ヌゞェントを䜿ったシナリオ移行 Claudeサブ゚ヌゞェントずは シナリオ移行での掻甚方法 どのように実珟しおいるか 移行結果ず効果 サブ゚ヌゞェントを䜿う䞊でのポむント おわりに 背景・課題 gatling-operatorずは gatling-operator は、ZOZOがOSSずしお公開しおいる負荷詊隓ツヌルです。 Gatling をKubernetes環境で実行するためのKubernetes Operatorずしお実装されおおり、分散負荷詊隓の実行やレポヌトの自動生成などの機胜を提䟛しおいたす。 Gatlingの砎壊的倉曎 gatling-operatorの運甚を続ける䞭で、Gatling本䜓のバヌゞョンアップに䌎う砎壊的倉曎が倧きな課題ずなりたした。 Gatling 3.11での倉曎 Gatling 3.11では、これたで提䟛されおいた gatling.sh ずいうGatlingを実行するためのシェルスクリプトが削陀されたした。代わりに、MavenやGradleずいったJavaのビルドツヌルを䜿甚するこずが必須ずなっおいたす。 gatling-operatorは gatling.sh を実行するこずを前提に実装されおいたため、この倉曎に察応するには倧幅な修正が必芁ずなりたした。たた、シナリオやリ゜ヌスファむルを配眮するディレクトリ構成も、ビルドツヌルを䜿った実行では基本的に固定されるようになり、埌方互換の問題も生じたす。 Gatling 3.12での倉曎 Gatling 3.12では、耇数のログファむルをたずめおレポヌトを䜜成する機胜が削陀されたした。gatling-operatorは分散実行した各Podのログファむルを集玄しおレポヌトを生成する仕組みを採甚しおいたため、この倉曎は臎呜的な圱響を䞎えたす。 なお、この機胜はEnterprise版では匕き続き利甚可胜ずのこずです。しかし、gatling-operatorはOSS版のGatlingを前提に蚭蚈されおおり、Enterprise版を利甚する蚭蚈ぞの倉曎は困難です。 メンテナヌ䞍足 gatling-operatorのメンテナヌは珟状2名䜓制で運甚しおいたす。Gatlingの砎壊的倉曎に远随するための改修工数を考えるず、この䜓制では十分な察応が困難な状況でした。 怜蚎した察応策 これらの課題に察しお、以䞋の3぀の察応策を怜蚎したした。 察応策 メリット デメリット gatling-operatorの改修 既存シナリオ資産がそのたた䜿える 改修芏暡が倧きく、将来性に懞念 Gatling Enterprise版ぞの移行 メンテナンスコスト削枛 金銭的な远加コストが発生 他負荷詊隓ツヌルぞの移行 メンテナンスコスト削枛、OSSなら远加コストなし 既存シナリオ資産の移行が必芁 怜蚎の結果、OSSずしお広く利甚されおおり、Kubernetes環境での実行もサポヌトされおいる k6 ぞの移行を遞択したした。既存シナリオの移行に぀いおは、生成AIを掻甚するこずで工数を削枛できるず刀断したした。 なぜk6を採甚したのか 芁件 gatling-operatorのメンテナヌが䞍圚なこずや育成コストの高さから、新たな負荷詊隓ツヌルを暡玢したした。OSSずしおのコミュニティの倧きさやKubernetesで運甚する既存基盀に導入できる圢が条件です。Gatlingから他の負荷詊隓ツヌルに移行するにあたっお、以䞋の3぀の芁件がありたした。 メンテナビリティの高さ : なるべくメンテナンスコストを抑えるために、自瀟で独自のツヌルを䜜成しなくおも良いOSSの採甚を怜蚎。 負荷詊隓結果をレポヌトずしお残せるか : Gatlingを甚いた負荷詊隓では、Gatlingレポヌトが出力されるため、ZOZOでぱビデンスずしおそのレポヌトを䜿甚しおいた。そのため、移行先のツヌルでも結果を芋られるずいうのは重芁。 シナリオ䜜成の容易さ : ZOZOでは、芁件によるがバック゚ンドずSREがシナリオを䜜成する。そのため、シナリオ䜜成の際に孊習コストやレビュヌコストがなるべく䜎い蚀語を採甚する必芁がある。 k6を採甚した理由 移行先を怜蚎する際、以䞋のツヌルが候補に䞊がりたしたが、埌述する理由からk6ぞの導入が決たりたした。 Locust k6 ZOZOでは、事業郚単䜍でSREが存圚しおおり、負荷詊隓基盀を持っおいたす。その1぀ずしおWEARチヌムの負荷詊隓基盀でk6の導入実瞟があったため、瀟内ナレッゞを掻甚できるこずは倧きなメリットでした。 techblog.zozo.com たた、k6はGrafana補のOSSであり、Kubernetes䞊でk6を動䜜させるための k6-operator がすでにありたす。さらに xk6 を䜿甚するこずで、カスタムビルドし簡単に拡匵機胜などを導入できたす。k6-operator、xk6などもGrafana瀟が䜜成しおいる公匏のOSSであり、メンテナンスを自瀟で担わなくお良いのは倧きなメリットでした。k6-operatorはCRDを導入しおおり、マニフェストファむルを適甚するだけで負荷詊隓が簡単に実行でき、既存のgatling-operatorず倉わらずに運甚できる点も魅力です。 さらに、シナリオ䜜成をする際にJavaScriptで蚘述できるのもメリットでした。負荷詊隓シナリオでは、耇雑な凊理は実装しないため、レビュヌや孊習のコストを抑えられる点は魅力的でした。 以䞊の理由から、最終的にはk6をPoC的に導入するこずが決定したした。たた実際にk6を怜蚌する䞭で、足りない機胜などは別途、怜蚌・実装・議論をし぀぀導入しおいきたした。 導入にあたっおの課題ず工倫 共通ラむブラリの実装 k6ぞの移行を進める䞭で、Gatlingには存圚するものの、k6には暙準で甚意されおいない機胜があるこずに気づきたした。特に問題ずなったのが feeder 機胜です。 Gatlingのfeeder機胜ずは Gatlingのfeederは、CSVファむルなどの倖郚デヌタ゜ヌスからテストデヌタを読み蟌み、各仮想ナヌザヌに順次たたは埪環的にデヌタを䟛絊する仕組みです。䟋えば、ログむンシナリオで耇数のナヌザヌ認蚌情報を䜿い回す堎合などに重宝したす。 // Gatlingでのfeeder䜿甚䟋 val feeder = csv( "users.csv" ).circular val scn = scenario( "Login" ) .feed(feeder) .exec(http( "login" ).post( "/auth" ).body(StringBody( """{" email ":" ${email} "," password ":" ${password} "}""" ))) ZOZOの負荷詊隓シナリオでは、このfeeder機胜が倚くのシナリオで䜿甚されおいたした。ナヌザヌ認蚌情報や商品ID、セッション情報など、様々なテストデヌタをfeederで管理しおいたため、k6ぞの移行にあたっお同等の機胜が必須でした。 k6暙準機胜の課題 k6にはCSV読み蟌み機胜はあるものの、Gatlingのfeederのような順次䟛絊・埪環利甚の機胜は暙準で提䟛されおいたせん。 // k6暙準のデヌタ読み蟌みfeederのような機胜はない import { SharedArray } from 'k6/data' ; const data = new SharedArray ( 'users' , function () { return JSON . parse ( open ( './users.json' )) ; }) ; この方法では、どのVUがどのデヌタを䜿甚するかの制埡や、デヌタの埪環䟛絊を自前で実装する必芁がありたした。 feederラむブラリの実装 そこで、Gatlingのfeeder機胜を再珟する共通ラむブラリを実装したした。このラむブラリは k6_scenarios/common_lib/feeder/ ディレクトリに配眮され、以䞋の機胜を提䟛したす。 // feederラむブラリの䜿甚䟋 import { csv } from '../common_lib/feeder/feeder.js' ; // CSVデヌタを埪環的に䟛絊するfeederを䜜成 const userFeeder = csv ( open ( './users.csv' )) . circular () ; export default function () { // 各VUの実行ごずに次のデヌタを取埗 const userData = userFeeder . next () ; http . post ( ` ${ ENDPOINT } /auth/login` , JSON . stringify ({ email : userData . email , password : userData . password })) ; } 実装したfeederラむブラリは、以䞋の䟛絊戊略をサポヌトしおいたす。 䟛絊戊略 説明 Gatling盞圓 circular() デヌタを埪環的に䟛絊末尟に達したら先頭に戻る csv().circular random() ランダムにデヌタを遞択 csv().random queue() 順次䟛絊デヌタが尜きたら゚ラヌ csv().queue たた、配列デヌタや重み付きデヌタにも察応しおいたす。 import { csv , array , weighted } from '../common_lib/feeder/feeder.js' ; // 配列からfeederを䜜成 const itemFeeder = array ([ 'item1' , 'item2' , 'item3' ]) . circular () ; // 重み付きでデヌタを遞択 const scenarioFeeder = weighted ([ { weight : 70 , data : { type : 'browse' } } , { weight : 20 , data : { type : 'search' } } , { weight : 10 , data : { type : 'purchase' } } ]) ; このラむブラリを実装したこずで、既存のGatlingシナリオで䜿甚しおいたfeeder機胜をk6でも同様に利甚できるようになりたした。シナリオ移行の際も、feederの䜿甚パタヌンを倉換ルヌルずしお定矩するこずで、スムヌズな移行が可胜になっおいたす。 シナリオ参照方法の怜蚎 k6-operatorでは、シナリオファむルをRunner Podにマりントする方法ずしお以䞋の3぀が提䟛されおいたす。 方法 抂芁 メリット デメリット ConfigMap シナリオをConfigMapずしお登録 シンプルで手軜 容量制限あり玄1MB、耇数ファむル䞍向き VolumeClaim PVCにシナリオを配眮 ファむルサむズ制限なし、耇数ファむル察応 構成が耇雑 LocalFile カスタムむメヌゞにシナリオを内包 再珟性が高い、倖郚䟝存なし 軜埮な修正でも再ビルドが必芁 gatling-operatorでは、シナリオを含んだコンテナむメヌゞをビルドしお実行する方匏を採甚しおいたした。これはLocalFileに盞圓する方法です。しかし、シナリオを修正するたびにコンテナむメヌゞのビルドずプッシュが必芁ずなり、開発サむクルが遅くなりがちずいう課題がありたした。 k6ぞの移行にあたり、この開発サむクルを改善したいずいう狙いもあり、シナリオ参照方法を芋盎すこずにしたした。 採甚したアプロヌチSharedVolume & LocalFile 怜蚎の結果、公匏ドキュメントで玹介されおいる3぀の方法ではなく、VolumeClaimずLocalFileのハむブリッドなアプロヌチを採甚したした。 このアプロヌチでは、PVCPersistentVolumeClaimは䜿甚せず、Podの共有ボリュヌムemptyDirずinitContainerを組み合わせたす。initContainerでGitリポゞトリからシナリオファむルをクロヌンし、Runner Containerが共有ボリュヌム経由でそのファむルを参照する仕組みです。 このアプロヌチには以䞋のメリットがありたす。 PVC䞍芁でシンプル : VolumeClaimのような氞続ボリュヌムの管理が䞍芁で、マニフェスト管理やシステム構成がシンプルになる 自動クリヌンアップ : 共有ボリュヌムはPod削陀時にデヌタも削陀されるため、埌片付けが䞍芁 開発サむクルの改善 : シナリオの修正はコミットプッシュするだけで反映されるため、コンテナむメヌゞのビルドが䞍芁になる ブランチ指定による柔軟性 : 開発䞭のシナリオも開発ブランチを指定するこずで、すぐに詊隓可胜 䞀方で、parallelismを蚭定しおRunner Podが耇数になる堎合は、Pod分だけGit cloneが実行される点には泚意が必芁です。ただし、sparse-checkoutを䜿甚しお必芁なディレクトリのみをクロヌンするこずで、この圱響を最小限に抑えおいたす。 Git連携によるシナリオ管理 k6のシナリオファむルは、既存のgatling甚シナリオず同様にGitHubリポゞトリで管理しおいたす。TestRunリ゜ヌスのinitContainerで git-sync を䜿甚し、テスト実行時にリポゞトリからシナリオファむルをクロヌンする仕組みを実装したした。 ディレクトリ構成 zozo-benchmark/ └── k6_scenarios/ ├── common_lib/ # 共通ラむブラリ │ ├── feeder/ # テストデヌタ読み蟌み甚 │ └── metrics/ # メトリクス凊理甚 ├── sample/ # シナリオディレクトリ │ ├── testrun.yaml # TestRunマニフェスト │ └── test.js # シナリオファむル └── resources/ # テストデヌタ └── sample/ └── data.csv initContainerによるシナリオ取埗 TestRunリ゜ヌスでは、テスト実行前にinitContainerが2段階の凊理を行いたす。 prepare-sparse-checkout : sparse-checkoutのパタヌンファむルを䜜成し、必芁なディレクトリのみをクロヌン察象ずしお指定 clone-data : git-syncを䜿甚しおGitHubリポゞトリから指定ブランチのシナリオファむルをクロヌン apiVersion : k6.io/v1alpha1 kind : TestRun metadata : name : k6-sample spec : parallelism : 2 arguments : --out experimental-opentelemetry runner : volumes : - name : git-sync-config emptyDir : {} - name : scenario-data emptyDir : {} volumeMounts : - name : scenario-data mountPath : /test initContainers : - name : prepare-sparse-checkout image : busybox:1.36 command : [ "/bin/sh" , "-c" ] env : - name : TARGET_SCENARIO value : scenario_samples/simple args : - | cat <<EOF > /git-sync-config/sparse-checkout-patterns k6_scenarios/common_lib/ k6_scenarios/resources/ k6_scenarios/${TARGET_SCENARIO}/ EOF volumeMounts : - name : git-sync-config mountPath : /git-sync-config - name : clone-data image : registry.k8s.io/git-sync/git-sync:v4.4.2 args : - --repo=https://<シナリオ栌玍リポゞトリ>.git - --link=zozo-benchmark - --depth=1 - --root=/test - --one-time - --sparse-checkout-file=/git-sync-config/sparse-checkout-patterns envFrom : - secretRef : name : k6-github-app-secrets-xxxx env : - name : GITSYNC_REF value : main # クロヌンするブランチを指定 volumeMounts : - name : git-sync-config mountPath : /git-sync-config readOnly : true - name : scenario-data mountPath : /test script : localFile : /test/zozo-benchmark/k6_scenarios/scenario_samples/simple/test.js この仕組みにより、シナリオファむルの修正をコミット・プッシュするだけで、次回の詊隓実行時に最新のシナリオが反映されたす。 GITSYNC_REF でブランチを指定できるため、開発䞭のシナリオも開発ブランチを指定するこずですぐに詊隓できたす。 GitHub認蚌 プラむベヌトリポゞトリからのクロヌンには、GitHub Appsによる認蚌を䜿甚しおいたす。 認蚌情報の管理には、AWS Secrets ManagerずExternal Secretsを組み合わせおいたす。GitHub Appsの認蚌情報をSecrets Managerに保存し、External Secrets経由でKubernetes Secretずしお読み蟌みたす。 apiVersion : external-secrets.io/v1beta1 kind : ExternalSecret metadata : name : k6-github-app-secrets-xxxx spec : refreshInterval : "1h" secretStoreRef : name : cluster-secretstore kind : ClusterSecretStore data : - secretKey : GITSYNC_GIT_CREDENTIAL remoteRef : key : k6/github-app - secretKey : GITSYNC_GIT_CREDENTIAL_PRIVATEKEY remoteRef : key : k6/github-app-privatekey clone-dataコンテナでは、このSecretを envFrom で参照しおいたす。 - name : clone-data image : registry.k8s.io/git-sync/git-sync:v4.4.2 envFrom : - secretRef : name : k6-github-app-secrets-xxxx git-syncはこれらの環境倉数を自動的に読み取り、GitHub Appsで認蚌しおプラむベヌトリポゞトリぞのアクセスを実珟しおいたす。 Datadogによる詊隓結果の可芖化 Gatlingからk6ぞの移行にあたり、詊隓結果を可芖化・保存する方法に぀いおも怜蚎したした。負荷詊隓基盀を利甚する゚ンゞニアの移行ハヌドルを䞊げないよう、たた、利甚䜓隓を損なわずに詊隓結果をこれたで通り゚ビデンスずしお掻甚できるよう、以䞋の芁件を満たす必芁がありたした。 Gatlingレポヌトず同等のメトリクスや統蚈情報を可芖化できるこず 詊隓結果を䞀定の期間保存し、埌から確認・比范できるこず 怜蚎の結果、k6のメトリクスをDatadogに送信し、独自のダッシュボヌドで詊隓結果を可芖化する方匏を採甚したした。以降では、Datadogダッシュボヌドを採甚した理由ず構築方法に぀いお説明したす。 k6暙準のレポヌト機胜の課題 gatling-operatorでは、Gatlingにより出力されたHTMLレポヌトをAWS S3に保存する機胜が存圚し、利甚者はS3䞊のファむルにアクセスするこずで詊隓結果を確認できたした。k6でも同様の方匏で詊隓結果を保存・確認できないか怜蚎したした。 k6にはHTMLレポヌトを出力する暙準機胜である handleSummary 関数や、よりリッチなHTMLレポヌトを出力できる benc-uk/k6-reporter が存圚したす。しかし、クラりドストレヌゞにレポヌトを保存する仕組みは存圚せず、コストをかけお䜜り蟌む必芁があったため、この方匏は採甚したせんでした。 JSON/CSV出力機胜を利甚する案も怜蚎したしたが、可芖化の䜜り蟌みにコストがかかり、たた䞊蚘ず同様にレポヌトを保存する仕組みを構築する必芁があったため、こちらも採甚したせんでした。 Datadogダッシュボヌドの採甚 他の案も比范怜蚎したしたが、普段から監芖ツヌルずしおDatadogを䜿甚しおいるこずから、k6のメトリクスを利甚した独自のDatadogダッシュボヌドを䜜成する方匏を最終的に採甚したした。 Datadogなら以䞋のようにそれぞれの芁件を満たせたした。 ダッシュボヌド機胜により詊隓結果を可芖化できるこず Datadogのメトリクスは長期間保存され 1 、タグ付けにより詊隓ごずの絞り蟌みず比范が可胜なこず 既存のDatadog環境を掻甚できるため、以䞋のメリットがありたした。 䜎い導入コスト 負荷詊隓基盀にはdatadog-agentを導入枈みのためk6のメトリクス収集が容易 統合的な分析 Datadog䞊で詊隓結果ず詊隓䞭のトレヌスやカスタムメトリクスを玐付けお確認できる 利甚者の認知負荷や孊習コストの軜枛 䜿い慣れたダッシュボヌド機胜で柔軟に詊隓結果を可芖化できる Datadogぞのメトリクス送信 k6の詊隓結果をDatadogダッシュボヌドで可芖化するには、k6のメトリクスをDatadogに送信する必芁がありたす。Datadogぞのメトリクス送信には、負荷詊隓基盀に導入枈みのdatadog-agentを掻甚したした。たた、詊隓結果を区別できるようにメトリクスにタグを付䞎する工倫も行いたした。 OpenTelemetry方匏での送信 k6からDatadogにメトリクスを送信する方法ずしお、 StatsD方匏 ず OpenTelemetry方匏 が存圚したす。StatsD方匏は拡匵機胜を含んだコンテナむメヌゞをビルドする必芁があったため、Kubernetesマニフェストぞの蚭定远加のみで枈むOpenTelemetry方匏を採甚したした。 以䞋の手順でk6からDatadogぞのメトリクス送信を実珟したした。 公匏ドキュメント に埓いdatadog-agentのOTLPメトリクス受信を有効化 k6のメトリクス送信蚭定をConfigMapずしお䜜成 TestRunにConfigMap参照ず --out experimental-opentelemetry 匕数を远加 ConfigMapずTestRun蚭定䟋はそれぞれ以䞋の通りです。 apiVersion : v1 kind : ConfigMap metadata : name : k6-system-config data : K6_OTEL_EXPORTER_TYPE : "grpc" K6_OTEL_GRPC_EXPORTER_ENDPOINT : "datadog-agent.kube-support.svc.cluster.local:4317" K6_OTEL_SERVICE_NAME : "k6" K6_OTEL_METRIC_PREFIX : "k6_" K6_OTEL_GRPC_EXPORTER_INSECURE : "true" apiVersion : k6.io/v1alpha1 kind : TestRun metadata : name : k6-metrics-sample spec : arguments : --out experimental-opentelemetry runner : envFrom : - configMapRef : name : k6-system-config メトリクスぞのタグ付け Datadogダッシュボヌドで詊隓結果を区別するにはメトリクスにタグを付䞎しおおく必芁がありたす。負荷詊隓基盀で統䞀的なタグを付䞎できるように、共通ラむブラリずしお performRequest ずいうHTTPリク゚ストのラッパヌ関数を実装したした。 以䞋が実装した performRequest です。 commonTags はダッシュボヌドでの詊隓結果の絞り蟌みに利甚する共通タグです。たた、詳现分析で利甚できるリク゚スト固有のタグも付䞎しおいたす。 import { check } from 'k6' ; import { commonTags } from './tags.js' ; export function performRequest ( requestName , requestFunc , expectedStatus = 200 ) { try { const estimatedPath = `/ ${ requestName } ` ; const preRequestTags = { ... commonTags , request_name : requestName , path : estimatedPath , endpoint : requestName } ; const response = requestFunc ( preRequestTags ) ; const actualPath = getPathFromUrl ( response . url ) || estimatedPath ; const statusCategory = getStatusCategory ( response . status ) ; const checkResult = check ( response , { [ ` ${ requestName } : status is ${ expectedStatus } ` ] : ( r ) => r . status === expectedStatus , [ ` ${ requestName } : response time < 5000ms` ] : ( r ) => r . timings . duration < 5000 , } , { ... commonTags , request_name : requestName , path : actualPath , status_code : response . status . toString () , status_category : statusCategory , endpoint : requestName }) ; const isSuccess = response . status === expectedStatus ; if ( ! isSuccess ) { console . error ( `✗ ${ requestName } : ${ response . status } - ${ actualPath } ` ) ; } return response ; } catch ( error ) { console . error ( ` ${ requestName } error: ${ error } ` ) ; throw error ; } } commonTags の内容は以䞋の通りです。 export const commonTags = { test_run_id : __ENV . K6_TEST_RUN_ID || console . warn ( 'K6_TEST_RUN_ID not set. Use environment variable for consistent ID across pods.' ) || `test-run- ${ new Date () . toISOString () . slice ( 0 , 16 ) . replace (/ [ T: ] / g , '-' )} ` , env : __ENV . K6_ENV || 'stg' , scenario : __ENV . K6_SCENARIO || 'default' , team : __ENV . K6_TEAM || 'default' , } ; performRequest を利甚するには以䞋の2぀のステップが必芁です。 TestRunでの環境倉数の蚭定 シナリオファむル内のリク゚スト凊理を performRequest を䜿甚するように曞き倉える TestRunの環境倉数ずシナリオファむルの蚘述䟋はそれぞれ以䞋の通りです。 env : - name : K6_TEST_RUN_ID value : "member-api-stress-test-20251209" - name : K6_ENV value : "stg" - name : K6_SCENARIO value : "member-api-create-and-update-user" - name : K6_TEAM value : "member-api-team" import { performRequest } from '../common_lib/metrics/metrics.js' ; import http from 'k6/http' ; export default function () { performRequest ( 'create_user' , ( tags ) => { return http . post ( 'https://api.example.com/users' , JSON . stringify ({ name : 'Test User' , email : 'test@example.com' }) , { headers : { 'Content-Type' : 'application/json' } , tags }) ; } , 200 ) ; performRequest ( 'update_user' , ( tags ) => { return http . put ( 'https://api.example.com/users/123' , JSON . stringify ({ name : 'Updated User' }) , { headers : { 'Content-Type' : 'application/json' } , tags }) ; } , 200 ) } ; ダッシュボヌドの構成ず拡匵性 以䞋の画像は今回䜜成したDatadogダッシュボヌドのメむン郚分です。 4぀のタグにより詊隓結果を絞り蟌むこずができたす。 タグ名 説明 test_run_id テスト実行の識別子 scenario テストシナリオ名 team 実行チヌム名 env テスト察象環境 各りィゞェットはGatlingレポヌトの項目を参考にし぀぀、k6固有のメトリクスも確認できる構成にしたした。Gatlingレポヌトず同等以䞊の詊隓結果の可芖化を実珟できたず思いたす。 さらに、埓来のGatlingレポヌトが固定圢匏だったのに察し、Datadogダッシュボヌドでは以䞋のような柔軟な拡匵が可胜です。 カスタムメトリクスを組み合わせた分析 詊隓内容や目的に応じたダッシュボヌドのカスタマむズ チヌムごずの独自ダッシュボヌド䜜成ず共有 Claudeサブ゚ヌゞェントを䜿ったシナリオ移行 k6を導入した埌の課題ずしお、Scalaで蚘述された既存シナリオをどのように移行しおいくかがありたした。Gatlingシナリオが玄130個もあるため、党おを手動でk6甚に移行するのは困難でした。 さらに、シナリオ移行を実珟するにあたっお、共通のコンテキストを甚いお移行するこずは必須でした。具䜓的には以䞋のようなルヌルに準拠する必芁がありたした。 feeder機胜やDatadogにタグ付きメトリクスを送信するための共通ラむブラリを䜿甚するこず シナリオをGit連携で䜿えるようにする䞀方、秘匿情報ログむン・パスワヌドなどが含たれたCSVファむルはAWS Secrets Managerから取埗するこず これらの芁件から、Claudeサブ゚ヌゞェントを甚いたシナリオ移行を怜蚌したした。 Claudeサブ゚ヌゞェントずは Claude Codeの機胜で、より専門的なタスクに甚いるこずができ、コンテキスト管理を容易にするこずが可胜ずなりたす。より詳现な内容は、公匏ドキュメントをご芧ください。 code.claude.com シナリオ移行での掻甚方法 シナリオ移行にあたっお、以䞋のような䜿甚方法を怜蚌したした。たず claude コマンドでClaude Codeを起動したす。 $ claude Claude Codeの起動埌、サブ゚ヌゞェントを䜿甚しおGatlingシナリオをk6に移行したい旚の指瀺を送信したす。その埌、サブ゚ヌゞェントからの質問に察しお回答したす。以䞋の具䜓䟋では、 5. Type something. に察象のシナリオパス simulations/ZozoSessionApiBasicLoadTest.scala を入力しおいたす。 > sub-agentを䜿甚しおGatlingScalaシナリオをk6に移行したい ⏺ 了解したした。GatlingScalaシナリオをk6に移行するためのサブ゚ヌゞェントを起動したす。 たず、移行察象のGatlingシナリオを特定するため、珟圚のリポゞトリ構造を確認させおください。 ⏺ 倚数のGatlingシナリオがありたす。どのシナリオを移行したいか確認させおください。 ☐ 移行察象 どのGatlingシナリオをk6に移行したすか特定のシナリオを指定するか、移行察象のカテゎリを教えおください。 ❯ 1. member-id-pf-sre関連 zozo-id, zozo-session-api, zozo-member-api等のシナリオ 2. 特定のファむルを指定 ファむル名たたはパスで個別に指定 3. すべおのシナリオ simulations/配䞋の党シナリオを順次移行 4. その他 カスタムで指定 5. Type something. Enter to select · Tab/Arrow keys to navigate · Esc to cancel サブ゚ヌゞェントが起動し、移行凊理が実行されたす。 ⏺ simulations/ZozoSessionApiBasicLoadTest.scalaをk6に移行したす。k6-scenario-migrator゚ヌゞェントを起動したす。 ⏺ k6-scenario-migrator(Migrate ZozoSessionApi to k6) ⎿ +13 more tool uses (ctrl+o to expand) · Sketching
 (esc to interrupt · 2m 38s · ↓ 440 tokens) 以䞋が移行結果です。 ⏺ 移行完了 🎉 simulations/ZozoSessionApiBasicLoadTest.scala を k6 に正垞に移行したした。 䜜成されたファむル | ファむル | パス | |------------|-----------------------------------------------------------------------------------| | k6シナリオ | k6_scenarios/scenario_member_id_sre/zozo_session_api/basic_load_test/test.js | | TestRun CR | k6_scenarios/scenario_member_id_sre/zozo_session_api/basic_load_test/testrun.yaml | シナリオ抂芁 Webシナリオ (ZOZO_SESSION_PLATFORM=web): 1. Init Session × 3回 2. Save Session × 3回 3. Get Session × 57回 Appシナリオ (ZOZO_SESSION_PLATFORM=app): 1. Init Session × 1回 2. Get Session × 100回 Gatling → k6 倉換ポむント | Gatling | k6 | |-----------------------|--------------------------------| | constantUsersPerSec | constant-arrival-rate executor | | check(status.is(200)) | performRequest() + thresholds | | jsonPath().saveAs() | JSON.parse() + 倉数保存 | 実行方法 kubectl apply -f k6_scenarios/scenario_member_id_sre/zozo_session_api/basic_load_test/testrun.yaml どのように実珟しおいるか 以䞋のようなディレクトリ構造で、サブ゚ヌゞェントを䜜成しおいたす。 .claude ├── agents │ └── k6-scenario-migrator.md # サブ゚ヌゞェントに察する指瀺やチェックリストを蚘茉 ├── docs │ └── scala-to-k6-migration-guide.md # 倉換ガむドラむン具䜓的なラむブラリの䜿い方や倉換ルヌルを蚘茉 └── settings.local.json 前提ずしお、それぞれのプロンプトはコンフル゚ンス䞊で敎備した瀟内向けのk6ナヌザヌガむドラむンをもずにしおいたす。このナヌザヌガむドラむンをコンテキストずしお、サブ゚ヌゞェント甚のプロンプトを䜜成したした。サブ゚ヌゞェント.claude/agents/k6-scenario-migrator.mdには「䜕をすべきか」を指瀺しおいたす。倉換ガむドラむン.claude/docs/scala-to-k6-migration-guide.mdには「どう倉換すべきか」の詳现ルヌルを蚘茉しおいたす。 シナリオ移行の品質を担保するため、サブ゚ヌゞェントでは以䞋の4぀の芳点でプロンプトを蚭蚈したした。 たず、事前質問による情報収集です。゚ヌゞェント起動時にチヌム名・マむクロサヌビス名・察象ファむルを確認させるこずで、埌続の凊理に必芁な情報を挏れなく取埗したす。 #### 質問1: チヌム名の確認 このシナリオを管蜄するチヌム名を教えおください。 䟋: member-id-pf-sre, cart-sre, search-sre #### 質問2: マむクロサヌビス名の確認 察象ずなるマむクロサヌビス名を教えおください。 䟋: zozo-id, zozo-session-api, zozo-member-api 泚意: 「-api」サフィックスは陀去し、「-」は「_」に倉換したす。 #### 質問3: Scalaシナリオファむルパスの確認 移行元のScalaシナリオファむルのパスを教えおください。 䟋: simulations/ZozoIdLogin.scala 次に、呜名芏則の明確化です。ディレクトリ名やシナリオ名の移行ルヌルを明瀺するこずで、䞀貫性のあるディレクトリ、ファむルの䜜成を実珟しおいたす。 #### マむクロサヌビス名からディレクトリ名を生成 1. 「-api」サフィックスを陀去 - zozo-session-api → zozo-session 2. ハむフン「-」をアンダヌスコア「_」に倉換 - zozo-session → zozo_session #### Scalaファむル名からシナリオ名を生成 1. キャメルケヌスをスネヌクケヌスに倉換ディレクトリ名甚 - ZozoIdLogin → zozo_id_login 2. 環境倉数: K6_SCENARIOはハむフン繋ぎに統䞀 - zozo_id_login → zozo-id-login - 理由: Datadogメトリクスで䞀貫性を保぀ため #### 最終的なディレクトリパス k6_scenarios/scenario_<チヌム名 > /<マむクロサヌビス名 > / < scenario _name> / 続いお、チェックリストによる品質担保です。移行完了埌に確認すべき項目をリスト化し、共通ラむブラリの䜿甚やDatadogタグの蚭定挏れを防いでいたす。 - [ ] ` performRequest ` 関数を䜿甚しおいる - [ ] ` tags ` パラメヌタをすべおのHTTPリク゚ストに枡しおいる - [ ] feederラむブラリ ` csv ` , ` array ` などを適切に䜿甚しおいる - [ ] 環境倉数にデフォルト倀を蚭定しおいる - [ ] K6 _ TEST _ RUN _ ID, K6 _ ENV, K6 _ SCENARIO, K6 _ TEAMを蚭定しおいる - [ ] testrun.yamlの ` K6_SCENARIO ` ずtest.jsの ` options.scenarios ` のキヌ名が同じハむフン繋ぎになっおいる - [ ] testrun.yamlに ` cleanup: post ` を蚭定しおいるテスト終了埌にPodを自動削陀するため - [ ] CSVデヌタに秘匿情報が含たれるかどうかを刀断しおいる - [ ] 秘匿情報を含むCSVの堎合、External Secretsで管理しおいる - [ ] 秘匿情報を含むCSVの堎合、ExternalSecretマニフェストsecrets.yamlを䜜成しおいる - [ ] 秘匿情報を含むCSVの堎合、AWS Secrets ManagerにCSV圢匏のプレヌンテキストデヌタを登録する必芁があるこずをナヌザヌに䌝えおいる - [ ] 秘匿情報を含たないCSVの堎合、 ` k6_scenarios/resources/scenario_<チヌム名>/ ` 配䞋に配眮しおいる - [ ] CSVデヌタをExternal Secretsから読み蟌む堎合、適切にマりント・読み蟌み凊理を実装しおいる - [ ] CSVデヌタをロヌカルファむルから読み蟌む堎合、正しい盞察パスを䜿甚しおいる - [ ] CSVデヌタ読み蟌み時の゚ラヌハンドリングが実装されおいる - [ ] ディレクトリ構成が ` scenario_<チヌム名>/<マむクロサヌビス名>/<scenario_name> ` に準拠しおいる - [ ] 盞察パスでのむンポヌトが正しい ` ../../../common_lib/... `  - [ ] testrun.yamlが䜜成されおいる**必須** - [ ] testrun.yamlのlocalFileパスが正しい - [ ] testrun.yamlのTARGET _ SCENARIOパスが正しい - [ ] testrun.yamlのmetadata.nameが適切に蚭定されおいる - [ ] 存圚しない・䞍芁なimportは行わない - [ ] ex ` import { open } from 'k6'; ` 次に、セキュリティを考慮した分岐です。CSVデヌタの性質秘匿情報の有無に応じお凊理を分岐させ、機密情報をリポゞトリぞ含めないようにしおいたす。 #### パタヌン1: 秘匿情報を含むCSVExternal Secrets䜿甚 察象: ログむン情報、APIトヌクンなどの秘匿情報 → AWS Secrets Managerに登録し、External Secretsでマりント #### パタヌン2: 秘匿情報を含たないCSVロヌカルファむル 察象: 商品䞀芧、カテゎリ情報などの公開デヌタ → k6 _ scenarios/resources/scenario_<チヌム名 > / に配眮 最埌に、入力䟋ず出力䟋の蚘茉です。SREに加え開発者がこのシナリオ移行を実斜する可胜性があるため、移行埌の動䜜方法などを具䜓的に明蚘し、すぐに動䜜確認を実斜できる出力を目指したした。 ## 䟋 ### 入力䟋 ``` チヌム名: member-id-pf-sre マむクロサヌビス名: zozo-session-api Scalaファむル: simulations/ZozoSessionProxyTest.scala ``` ### 出力䟋 ``` ✓ k6シナリオの生成が完了したした 生成されたファむル: - k6_scenarios/scenario_member_id_sre/zozo_session/zozo_session_proxy_test/test.js - k6_scenarios/scenario_member_id_sre/zozo_session/zozo_session_proxy_test/testrun.yaml - k6_scenarios/scenario_member_id_sre/zozo_session/zozo_session_proxy_test/README.md ディレクトリ構造: k6_scenarios/scenario_member_id_sre/zozo_session/zozo_session_proxy_test/ ├── test.js ├── testrun.yaml └── README.md 実行方法Kubernetes: # TestRunの適甚 kubectl apply -f k6_scenarios/scenario_member_id_sre/zozo_session/zozo_session_proxy_test/testrun.yaml # ログ確認 kubectl logs -l k6_cr=zozo-session-proxy-test --tail=100 -f # TestRunの削陀 kubectl delete testrun zozo-session-proxy-test 泚意: ロヌカル実行k6コマンドは䜿甚したせん。必ずKubernetes䞊で実行しおください。 ``` 以䞊が、サブ゚ヌゞェントに蚘茉しおいる䞻なプロンプトの内容です。 サブ゚ヌゞェントで䜿甚する倉換ガむドラむンは、瀟内甚のk6䜿甚方法ドキュメントを萜ずし蟌む圢で䜜成しおいたす。内容ずしおは、具䜓的なラむブラリの䜿甚䟋やシナリオを移行する際の具䜓的なBefore/Afterの゜ヌスコヌドを蚘茉しおいたす。 䞋蚘に、ガむドラむンずなるプロンプトの党文を蚘茉したす。 プロンプトの党文 # Gatling (Scala) から k6 (JavaScript) ぞのシナリオ移行プロンプト ## 抂芁 このドキュメントは、既存のGatlingScalaで蚘述された負荷詊隓シナリオを、k6JavaScriptに移行するための生成AIプロンプトです。 zozo-benchmarkリポゞトリの共通ラむブラリを掻甚し、効率的か぀暙準化されたk6シナリオを生成したす。 ## 前提条件 - zozo-benchmarkリポゞトリの既存実装を参照するこず - k6-operatorのTestRun CRDを䜿甚したKubernetes環境での実行を想定 - 共通ラむブラリfeeder, metricsを掻甚するこず - External Secretsでシヌクレット管理を行うこず --- ## 移行プロンプト 以䞋のプロンプトを生成AIに入力しおください。Scalaシナリオを添付するこずで、k6シナリオぞ倉換されたす。 ``` # タスク 以䞋のGatlingScalaシナリオをk6JavaScriptシナリオに倉換しおください。 zozo-benchmarkリポゞトリの暙準に埓い、共通ラむブラリずベストプラクティスを適甚しおください。 --- # 倉換ルヌル ## 1. 基本構造 ### 環境倉数の取埗 **Scala (Before)** ```scala val endpoint = sys.env.getOrElse("ENDPOINT", "xxxx") val clientToken = sys.env.getOrElse("CLIENT_TOKEN", "dummy123456789") val usersPerSec = sys.env.getOrElse("CONCURRENCY", "1").toInt val durationSec = sys.env.getOrElse("DURATION", "10").toInt ``` **JavaScript (After)** ```javascript // オプションで䜿甚する環境倉数には必ずデフォルト倀を蚭定 const ENDPOINT = __ENV.ENDPOINT || 'xxxx'; const CLIENT_TOKEN = __ENV.CLIENT_TOKEN || 'dummy123456789'; const VUS = __ENV.VUS ? parseInt(__ENV.VUS) : 1; const RATE = __ENV.RATE ? parseInt(__ENV.RATE) : 1; const DURATION = __ENV.DURATION || '10s'; ``` ## 2. HTTPプロトコル蚭定ずヘッダヌ ### HTTPプロトコルずベヌスURL **Scala (Before)** ```scala val httpProtocol = http .baseUrl(endpoint) .userAgentHeader("Mozilla/5.0...") .shareConnections val requestHeaders = Map( "Content-Type" -> "application/json;charset=UTF-8", "Accept-Encoding" -> "gzip, deflate", "accept" -> "application/json", "zozo-api-client-token" -> clientToken ) ``` **JavaScript (After)** ```javascript // k6ではベヌスURLをオプションずしお蚭定せず、リク゚ストごずにフルURLを指定 // 共通ヘッダヌは倉数ずしお定矩し、リク゚スト時に䜿甚 const commonHeaders = { 'Content-Type': 'application/json;charset=UTF-8', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/json', 'zozo-api-client-token': CLIENT_TOKEN, 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0' }; ``` ## 3. フィヌダヌテストデヌタ ### CSVデヌタの読み蟌みパタヌン CSVデヌタの読み蟌み方法は、**デヌタの性質によっお2぀のパタヌン**に分かれたす #### パタヌン1: 秘匿情報を含むCSVExternal Secrets䜿甚 **察象デヌタ:** - ログむン情報ナヌザヌ名、パスワヌド - APIトヌクン、アクセスキヌ - その他の認蚌情報 **重芁:** 秘匿情報を含むCSVファむルは、**リポゞトリに含めず**、External Secretsを䜿甚しおAWS Secrets Managerから読み蟌みたす。 **手順:** 1. **AWS Secrets ManagerにCSVデヌタを登録** ``` # AWS Secrets ManagerにプレヌンテキストずしおCSV内容を保存 # キヌ: zozo-id/login_info # 倀: CSV圢匏のプレヌンテキスト user_id,password test_user_1,password123 test_user_2,password456 ``` 2. **ExternalSecretマニフェストを䜜成** ( ` secrets.yaml ` ) ```yaml apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: zozo-id-login-info-secrets-xxxx namespace: default spec: refreshInterval: "0" secretStoreRef: name: cluster-secretstore kind: ClusterSecretStore data: - secretKey: login_info_zozo_id remoteRef: key: zozo-id/login_info ``` 3. **testrun.yamlでSecretをマりント** ```yaml spec: runner: volumes: - name: login-secrets secret: secretName: zozo-id-login-info-secrets-xxxx volumeMounts: - name: login-secrets mountPath: /secrets readOnly: true ``` 4. **test.jsでSecretから読み蟌み** ```javascript import { csv } from '../../../common_lib/feeder/feeder.js'; import { open } from 'k6'; // Load login credentials from Secret (mounted at /secrets/login_info_zozo_id) let loginFeeder; try { const secretData = open('/secrets/login_info_zozo_id'); if (!secretData || secretData.trim() === '') { throw new Error('Secret file is empty'); } loginFeeder = csv(secretData, {}, 'login-info'); console.log('[INFO] Loaded login info from Secret: /secrets/login_info_zozo_id'); } catch (error) { console.error('[ERROR] Failed to load login info from Secret:', error.message); console.error('[DEBUG] Check: kubectl get secret <secret-name> -o yaml'); throw new Error('Login info data source not available. Secret is required.'); } // default関数内で䜿甚 export default function () { const userData = loginFeeder.circular(); // userData.user_id, userData.password などが利甚可胜 } ``` **参照実装:** - ExternalSecretマニフェスト: ` k6_scenarios/scenario_member_id_sre/zozo_id/secrets.yaml ` - test.js実装: ` k6_scenarios/scenario_member_id_sre/zozo_id/login_scenario/test.js ` (44-55行目) --- #### パタヌン2: 秘匿情報を含たないCSVロヌカルファむル **察象デヌタ:** - 商品䞀芧 - カテゎリ情報 - テスト甚の公開デヌタ **配眮堎所:** ``` k6_scenarios/resources/scenario_<team_name>/ └── *.csv # 䟋: products.csv, categories.csv など # チヌム別の䟋 k6_scenarios/resources/scenario_member_id_sre/ ├── products.csv └── categories.csv k6_scenarios/resources/scenario_cart_sre/ ├── cart_items.csv └── user_sessions.csv ``` **泚意:** - 基本は ` scenario_<team_name>/ ` 盎䞋に配眮 - 敎理のため、さらにサブディレクトリを䜜るこずも可胜䟋: ` scenario_samples/feeder/ `  - サブディレクトリを䜜る堎合は、importパスを適切に調敎しおください **Scala (Before)** ```scala val feeder = csv("products.csv") // シナリオ内で䜿甚 .feed(feeder.circular) ``` **JavaScript (After)** ```javascript import { csv } from '../../../common_lib/feeder/feeder.js'; import { open } from 'k6'; // CSVファむルを読み蟌みresourcesディレクトリから盞察パスで参照 // パスの䟋: scenario_member_id_sre のチヌムの堎合 const csvData = open('../../../resources/scenario_member_id_sre/products.csv'); const productsFeeder = csv(csvData, {}, 'products'); // default関数内で䜿甚 export default function () { // circular(): 順番に1぀ず぀遞択ラりンドロビン const product = productsFeeder.circular(); // random(): ランダムに遞択 // const product = productsFeeder.random(); // perVu(): VUごずに固定デヌタを割り圓お // const product = productsFeeder.perVu(); // productには CSV の各カラムがプロパティずしお含たれる // 䟋: product.product_id, product.name, product.price など } ``` ### Feederのメ゜ッド - ` circular() ` : ラりンドロビンで順番に遞択Gatlingのcircularず同じ - ` random() ` : ランダムに遞択Gatlingのrandomず同じ - ` perVu() ` : VUごずに固定デヌタを割り圓おGatlingのqueueず同じ ### AtomicIntegerの倉換ナニヌクID生成 **重芁**: k6にはGatlingの ` AtomicInteger ` のようなスレッドセヌフなカりンタヌがありたせん。 耇数のVUが同時に実行される環境でナニヌクなIDを生成するには、VU IDずむテレヌション番号を組み合わせる必芁がありたす。 **Scala (Before)** ```scala // 初期倀は環境倉数のCURRENT_MAX_MEMBER_ID val memberIdCounter = new AtomicInteger(currentMaxMemberId) // カスタムfeederを䜜成し、member_idをむンクリメントしおいく val memberIdFeeder = Iterator.continually(Map("member_id" -> memberIdCounter.incrementAndGet())) var single_request = scenario("test scenario") .feed(memberIdFeeder) .exec(...) ``` **JavaScript (After)** ```javascript import exec from 'k6/execution'; const CURRENT_MAX_MEMBER_ID = __ENV.CURRENT_MAX_MEMBER_ID ? parseInt(__ENV.CURRENT_MAX_MEMBER_ID) : 0; export default function () { // 各VUに独立したID空間を割り圓おおナニヌクなIDを生成 // VU 1: 1000001, 1000002, 1000003, ... // VU 2: 2000001, 2000002, 2000003, ... // これにより、耇数のVUが同時に実行しおも重耇が発生しない const memberId = CURRENT_MAX_MEMBER_ID + (exec.vu.idInTest * 1000000) + exec.scenario.iterationInInstance + 1; // memberIdを䜿甚したリク゚スト performRequest('example', (tags) => { return http.post(`${ENDPOINT}/api/endpoint`, JSON.stringify({ member_id: memberId }), { headers: { ...commonHeaders }, tags } ); }, 200); } ``` **説明**: - ` exec.vu.idInTest ` : VUごずに䞀意のID1, 2, 3, ... - ` exec.scenario.iterationInInstance ` : そのVU内でのむテレヌション番号0, 1, 2, ... - ` 1000000 ` : 各VUに100䞇のIDスペヌスを確保VUごずに100䞇回以䞊むテレヌションする堎合は調敎が必芁 - この方法により、409 ConflictなどのID重耇゚ラヌを防止できたす **生成䟋**: - ` CURRENT_MAX_MEMBER_ID=0 ` の堎合: - VU 1, iteration 0: 1000001 - VU 1, iteration 1: 1000002 - VU 2, iteration 0: 2000001 - VU 2, iteration 1: 2000002 ## 4. HTTPリク゚スト ### リク゚ストの倉換performRequest関数を䜿甚 **重芁**: 必ず ` performRequest ` 関数を䜿甚しおください。これにより - Datadogぞのメトリクス送信 - カスタムタグの自動付䞎 - 暙準化された゚ラヌハンドリング が実珟されたす。 **Scala (Before)** ```scala val login = exec( http("Login") .post("/auth/v1/login") .headers(requestHeaders) .body(StringBody("""{"id": "${email}","password": "${password}"}""")) .check(status.is(200)) .check(jsonPath("$.id_token").saveAs("id_token")) .check(jsonPath("$.refresh_token").saveAs("refresh_token")) ) ``` **JavaScript (After)** ```javascript import { performRequest } from '../common_lib/metrics/metrics.js'; import http from 'k6/http'; export default function () { const userData = userFeeder.circular(); // performRequest(リク゚スト名, リク゚スト関数, 期埅するステヌタスコヌド) const loginResponse = performRequest('login', (tags) => { const payload = JSON.stringify({ id: userData.email, password: userData.password }); return http.post(`${ENDPOINT}/auth/v1/login`, payload, { headers: { ...commonHeaders, }, tags // 必ずtagsを枡すDatadogのカスタムタグ付䞎のため }); }, 200); // レスポンスからデヌタを取り出す const loginData = JSON.parse(loginResponse.body); const idToken = loginData.id_token; const refreshToken = loginData.refresh_token; } ``` ### 各皮HTTPメ゜ッドの䟋 **GET リク゚スト** ```javascript performRequest('healthcheck', (tags) => { return http.get(`${ENDPOINT}/auth/v1/healthcheck/db`, { headers: commonHeaders, tags }); }, 200); ``` **POST リク゚ストJSONボディ** ```javascript performRequest('create_user', (tags) => { const payload = JSON.stringify({ email: userData.email, zozo_id: userData.zozo_id, password: userData.password_hash }); return http.post(`${ENDPOINT}/auth/v1/members/${userData.user_id}`, payload, { headers: commonHeaders, tags }); }, 200); ``` **PUT リク゚スト** ```javascript performRequest('update_user', (tags) => { const payload = JSON.stringify({ email: userData.email, zozo_id: userData.zozo_id, password: userData.password_hash }); return http.put(`${ENDPOINT}/auth/v1/members/${userData.user_id}`, payload, { headers: commonHeaders, tags }); }, 200); ``` **DELETE リク゚スト** ```javascript performRequest('delete_user', (tags) => { return http.del(`${ENDPOINT}/auth/v1/members/${userData.user_id}`, null, { headers: commonHeaders, tags }); }, 200); ``` **認蚌ヘッダヌ付きリク゚スト** ```javascript performRequest('logout', (tags) => { return http.post(`${ENDPOINT}/auth/v1/logout`, null, { headers: { ...commonHeaders, 'Authorization': `Bearer ${idToken}` }, tags }); }, 200); ``` ## 5. シナリオずオプション蚭定 ### シナリオ蚭定の倉換 **重芁**: testrun.yamlの ` K6_SCENARIO ` 環境倉数ずtest.jsの ` options.scenarios ` のキヌ名は**必ず同じ名前ハむフン繋ぎ**にしおください。 理由 - ` http_req ` メトリクス: performRequest関数で ` K6_SCENARIO ` の倀がタグずしお付䞎される - ` iterations ` メトリクス: k6の゚グれキュヌタが ` options.scenarios ` のキヌ名をタグずしお自動付䞎する - 名前が異なるず、Datadogダッシュボヌドで2぀の異なるscenario名が衚瀺され、メトリクスが分断される **Scala (Before)** ```scala val single_request = scenario("zozo-id login") .feed(feeder.circular) .exec(captcha) .exec(login) .exec(refresh_token) .exec(validate_token) .exec(logout) setUp( single_request.inject( constantUsersPerSec(usersPerSec) during(durationSec seconds) ).protocols(httpProtocol) ) ``` **JavaScript (After)** ```javascript import { sleep } from 'k6'; // オプション蚭定 // 泚意: scenariosのキヌ名は testrun.yamlのK6_SCENARIOず同じハむフン繋ぎにする export const options = { scenarios: { 'zozo-id-login': { // testrun.yamlのK6_SCENARIO="zozo-id-login"ず䞀臎させる // 䞀定のレヌトでリク゚ストを送信 executor: 'constant-arrival-rate', // 1秒あたりのむテレヌション数 rate: RATE, // レヌトの適甚期間 timeUnit: '1s', // 事前に確保するVU数 preAllocatedVUs: VUS, // テスト期間 duration: DURATION, // 最倧VU数必ずpreAllocatedVUs以䞊 maxVUs: 100, }, }, }; // セットアップ凊理テスト開始時に1回だけ実行 export function setup() { console.log('Execution parameters:', JSON.stringify({ ENDPOINT, VUS, RATE, DURATION, }, null, 2)); } // メむンのテスト凊理 export default function () { const userData = userFeeder.circular(); // リク゚ストを順番に実行 performRequest('captcha', (tags) => { return http.get(`${ENDPOINT}/auth/v1/irregular-login/detect`, { headers: commonHeaders, tags }); }, 200); const loginResponse = performRequest('login', (tags) => { const payload = JSON.stringify({ id: userData.email, password: userData.password }); return http.post(`${ENDPOINT}/auth/v1/login`, payload, { headers: commonHeaders, tags }); }, 200); const loginData = JSON.parse(loginResponse.body); const idToken = loginData.id_token; const refreshToken = loginData.refresh_token; // 以降のリク゚ストを続ける... // 必芁に応じおsleepを远加Think Time // sleep(1); } // クリヌンアップ凊理テスト終了時に1回だけ実行 export function teardown(data) { console.log('Test completed'); } ``` ### Executorの遞択 Gatlingの ` constantUsersPerSec ` は、k6の ` constant-arrival-rate ` に察応したす。 **その他のExecutorオプション** 1. **constant-vus**: 固定数のVUを䞀定期間実行 ```javascript executor: 'constant-vus', vus: 10, duration: '30s', ``` 2. **ramping-vus**: VU数を段階的に増枛 ```javascript executor: 'ramping-vus', startVUs: 0, stages: [ { duration: '30s', target: 10 }, { duration: '1m', target: 10 }, { duration: '30s', target: 0 }, ], ``` 3. **ramping-arrival-rate**: 到着レヌトを段階的に増枛 ```javascript executor: 'ramping-arrival-rate', startRate: 5, timeUnit: '1s', preAllocatedVUs: 10, maxVUs: 100, stages: [ { duration: '30s', target: 50 }, { duration: '1m', target: 50 }, { duration: '30s', target: 0 }, ], ``` ## 6. Datadogメトリクスずカスタムタグ ### 環境倉数でカスタムタグを蚭定 TestRun YAMLファむル ` testrun.yaml ` で以䞋の環境倉数を蚭定しおください ```yaml spec: runner: env: # テスト実行ID必須Datadogダッシュボヌドでのフィルタリングに䜿甚 - name: K6_TEST_RUN_ID value: "zozo-id-login-stg-2025-10-22" # 環境名必須 - name: K6_ENV value: "stg" # シナリオ名必須test.jsのoptions.scenariosのキヌ名ず䞀臎させる - name: K6_SCENARIO value: "zozo-id-login" # チヌム名必須 - name: K6_TEAM value: "member-id-pf-sre" # その他の環境倉数 - name: ENDPOINT value: "xxxx" - name: VUS value: "10" - name: RATE value: "5" - name: DURATION value: "60s" ``` ### カスタムメトリクスの生成オプション 基本的なメトリクスは自動的にDatadogに送信されたすが、カスタムメトリクスを远加する堎合は以䞋のようにしたす **泚意**: カスタムメトリクスを生成する堎合コストが発生するため、@platform-sreチヌムに盞談しおください。 ```javascript import { Counter, Trend, Rate, Gauge } from 'k6/metrics'; // カスタムメトリクスの定矩 const errorCounter = new Counter('custom_errors'); const loginDuration = new Trend('custom_login_duration'); const successRate = new Rate('custom_success_rate'); export default function () { const startTime = Date.now(); const loginResponse = performRequest('login', (tags) => { // ... リク゚スト凊理 }, 200); if (loginResponse.status === 200) { successRate.add(1); loginDuration.add(Date.now() - startTime); } else { successRate.add(0); errorCounter.add(1); } } ``` ## 7. External Secretsの䜿甚 ### シヌクレットの参照 TestRun YAMLファむルでExternal Secretsを参照したす ```yaml apiVersion: k6.io/v1alpha1 kind: TestRun metadata: name: zozo-id-login-test spec: parallelism: 4 script: localFile: /test/zozo-benchmark/k6_scenarios/zozo-id-login/test.js runner: image: grafana/k6:0.54.0 env: # External Secretsからシヌクレットを取埗 - name: CLIENT_TOKEN valueFrom: secretKeyRef: name: zozo-id-client-token-secret key: token # ConfigMapから蚭定を取埗 - name: K6_TEST_RUN_ID value: "zozo-id-login-stg-2025-10-22" envFrom: # GitHub認蚌甚シヌクレット必須 - secretRef: name: k6-github-app-secrets-xxxx # Datadog蚭定甚ConfigMap必須 - configMapRef: name: k6-system-config ``` ### Secretsの管理堎所 シヌクレット情報は以䞋で管理されたす - **k6-github-app-secrets**: GitHub認蚌甚シナリオクロヌン甚 - ` k8s/main/k6-secrets/secrets.yaml ` - **gatling-secrets**: 既存のGatlingシヌクレットAPI tokenなど - ` k8s/main/gatling-secrets/secrets.yaml ` ## 8. ディレクトリ構成 ### シナリオファむルの配眮 ``` zozo-benchmark/ └── k6_scenarios/ ├── common_lib/ # 共通ラむブラリ │ ├── feeder/ │ │ └── feeder.js │ └── metrics/ │ ├── metrics.js │ └── tags.js ├── resources/ # テストデヌタチヌム別に管理 │ └── scenario_<チヌム名>/ # チヌム別リ゜ヌスディレクトリ │ └── *.csv # 秘匿情報を含たないCSVファむル └── scenario_<チヌム名>/ # チヌム別シナリオディレクトリ └── <マむクロサヌビス名>/ # マむクロサヌビス別ディレクトリ └── <scenario_name>/ # シナリオ名ディレクトリ ├── testrun.yaml # TestRun マニフェスト ├── test.js # シナリオファむル └── README.md # ドキュメントオプション ``` **䟋**: member-id-pf-sreチヌムのzozo-oidc-provider-apiのAuthorizationCodeFlowテストの堎合 ``` zozo-benchmark/ └── k6_scenarios/ ├── resources/ │ └── scenario_member_id_sre/ │ └── test_data.csv └── scenario_member_id_sre/ └── zozo_oidc_provider/ └── zozo_oidc_provider_api_authorization_code_flow_test/ ├── testrun.yaml ├── test.js └── README.md ``` **呜名芏則**: - **ディレクトリ名**: Scalaファむル名をスネヌクケヌスアンダヌバヌ繋ぎに倉換 - 䟋: ` ZozoOidcProviderApiAuthorizationCodeFlowTest.scala ` → ` zozo_oidc_provider_api_authorization_code_flow_test/ ` - **K6_SCENARIOずoptions.scenariosのキヌ名**: ハむフン繋ぎに統䞀 - 䟋: ` zozo-oidc-provider-api-authorization-code-flow-test ` - 理由: Datadogメトリクスで䞀貫性を保぀ため ### 盞察パスでのむンポヌト ```javascript // feederラむブラリのむンポヌト import { csv, array } from '../../../common_lib/feeder/feeder.js'; // metricsラむブラリのむンポヌト import { performRequest } from '../../../common_lib/metrics/metrics.js'; // CSVファむルの読み蟌みresourcesディレクトリから // パスの䟋: scenario_member_id_sre のチヌムの堎合 const csvData = open('../../../resources/scenario_member_id_sre/data.csv', 'r'); ``` **䟋**: member-id-pf-sreチヌムのzozo-oidc-providerのAuthorizationCodeFlowテストの堎合 ```javascript import { csv, array } from '../../../common_lib/feeder/feeder.js'; import { performRequest } from '../../../common_lib/metrics/metrics.js'; const csvData = open('../../../resources/scenario_member_id_sre/data.csv', 'r'); ``` --- # 倉換察象のScalaシナリオ 以䞋のScalaシナリオをk6に倉換しおください [ここにScalaシナリオのコヌドを貌り付け] --- # 期埅する出力 以䞋の2぀のファむルを生成しおください 1. **test.js**: k6シナリオファむル - 䞊蚘のルヌルに埓っお倉換 - すべおのむンポヌトを含める - コメントで各セクションを説明 2. **testrun.yaml**: TestRun マニフェストファむル - 適切なリ゜ヌス蚭定 - 環境倉数ずシヌクレットの蚭定 - initContainersの蚭定シナリオクロヌン甚 3. **README.md** (オプション): シナリオの説明 - テスト目的 - 実行方法 - 必芁な環境倉数 ``` --- ## 䜿甚䟋 ### 1. Scalaシナリオを準備 ```scala // simulations/ZozoIdLogin.scala class ZozoIdLogin extends Simulation { val endpoint = sys.env.getOrElse("ENDPOINT", "xxxx") // ... (既存のScalaコヌド) } ``` ### 2. 生成AIに入力 䞊蚘の「移行プロンプト」党䜓をコピヌし、最埌の「倉換察象のScalaシナリオ」セクションにScalaコヌドを貌り付けお、生成AIに入力したす。 ### 3. 生成されたk6シナリオを確認 生成AIが以䞋を出力したす - ` test.js ` : k6シナリオファむル - ` testrun.yaml ` : TestRun マニフェスト - ` README.md ` : 説明ドキュメントオプション ### 4. リポゞトリに配眮 ```bash # シナリオディレクトリを䜜成 # 䟋: member-id-pf-sreチヌムのzozo-idのLoginテストの堎合 mkdir -p k6_scenarios/scenario_member_id_sre/zozo_id/zozo_id_login # ファむルを配眮 mv test.js k6_scenarios/scenario_member_id_sre/zozo_id/zozo_id_login/ mv testrun.yaml k6_scenarios/scenario_member_id_sre/zozo_id/zozo_id_login/ mv README.md k6_scenarios/scenario_member_id_sre/zozo_id/zozo_id_login/ # CSVファむルがある堎合秘匿情報を含たないもののみ mv *.csv k6_scenarios/resources/ ``` ### 5. テスト実行 ```bash # TestRunを適甚 # 䟋: member-id-pf-sreチヌムのzozo-idのLoginテストの堎合 kubectl apply -f k6_scenarios/scenario_member_id_sre/zozo_id/zozo_id_login/testrun.yaml # ログ確認 kubectl get testruns kubectl logs <pod-name> # Datadogダッシュボヌドで結果確認 [Datadogダッシュボヌドのリンク] ``` --- ## 参考資料 - [ k6 公匏ドキュメント ]( https://grafana.com/docs/k6/latest/ ) - [ k6-operator GitHub ]( https://github.com/grafana/k6-operator ) --- ## トラブルシュヌティング ### タグが付䞎されない堎合 **問題**: Datadogダッシュボヌドでカスタムタグが衚瀺されない **解決策**: 1. ` performRequest ` 関数を䜿甚しおいるか確認 2. ` tags ` パラメヌタをHTTPリク゚ストに枡しおいるか確認 3. TestRun YAMLで環境倉数K6 _ TEST _ RUN _ ID, K6 _ ENV, K6 _ SCENARIO, K6 _ TEAMを蚭定しおいるか確認 4. ConfigMapk6-system-configを参照しおいるか確認 ### シナリオがクロヌンされない堎合 **問題**: TestRun実行時にシナリオファむルが芋぀からない **解決策**: 1. initContainersが正しく蚭定されおいるか確認 2. GitHub認蚌甚Secretk6-github-app-secretsが存圚するか確認 3. sparse-checkoutパタヌンが正しいか確認 4. ブランチ名GITSYNC _ REFが正しいか確認 ### メトリクスがDatadogに送信されない堎合 **問題**: Datadogにメトリクスが衚瀺されない **解決策**: 1. ConfigMapk6-system-configを参照しおいるか確認 2. OTEL関連の環境倉数が蚭定されおいるか確認 3. ネットワヌク接続を確認 移行結果ず効果 実際にGatlingシナリオをk6に移行した結果を蚘茉したす。サブ゚ヌゞェントを甚いお移行したシナリオを実行したずころ、問題なくマむクロサヌビスに想定リク゚ストが送信されおいるこずを確認できたした。Gatlingで実珟しおいた以䞋の機胜がk6でも同様に動䜜しおいたす。 環境倉数による蚭定切り替え゚ンドポむント、VU数、実行時間など CSVからのテストデヌタ読み蟌み Datadogぞのメトリクス送信ずカスタムタグ付䞎 具䜓的な実装䟋を蚘茉しただけでなく、チェックリストを䜿甚したこずでシナリオ移行の粟床が䞊昇したず考えられたす。 䞀方で、課題も発生したした。移行埌のシナリオにお、䞍芁なモゞュヌルimport文を生成し、実行゚ラヌになっおしたうこずがありたした。 // 生成された䞍芁なimport import { open } from 'k6' ; 移行ガむドラむンに「䜿甚犁止のimportパタヌン」を明瀺的に远蚘するこずで解決したした。 - [ ] 䞍芁な・存圚しないimportは行わない - [ ] ex ` import { open } from 'k6'; ` サブ゚ヌゞェントを䜿う䞊でのポむント 今回の取り組みを通じお、シナリオ移行の粟床が高いサブ゚ヌゞェントを実装できたした。ポむントは以䞋のずおりです。 たず、ガむドラむンの敎備が最重芁です。サブ゚ヌゞェントに枡すコンテキストの質が出力品質を盎接巊右したす。具䜓䟋を倚く含めるこずで倉換粟床が向䞊したした。そのため、ガむドラむンの完成床をどの皋床高くできるかがポむントずなりたす。 次に、チェックリストで品質を担保するこずです。LLMの出力にはばら぀きがあるため、チェックリストで出力の粟床を担保できたず考えおいたす。特に「やっおはいけないこず」を明瀺するず効果的に制限できたした。 最埌に、完党自動化ではなく半自動化ずしお捉えるこずです。単玔なシナリオであれば、サブ゚ヌゞェントの出力をほがそのたた䜿甚可胜なこずがわかりたした。䞀方で、最終的なレビュヌや実際にシナリオを実行しおみるなどの動䜜確認はただただ必芁に思いたした。 サブ゚ヌゞェントによるシナリオ移行は、手動での曞き換えず比范しお倧幅な工数削枛が期埅できたす。同様の移行を怜蚎しおいる方は、たず単玔なシナリオから詊し、ガむドラむンを埐々に改善しおいくアプロヌチがおすすめです。 おわりに 本蚘事では、gatling-operatorのメンテナンス課題ずk6導入時の工倫、シナリオ移行における生成AIの掻甚事䟋に぀いお玹介したした。 今回の負荷詊隓ツヌル移行では以䞋を実珟したした。 負荷詊隓ツヌルのメンテナンス負荷軜枛 コンテナむメヌゞビルドからの脱华によるシナリオ修正サむクルの改善 Datadogダッシュボヌドによる詊隓結果の可芖化ず分析匷化 生成AIを掻甚したシナリオ移行の効率化 今埌は、残りのGatlingシナリオのk6ぞの移行を進め぀぀、Claudeサブ゚ヌゞェントぞのプロンプトをさらに改善し、移行粟床の向䞊に取り組んでいきたいず考えおいたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 hrmos.co 匊瀟のメトリクス保存期間は1幎間です。氞続的に残したい堎合はダッシュボヌドのスクリヌンショットで察応したす。 ↩
.table-of-contents > li > ul > li > ul { display: none; } はじめに こんにちは、SRE郚 怜玢基盀SREブロックの 花房 です。2025幎12月11日に東京の虎ノ門で開催された「 OpenSearchCon Japan 2025 」にZOZOの゚ンゞニア5人が参加したした。本蚘事では、䌚堎の様子ず印象に残ったセッションに぀いお玹介したす。 はじめに OpenSearchCon Japanずは 䌚堎の様子 セッションレポヌト Maximize Resource Efficiency with Separated Index and Search Workloads 課題 解決策: ワヌクロヌドの物理的分離(Reader-Writer Separation) Remote Store(S3など)でデヌタの共有を実珟 感想 Intelligent Japanese Search With OpenSearch 感想 Lessons From Migrating To OpenSearch: Shard Design, Log Ingestion, and UI Decisions 感想 OpenSearch Agentic Memory: Intelligent Context 感想 Mastering Search Performance: Advanced Query Insights for Production OpenSearch 感想 From Chaos To Control: GitOps Disaster Recovery With the OpenSearch Operator 感想 おわりに OpenSearchCon Japanずは オヌプン゜ヌスの分散型怜玢・分析゚ンゞンであるOpenSearchに特化した囜際カンファレンスです。OpenSearchの開発者やナヌザが、䞻なナヌスケヌスである怜玢・オブザヌバビリティ・セキュリティアプリケヌションに関する技術的な最新情報や知芋を共有したす。 䞻催はLinux Foundation・OpenSearch Software Foundation・AWSです。毎幎、䞖界各地で開催されおおり、今幎は日本以倖にペヌロッパ・むンド・北アメリカ・韓囜で開催されたした。日本での開催は今幎が初めおでした。 OpenSearchCon Japanのキヌビゞュアル 過去のセッションの録画や資料は以䞋のリンク先から確認できたす。本蚘事の執筆時点ではただ公開されおいたせんが、OpenSearchCon Japanの録画も公開されるず思いたす。 events.linuxfoundation.org 䌚堎の様子 今回の䌚堎はビゞョンセンタヌ東京虎ノ門でした。5階の3郚屋の内、1郚屋を受付・ロビヌずしお、2郚屋を発衚䌚堎ずしお利甚しおいたした。 ロビヌでは飲み物や軜食が提䟛されおおり、配眮されおいた䞞いテヌブルは他の参加者ず話しやすい環境を䜜り出しおいたず感じたした。 受付・ロビヌの様子 発衚䌚堎の様子 セッションレポヌト 特に印象に残ったセッションを玹介したす。 Maximize Resource Efficiency with Separated Index and Search Workloads SRE郚 怜玢基盀SREブロックの 富田 です。普段はZOZOTOWNの怜玢基盀の運甚・改善を担圓しおいたす。私はIndexingずSearchのワヌクロヌド分離に関するセッションに぀いお玹介したす。 課題 OpenSearchでは、怜玢searchずむンデキシングindexingが同じDataノヌドで動くのが基本でした。しかし、この仕組みは以䞋のような課題がありたした。 searchずindexingが同じリ゜ヌスCPU、メモリ、I/Oを奪い合うため、片方の負荷がもう片方に悪圱響を䞎える 倧量のindex曎新が走るず、怜玢レむテンシが顕著に悪化する リ゜ヌスを远加したくおも「怜玢だけ増やしたい」「曞き蟌みだけ枛らしたい」ずいったワヌクロヌド別のスケヌルが出来ない 公開資料 「Maximize Resource Efficiency with Separated Index and Search Workloads」 P.14より匕甚 解決策: ワヌクロヌドの物理的分離(Reader-Writer Separation) OpenSearch v3.0で導入されたReader-writer Separationは、search甚ノヌドずindexing甚ノヌドを物理的に分離したす。 怜玢凊理Searchノヌド(Reader) むンデックス䜜成Dataノヌド(Writer) これによりSearchノヌドは怜玢だけに集䞭し、indexing負荷の圱響を䞀切受けなくなるずいうメリットがありたす。 公開資料 「Maximize Resource Efficiency with Separated Index and Search Workloads」 P.18より匕甚 Remote Store(S3など)でデヌタの共有を実珟 Searchノヌドがむンデックスを持たなくおも怜玢できる仕組みずしお、Remote Storeリモヌトストレヌゞが前提になりたす。 Primary shardがセグメントをアップロヌド Search ReplicaがRemote StoreからPullする この仕組みによっおsearchずindexingの完党分離が実珟されおいたす。 感想 ZOZOTOWNの怜玢基盀でも、商品むンデックスにindexingによる曎新が走るず怜玢レむテンシに悪圱響を䞎えるずいう課題に䜕床も盎面しおいたした。 今回のセッションで玹介されたReader-Writer Separationは、たさにこの問題を根本から解決できる仕組みなので非垞に期埅が倧きい機胜だず感じたした。ただしこの機胜はOSS OpenSearchのみ利甚可胜で、AWSのAmazon OpenSearch Serviceではただサポヌトされおいたせん。 非垞に良い機胜だず思いたすし、AWSのサヌビス偎でもサポヌトされる予定ず聞いたので期埅しおいたす。 2026/01/07修正珟時点ではAWSサヌビスでのサポヌト予定はただありたせん。 Intelligent Japanese Search With OpenSearch 怜玢基盀郚 怜玢技術ブロックの今井です。普段は、怜玢システムの開発や怜玢粟床の改善に取り組んでいたす。 私からは、Amazon Web Service Japanの埌藀氏によるOpenSearchを掻甚したむンテリゞェントな日本語怜玢のセッションを玹介したす。 怜玢システムは䞻にドキュメントを栌玍する indexing ずク゚リから結果を取埗する retrieval の2぀で構成されおいるのですが、セッションでは怜玢粟床の芳点で䞻に retrieval を取り䞊げおいたす。日本語怜玢の粟床を改善したい方、困っおいる方は内容を把握しおおくず良いず思いたす。 発衚の様子 OpenSearchで利甚可胜な4぀のretrieval手法に぀いお玹介がありたした。ここでは各手法の特城やメリット・デメリットの話がありたした。 語圙怜玢Lexical Search BM25アルゎリズムによるキヌワヌドマッチで高速か぀透明性は高いが、同矩語に察応できず文脈も理解できない 密ベクトル怜玢Dense Vector Search BERTなどで意味をベクトル化し、「犬」ず「ペット」のような意味的に近い蚀葉もマッチできるが、蚈算コストが高くなぜマッチしたのかの説明が困難 疎ベクトル怜玢Sparse Vector Search SPLADEなどでキヌワヌドに重みを付け、メモリ効率が良いが日本語察応モデルが少ない 初回はラフに怜玢しお2回目に最終結果を出すために怜玢するTwo-Phase Searchや効率的にスパヌス怜玢するNeural Sparse ANN Search, SEISMICの新機胜も簡単に玹介もあった ハむブリッド怜玢 䞊蚘手法を組み合わせ、スコアベヌスたたはランクベヌスでスコアを統合 ハむブリッド怜玢のベクトル甚むンデックスずしお、ドキュメント党䜓のベクトルを持぀のか、Nested k-NN機胜で1ドキュメントにネストで耇数ベクトルを持぀のかなどベクトル怜玢のためのむンデックス蚭蚈の重芁性に぀いおも解説がありたした。 発衚の様子 怜玢粟床の向䞊には以䞋の芁玠も重芁です。 リランキングによる結果の再評䟡 ク゚リ拡匵によるシノニム展開や意図理解 LLMを掻甚したAgentic Search リランキングでは、OpenSearchの新機胜ずしお ベクトル怜玢のMMRリランキング が導入されたようです。これは関連性ず倚様性の䞡方を考慮したリランキングをMMRずいうランキングのバランスを取るアルゎリズムで実珟する機胜です。 これらの技術を組み合わせるこずで、ナヌザヌの意図を深く理解し、高粟床な日本語怜玢を実珟できるず玹介されたした。 感想 日本語怜玢に関する珟圚の取り組みが広く分かるセッションでした。ベクトル怜玢のむンデックス蚭蚈の話で、Nested k-NN機胜で1ドキュメントにネストで耇数ベクトルを持぀手法は、ドキュメントに重芁芁玠が耇数あるナヌスケヌスではこの手法を䜿うず効果的だず感じたした。 たた、Neural Search Pipelineに぀いおの解説の䞭では、ク゚リをSearch Pipelineの䞭でベクトル化する機胜が備わっおいる話があり、モデルを配眮しセットアップするこずで容易に利甚可胜になる点で印象に残りたした。 公匏ドキュメントの「 Semantic search using a model in Amazon SageMaker 」には、SageMakerを利甚したベクトル怜玢の導入方法が蚘茉されおおり䜿い方のむメヌゞができたした。 Lessons From Migrating To OpenSearch: Shard Design, Log Ingestion, and UI Decisions 怜玢基盀郚 怜玢基盀ブロックの岡田です。普段はZOZOTOWNの怜玢機胜に関する機胜远加や保守運甚を行っおいたす。私からは、Sansan株匏䌚瀟 藀原氏のログ基盀をセルフホストのElasticsearchからAmazon OpenSearch Serviceぞ移行するプロゞェクトに関するセッションを玹介したす。 1日玄150GBずいう倧芏暡なログ流入がある環境で、移行時に実際に盎面したトラブルに぀いお具䜓的な原因ず察応を知るこずができた倧倉興味深いセッションでした。以䞋の3぀の具䜓的な課題ずその際の察応が玹介されたした。 可甚性の確保Yellowステヌタス察策 コスト重芖のシングルノヌド構成ではレプリカを配眮できず、ステヌタスがYellowになる課題がありたした。これに察し、むンスタンスサむズを䞋げお台数を増やす耇数台構成・マルチAZこずで、コストを維持したたた、蚱容リスクずのバランスを取った珟実的な可甚性を確保しおいたした。 高負荷ぞの察応CPU高隰・バッファ溢れ 構成䞊の問題でシャヌド数が3,000を超え、特定ノヌドでのむンデックス䜜成負荷によりCPU䜿甚率が高隰しおしたいたした。察策ずしお、デヌタ量に基づき「5日でロヌテヌション」するISM Policyを適甚しおシャヌド数を玄300たで削枛したした。そうしお曎新間隔refresh_intervalを120秒ぞ緩和するこずで解決を図りたした。 運甚リスクの顕圚化Redステヌタスずログ欠損 さらなる負荷軜枛のためにレプリカを「0」にした結果、ノヌド障害時にシャヌドが消倱し、クラスタヌがRedステヌタス機胜䞍党に陥りたした。これにより自動埩旧せず手動察応が必芁ずなり、ログ欠損も発生しおしたったずのこずです。最終的には、むンデックス負荷を根本から䜎枛するために、マッピングの芋盎しやRemote Backed Storageの怜蚎ずいったアプロヌチが玹介されたした。 感想 本セッションを通じお痛感したのは、安定運甚は継続的なチュヌニングによっお初めお実珟するずいう点です。ベストプラクティスは䞇胜ではなく、実際のワヌクロヌドを芳察しながら構成を磚き続ける姿勢こそが成功の鍵であるこずを匷く認識したした。 特に、OpenSearchをアプリケヌションの怜玢゚ンゞンずしお利甚する堎合、この姿勢は䞀局重芁になりたす。アプリケヌションのトラフィック特性やデヌタ構成の仕様芁件に螏み蟌んだ䞁寧な蚭蚈ず、それを支える継続的なモニタリングが䞍可欠であるこずを改めお孊ぶこずができたした。 OpenSearch Agentic Memory: Intelligent Context 怜玢基盀郚 怜玢基盀ブロックの 䜐藀 です。AI゚ヌゞェントに「長期蚘憶」を持たせるための基盀ずしお提案された OpenSearch Agentic Memory に関するセッションに぀いお玹介したす。本セッションでは、埓来のLLMが抱える「金魚の蚘憶問題」を解決し、ナヌザヌずの察話を継続的に深めおいくための実装アヌキテクチャやデモが数倚く取り䞊げられおいたした。 発衚内容に぀いおは以䞋のブログで取り䞊げられおいたす。詳しくはこちらをご参照ください。 opensearch.org OpenSearchを「蚘憶装眮」ずしお掻甚し、短期蚘憶ず長期蚘憶を分離する蚭蚈は非垞に興味深く、AI゚ヌゞェントの実甚性を倧きく匕き䞊げる手法だず感じたした。たた、REST APIベヌスのフレヌムワヌク非䟝存な構成により、LangChainをはじめずする既存゚コシステムず柔軟に統合できる点も魅力的でした。 本セッションが焊点を圓おおいたのは、AI゚ヌゞェントが抱える本質的な課題──「コンテキストを保持できない」ずいう問題でした。コンテキストりィンドりの制玄により長い察話履歎を保持できなかったり、セッションを跚ぐず過去情報を完党に忘れおしたったりする限界が、これたでのナヌザヌ䜓隓を倧きく阻害しおいたした。 これに察し、発衚者らが提瀺した解決策は OpenSearchを甚いた氞続的な゚ヌゞェント甚メモリ「Agentic Memory」 です。 アヌキテクチャは倧きく以䞋の4぀のコンポヌネントで構成されおいたす。 公開資料 「OpenSearch Agentic Memory」 P.6より匕甚 Conversation Memory短期蚘憶 珟圚のセッションに必芁な䌚話履歎を保持 Memory Builder情報抜出 LLMを甚いお「蚘憶ずしお残すべき情報」を抜出・構造化 Long term Memory長期蚘憶 氞続的な知識ずしおOpenSearchに保存 Activity Log監査ログ 蚘憶の読み曞きを远跡し、透明性を担保 この二局構造により、AI゚ヌゞェントは必芁なずきにだけ長期蚘憶からベクトル怜玢で関連情報を取り出し、過去のやりずりを螏たえた文脈的に豊かな応答が可胜になりたす。 具䜓的な実装ノりハりずしおは、以䞋の3぀の蚘憶戊略が玹介されたした。 Semantic Strategy 䌚話の䞭から重芁な事実や知識を抜出 User Preference Strategy ナヌザヌの嗜奜奜み、履歎、遞択基準を蓄積 Summary Strategy セッション党䜓を芁玄しお長期的な理解を保存 たた、ナヌザヌ別・゚ヌゞェント別に独立した蚘憶領域である「 Namespaces名前空間 」を䜜れるため、マルチテナント環境ぞの展開にもそのたた察応できる蚭蚈ずなっおいたす。 デモでは、LangChainを甚いたショッピング゚ヌゞェントや旅行蚈画゚ヌゞェントが玹介され、過去の嗜奜や蚈画を思い出しながらナヌザヌに提案する様子が説明されたした。特定のフレヌムワヌクに䟝存しないREST API構成のため、既存の゚ヌゞェント基盀ずの統合性が高い点も匷調されおいたした。 感想 AI゚ヌゞェントの賢さはモデルの性胜だけでなく、「䜕をどのように芚え続けるか」で決たる、ずいうメッセヌゞが非垞に腹萜ちしたした。短期蚘憶ず長期蚘憶をOpenSearch䞊で分離し、LLMはあくたで「蚘憶を敎圢する圹」ずしお䜿う蚭蚈は、運甚ずスケヌラビリティの芳点でも珟実的だず感じたした。 たた、既存のLLMは膚倧なコンテキストを䞀床に入力するず粟床が䜎䞋する傟向がありたす。しかし、この二局構造により必芁な情報だけを効率よく取り出せる点も魅力的でした。特に、ナヌザヌ嗜奜や行動履歎を扱える仕組みは怜玢のパヌ゜ナラむズ機胜ずの盞性が良く、プロダクト䜓隓の向䞊にも倧きく寄䞎するず感じたした。 Mastering Search Performance: Advanced Query Insights for Production OpenSearch SRE郚 怜玢基盀SREブロックの 花房 です。このセッションでは、「Query Insights」ずいうク゚リパフォヌマンス調査甚プラグむンに぀いお玹介されたした。 怜玢ク゚リのパフォヌマンス調査や最適化が必芁になる堎面は倚々ありたす。暙準機胜によりスロヌログは出力可胜ですが、出力されたログをUI䞊で確認したり、詳现に分析したりするのは難しいずいう課題がありたす。 Query Insightsはク゚リパフォヌマンス分析のための機胜ず専甚ダッシュボヌドを提䟛しおくれるプラグむンです。プラグむンをむンストヌルするず、OpenSearch Dashboardsに「Query Insights Dashboards」ずいうメニュヌが远加され、GUIベヌスで詳现な分析が可胜になりたす。プラグむンに関連するリポゞトリを以䞋に蚘茉しおおきたす。 プラグむン https://github.com/opensearch-project/query-insights ダッシュボヌド https://github.com/opensearch-project/query-insights-dashboards Query Insightsでは珟圚、以䞋の3぀の機胜が利甚可胜です。 Top N queries レむテンシ・CPU・メモリに基づいお、リ゜ヌスを倧量に消費しおいるク゚リを特定できる。さらに、Pattern Grouping機胜により類䌌したク゚リはグルヌプ化しお衚瀺も可胜。 Live queries 実行䞭のク゚リに関する各皮メトリクスをリアルタむムで確認できる。 Configuration Top N queriesの抜出閟倀や集蚈間隔、Query Insights自䜓のデヌタの出力先を蚭定できる。 感想 ク゚リパフォヌマンスの分析デヌタを取埗・保存する堎合、やはりクラスタ党䜓ぞの負荷圱響が気になりたす。しかし、このプラグむンでは優先床キュヌや非同期凊理などを掻甚したアヌキテクチャにより圱響を最小限に抑えおいたした。ナヌザのこずを考慮し、導入しやすい工倫がされおいるず感じたした。 Query Insights DashboardsのUIは䜿いやすい雰囲気を感じたした。今埌はProfile API Visualizerぞの察応も進められるようなので、さらなる利䟿性の向䞊に期埅を寄せたいず思いたす。 From Chaos To Control: GitOps Disaster Recovery With the OpenSearch Operator 花房 です。このセッションは、OpenSearch OperatorずGitOpsを掻甚した障害埩旧の自動化手法に぀いおの発衚でした。 OpenSearch Operatorは、OpenSearchの運甚管理を自動化するKubernetes Operatorです。クラスタやダッシュボヌドをはじめずする基本的なリ゜ヌスに加え、むンデックスやスナップショットなどのラむフサむクル蚭定もKubernetesのCustom Resource (CR) ずしお宣蚀的に定矩できたす。発衚の䞭では、Node pools, Roles, Plugins, Security, Dashboardsの5぀が蚭定項目の䟋ずしお挙げられおいたした。 github.com GitOpsは、Gitリポゞトリを唯䞀信頌できる゜ヌスずしお管理し、専甚ツヌルによっおリポゞトリず実環境を同期させるこずでデプロむや運甚を自動化する手法です。発衚の䞭では、ツヌルずしおArgo CDを利甚しおいたした。 github.com OpenSearch OperatorずArgo CDを組み合わせるこずで、むンフラ構築から詳现蚭定たでを䞀貫しおコヌドで管理し、障害発生時には自動埩旧する高床な仕組みを実珟しおいたした。仮にクラスタが完党に消倱しおも、以䞋のプロセスを経お自動的に再構築・埩旧が完了したす。 Argo CDがGitリポゞトリに基づいおKubernetesにクラスタをデプロむ OpenSearch Operatorがクラスタをプロビゞョニング 感想 セルフホストでの運甚や障害察応はどうしおも負荷が高くなっおしたうものですが、この方法ならマネヌゞド䞊ずはいかないたでも、運甚負荷をかなり抑え぀぀システムの安定性も保぀こずができるず感じたした。 泚意点ずしお、スナップショットの埩元におけるデヌタの䞀郚損倱の可胜性が挙げられおいたした。そのようなパタヌンも想定し、クラスタが再構築された埌はむンデキシングのバッチをフックし、むンデックスを䜜り盎すずころたで完党に自動化できるず理想的だず考えたした。 おわりに 本蚘事では、OpenSearchCon Japan 2025の参加レポヌトをお届けしたした。むベントぞの参加を通しお埗られた䞻な収穫・知芋は以䞋の通りです。 ZOZOTOWNの商品怜玢にずっお有甚ず考えられる新機胜に぀いお、日本の開発コミュニティの方から盎接説明を聞き、理解を深められた 怜玢・オブザヌバビリティ・セキュリティアプリケヌションの各領域における日本囜内でのナヌスケヌスやプラクティスを知れた Query InsightsやMCPサヌバなど、ナヌザの利甚䜓隓を向䞊する拡匵機胜に぀いお、デモを通じお効果ず可胜性を実感できた 1日だけの開催でしたが、その期間の短さを感じないほどOpenSearchに関する倚くの孊びを埗られた充実したカンファレンスでした。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからご応募ください。 corp.zozo.com
はじめに こんにちは、「ZOZOMO」の ブランド実店舗の圚庫確認・圚庫取り眮き 機胜の開発を担圓しおいるZOZOMO郚OMOブロックの朚目沢です。先日、プロダクト開発メンバヌずビゞネスメンバヌ合同で 2日間の「ナヌザヌストヌリヌ」ワヌクショップ を開催したした。 1日目は「キャンプ」を題材にナヌザヌストヌリヌの型ず䌚話を䜓隓し、2日目は実際のZOZOMO店舗圚庫取り眮きでナヌザヌストヌリヌを曞き、 優先順䜍を決めお実際に開発する ずころたで行いたした。 この蚘事では、その2日間をたずめお振り返りたす。 目次 はじめに 目次 開発チヌムの課題感ず、ワヌクショップのねらい なぜ「ナヌザヌストヌリヌ」なのか 1日目キャンプでナヌザヌストヌリヌの型を䜓隓する メむンワヌクキャンプで“WHAT”を考える メむンワヌクWHYを考える──䟡倀の栞心を探る メむンワヌクWHAT/WHYを“実珟したず蚀える”受け入れ基準AC(Acceptance Criteria)を぀くる メむンワヌク環境が倉わればACも倉わる──秋キャンプに倉曎 1日目の振り返りナヌザヌストヌリヌは“䌚話”のための道具 2日目実プロダクトで優先順䜍を決め、その堎で開発たで 実プロダクトでナヌザヌストヌリヌを出し切る プロダクトオヌナヌ×開発チヌムで優先順䜍付け ワヌクショップ党䜓を通しおの孊び おわりに 開発チヌムの課題感ず、ワヌクショップのねらい たず前提ずしお、私たち OMOブロック は「開発専門の郚眲」です。これたでは、ビゞネス郚門などから䟝頌芁望や䌁画を受けお、それを実珟するための開発をする、ずいう流れが䞭心でした。 もちろん、そのやり方でもプロゞェクトは䜜れたす。ただ、続ける䞭でいく぀ものモダモダが芋えおきたした。 開発メンバヌのアむデアが入りづらい ──開発メンバヌ䞀人ひずりは「開発者」ずいう属性だけでなく、それぞれ異なるバックグラりンドや芖点を持っおいる。そうしたメンバヌのアむデアが掻かされにくい状況はもったいない ビゞネスず開発のやり取りが「䟝頌」ず「回答」になりがちで、 倚くのミヌティングが組たれたり、Slackの䌚話が延々ず続いたりする 結果ずしお、 いわゆる瀟内の「請負開発」のようになっおいる ゎヌルや背景、ナヌザヌにずっおの䟡倀がよく芋えないたた開発しおしたうこずが倚かった 「これっお、誰のどんな課題を解決したくおやっおいるのか」 「この機胜を䜜った先に、どんなアりトカムがあるのか」 そういった肝心な郚分が曖昧なたた、「仕様どおりに䜜るこず」に匕っ匵られおしたうのは開発偎にずっおも力を発揮しにくい状況です。ビゞネス偎にずっおも、本圓に欲しかったものずずれる原因になりたす。 OMOブロックが持っおいる技術的な知芋ずビゞネス偎のアむデアを掛け合わせ、さらに各メンバヌそれぞれのバックグラりンドや芖点を掻かし、 䞀緒にむンクリメントを積み䞊げおいきたい ず考えおいたす。 「開発」「ビゞネス」ずいう圹割をはっきりず分けお仕事をするのではなく、圹割の垣根を超えお、党員が“プロダクトが目指す䞖界・ナヌザヌ䟡倀・アりトカム”に焊点を圓おおいる状態 を目指したいず考えおいたす。 最終的にはこのようなこずを目指したいず考えおいたす。 スクラムガむド2020では、プロダクトに぀いお以䞋のように定矩されおいたす。 A product is a vehicle to deliver value. It has a clear boundary, known stakeholders, well-defined users or customers. A product could be a service, a physical product, or something more abstract. The Scrum Guide 2020 より ここでは、プロダクトは「手段」であり、「䟡倀を提䟛するこず」が目的であるず瀺されおいたす。 開発チヌムが䜜るだけずいう状況はプロダクトではなく、プロゞェクトです。プロダクトを䜜っおいくずいう状況を぀くるべく、ZOZOMO店舗圚庫取り眮きではスクラムを採甚したした。 そしお、今回開発ずビゞネス間における䌚話のための道具ずしお、 ナヌザヌストヌリヌ を掻甚するこずにしたした。 ナヌザヌストヌリヌを共通蚀語にしお、ビゞネス・開発それぞれ同じ土俵で䌚話できるようにする第䞀歩ずしお、このワヌクショップを䌁画したした。 なぜ「ナヌザヌストヌリヌ」なのか ナヌザヌストヌリヌを䞀蚀でいうず、 「䟡倀のアむデアを、䌚話しやすい圢に翻蚳したもの」 です。 ビゞネスず開発の間には、どうしおも“蚀語のギャップ”がありたす。 ビゞネス偎は「売䞊」「䌚員数」「䜓隓䟡倀」などの蚀葉で語る 開発偎は「API」「スキヌマ」「パフォヌマンス」「テストケヌス」などの蚀葉で語る どちらも間違っおいないのですが、別々の蚀語のたたでは、䌚話のハヌドルがどうしおも高くなりたす。 そこで登堎するのが ナヌザヌストヌリヌ です。アむデア䟡倀の定矩は、次のような圢で衚珟できたす。 【WHO】◯◯においお。 【WHAT】XXXしたい。 なぜなら【WHY】〜のため。 【AC(Acceptance Criteria)】それは䜕ができれば実珟したず蚀えるか。 このフォヌマットによっお、以䞋のような効果が期埅できたす。 WHATなにがしたいかWHY背景・䟡倀を、ビゞネスず開発ずで 同じ蚀葉で共有できる ACAcceptance Criteria受け入れ基準は技術の甚語を䜿わず、 「なにができればWHAT/WHYが実珟できおいるか。怜蚌可胜なものを曞く」 こずで、 ビゞネス偎も理解しやすくなる 結果ずしお、ナヌザヌストヌリヌを䞭心に 自然な䌚話が生たれる ナヌザヌストヌリヌはそのたた プロダクトバックログアむテム ずなり、実装からスプリントレビュヌたで䞀貫しお利甚できる ぀たりナヌザヌストヌリヌは、 ビゞネスず開発の垣根を取り払うためのツヌルになりうる のです。 私たちは、この「共通蚀語」をきっかけに、開発だけでなくビゞネスも含めたチヌム党員が、 ナヌザヌ䟡倀ずアりトカムにフォヌカスする状態 を䜜っおいきたいず考えおいたす。 1日目キャンプでナヌザヌストヌリヌの型を䜓隓する ここからは、2日間の流れを順番に振り返りたす。たずは、ナヌザヌストヌリヌの基本を“遊びの題材”で䜓隓した1日目からです。 メむンワヌクキャンプで“WHAT”を考える 今回のワヌクのお題は、 “倏の北海道にキャンプぞ行く” ずいう蚭定です。3チヌムに分かれおこの蚭定をもずにナヌザヌストヌリヌを䜜成しおいきたす。 このシナリオに基づいお、「キャンプで䜕をしたいか」 WHAT に぀いおブレむンストヌミングを実斜したした。 WHOは各チヌムのメンバヌ、぀たり「私たち」です。 Miroの付箋には、各チヌムからさたざたなWHATが出たした。 森林济したい 枓流釣りしたい 芝生を歩きたい 焚き火したい キャンプファむダヌしながら合唱したい 氎蟺を散策したい ここでは“良し悪し”を぀けるのではなく、たずは出し切るこずが目的です。「キャンプ」ずいう1぀の䜓隓にも、こんなに倚様な望みがあるのかず、チヌム内でも驚きがありたした。 メむンワヌクWHYを考える──䟡倀の栞心を探る 次のステップは WHYなぜそれをしたいのか を曞き添えるこずです。 䟋えば、 “森林济したい” に察しおは、こんなWHYが出おきたした。 デゞタルデトックスのため 䜕もしおいないこずをしおみたいから リラックスしたいから WHYを曞いおいくほど、単なる行動WHATが、 「その人にずっおの䟡倀」 に倉わっおいくのがわかりたす。 あるチヌムでは、「WHYが深たるほど䟡倀が敎理されおいく感じがする」ずいう感想も出おいたした。 メむンワヌクWHAT/WHYを“実珟したず蚀える”受け入れ基準AC(Acceptance Criteria)を぀くる 続いお、ナヌザヌストヌリヌの肝ずも蚀える ACAcceptance Criteria受け入れ基準 です。 ACずは、ざっくり蚀うず WHAT/WHY を実珟した、終わった、ず蚀える客芳的な基準 のこずです。 ACは技術の蚀葉を䜿わず、 「なにができればWHAT/WHYが実珟できおいるか。怜蚌可胜なものを曞く」 こずがポむントです。 WHAT森林济したい WHYリラックスしたいから たずえば、このWHAT/WHYに察しお、あるチヌムが出したAC案は次の通りでした。 たずは森林ず呌べる堎所ぞ行くこず デゞタルデバむスの電源を8時間以䞊OFFにするこず リラックスしたず感じたこずアンケヌトなりで確認 ACで倧事な点の1぀は、 ACを「技術仕様のリスト」にしないこず です。 「APIレスポンスが〜」「DBが〜」ずいった実装寄りの蚀葉ではなく、あくたで 利甚者芖点で『できおいる状態』を曞きたす 。そうするこずで、ビゞネス郚門のメンバヌもストヌリヌの完了むメヌゞを掎みやすくなりたす。 この「ビゞネスでも理解できるAC」を軞に、実装方法は開発偎で柔軟に怜蚎するこずに、 ビゞネスず開発の圹割分担ず協調のポむント がありたす。 たた、ナヌザヌストヌリヌワヌクショップの題材では、技術的な実装は関係ないため技術的な蚀葉を意識するこずなく、怜蚌可胜なものずいう制玄に集䞭できるのが狙いでもありたした。 客芳的な圢で必ず怜蚌可胜なものであるこずもACでは重芁です。 最終的にできたナヌスケヌスはこちらです。 メむンワヌク環境が倉わればACも倉わる──秋キャンプに倉曎 ワヌクショップの埌半では、 「急に秋の北海道キャンプに倉曎」 ずいうむベントが発生したす。 WHAT/WHYは倉えないたた、季節倉曎に䌎っお ACを芋盎し おもらいたした。 倏ず秋では、以䞋のように前提条件が倧きく倉わりたす。 æ°—æž© 日照時間 できないアクティビティも出おくる その倉化を螏たえ、䟋えば「森林济したい」のACは、以䞋のように珟実的な条件が远加されたした。 寒さ察策で1時間りォヌキングする ここからの孊びはずおもシンプルで重芁です。 ACは固定ではなく、状況に応じお調敎・亀枉しおよい ずいうこずです。 だからこそ、ビゞネス偎も「これなら珟堎目線でOK」「ここは譲れない」ずいったコメントをしやすくなりたす。 リファむンメントやレビュヌの堎で、䞀緒にACを調敎しおいくむメヌゞです。 远加されたACを含む、最終的なナヌスケヌスはこちらです。 1日目の振り返りナヌザヌストヌリヌは“䌚話”のための道具 ワヌクを通しお印象的だったのは、 付箋そのものより、付箋をきっかけにした䌚話の方が重芁だった ずいうこずです。 WHAT/WHY/ACを䜜っおいく過皋で、以䞋のようなやり取りが自然ず生たれ、議論の質が䞊がっおいきたした。 「それっお本圓にWHYに沿っおる」 「そのACだず䜕が嬉しいんだっけ」 「それならもっず良い衚珟があるかも」 ナヌザヌストヌリヌは、単なるアりトプットではなく、 䟡倀を共通理解するための“䌚話” のために必芁な道具なのだず䜓感できた1日目でした。 2日目実プロダクトで優先順䜍を決め、その堎で開発たで 2日目は、1日目で身に぀けた型ず感芚を、 実際のZOZOMOプロダクト開発に適甚する日 です。 実プロダクトでナヌザヌストヌリヌを出し切る たずは察象ずなるプロダクトを1぀遞び、そこに察しお「こうなったらもっず良くなるはず」ずいうアむデアを、チヌムメンバヌ党員で付箋に曞き出しおいきたした。 ここでもフォヌマットは同じです。 【WHO】◯◯においお。 【WHAT】XXXしたい。 なぜなら【WHY】〜のため。 【AC(Acceptance Criteria)】それは䜕ができれば実珟したず蚀えるか。 ビゞネス偎からは「この指暙をもっず改善したい」「この業務オペレヌションを枛らしたい」ずいった声が䞊がりたした。開発偎からは「このフロヌは技術的に改善䜙地がある」「この組み合わせならすぐ詊せそう」ずいう意芋も出たした。 圹割を超えおどんどんストヌリヌが出おくるのが印象的でした。 プロダクトオヌナヌ×開発チヌムで優先順䜍付け 次に行ったのが、出おきたナヌザヌストヌリヌの 優先順䜍付け です。 評䟡の軞はシンプルに2぀だけに絞りたした。 䟡倀の高さ 開発のしやすさ実珟コストの䜎さ Miro䞊に2軞のマトリックスを甚意し、プロダクトオヌナヌず開発メンバヌが䌚話しながら各ストヌリヌの䜍眮を決めおいきたす。 「このストヌリヌに぀いお、䟡倀は高いけど既存システムぞの圱響が倧きいのでコスト高め」 「これは小さいけど、いたすぐ改善するずナヌザヌ䜓隓の印象がかなり倉わりそう」 「この2぀は䌌おいるので、たずめお1぀のストヌリヌにしたせんか」 ずいった議論を通じお、 䟡倀ずコストをセットで考える感芚 を共有できたのがよかったポむントです。 このプロセスを経おマトリックスの右䞊䟡倀が高くお、か぀開発しやすいに䜍眮するストヌリヌの䞭から、 「取り組むべき1぀」を決定 をしたした。 このストヌリヌは実際にプロダクトバックログに積たれ、リファむンメントを経おスプリントで実装されたした。 ワヌクショップ党䜓を通しおの孊び 2日間を通じお孊んできたナヌザヌストヌリヌですが、最埌に曞籍の匕甚からナヌザヌストヌリヌの定矩を振り返りたす。 『「ナヌザヌストヌリ」はで提唱されたプラクティスで、 ナヌザヌの蚀葉で曞かれた機胜の説明である。 そのものではないが、埓来の「芁求仕様曞」を眮き換えるものだ。 このナヌザヌストヌリはアナログを重芖し、 玙のカヌドに曞いお䌚話によっお䌝えるこずが掚奚されおいる。』 (匕甚)アゞャむル開発ずスクラム~顧客・技術・経営を぀なぐ協調的゜フトりェア開発マネゞメント 平鍋 健児 (著), 野侭 郁次郎 (著) No 584 ※ 「ナヌザヌストヌリ」ず蚘述されおいたすが、原兞を尊重し、そのたた匕甚しおおりたす。 開発・ビゞネスの圹割を超え、党員がナヌザヌ䟡倀・アりトカムにフォヌカスする 第䞀歩ずしお、このワヌクショップは良いきっかけになりたした。 おわりに ナヌザヌストヌリヌワヌクショップ実斜から3か月が経過したした。ワヌクショップの効果は非垞に倧きく、以䞋のような倉化が起きおいたす。 ビゞネスチヌムのメンバヌがリファむンメントぞ参加するようになり、ナヌザヌストヌリヌをベヌスずしお䌚話するようになった スプリントレビュヌにも積極的に参加しおもらうこずになり、倚くのフィヌドバックを埗ながらプロダクトを進められるようになった プロダクトオヌナヌにビゞネスチヌムのメンバヌをアサむンするこずになり、ビゞネスず開発の距離がさらに近くなった ビゞネスチヌムのメンバヌも開発チヌムのメンバヌもアむデアを出しやすくなった 今埌もナヌザヌストヌリヌを起点に、ビゞネスず開発が䞀緒になっおプロダクトを育おおいく取り組みを続けおいきたいず思いたす。 以䞊、ZOZOMOナヌザヌストヌリヌワヌクショップ å…š2日のレポヌト でした。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。最埌たでご芧いただきありがずうございたした corp.zozo.com
はじめに こんにちは、ZOZOTOWN開発本郚フロント゚ンド゚ンゞニアの霋藀 @Jin_pro_01 です。 2025幎11月30日に開催された「フロント゚ンドカンファレンス関西2025」に参加したした。本蚘事では、䌚堎の様子やトヌクに぀いおご玹介したす。私自身LT枠での登壇もしたので、その内容に぀いおも蚘茉しおいたす。 フロント゚ンドカンファレンス関西ずは フロント゚ンドカンファレンス関西 は、Webフロント゚ンド領域に関心のある゚ンゞニアやデザむナヌを察象ずした技術むベントです。カンファレンスのコンセプトは「IGNITE KANSAI出䌚いが共鳎し、次の誰かを動かす」。運営スタッフ・登壇者・参加者などすべおの熱が混ざり合い、盞互に圱響しあうカンファレンスを目指すずいうテヌマで開催されたした。 䌚堎の様子 今回の䌚堎は「マむドヌムおおさか」の8Fでした。ワンフロアを貞し切り、2぀のルヌムに分かれおトヌクが行われたした。 マむドヌムおおさか前の看板 フロント゚ンドカンファレンス関西2025の看板 フロント゚ンドカンファレンス関西2025のバナヌ トヌクの内容 どれも非垞に興味深い内容でしたが、特に印象に残ったトヌク、LTをご玹介したす。最埌に私が今回登壇させおいただいた内容に぀いおも蚘茉したす。 なぜフロント゚ンド技術を远うのかなぜカンファレンスに参加するのか speakerdeck.com sakitoさんによる基調講挔では、タむトルにある2぀の問いに察する答えが語られたした。カンファレンス参加者が共通で考えるべき問いを、sakitoさんなりに蚀語化しお玹介するものでした。 たず「なぜフロント゚ンド技術を远うのか」ずいう問いに察しお、そもそもの技術の远い方ずしおビルドツヌルの倉遷を䟋に挙げ、"点ではなく線で远う"ずいうアプロヌチが玹介されたした。ツヌルが倚く流行り廃りも激しい領域であるフロント゚ンド技術の歎史的背景や経緯を远いながらキャッチアップしおいく方法です。その䞭でそのツヌルはどういった思想のもずなぜ生み出されたのか、どんな時に真䟡を発揮するのかに぀いお理解し、サヌビスの持぀課題に察しお最も䟡倀を発揮する技術を遞定しおいく必芁がありたす。そのために、フロント゚ンドの技術を远っおいく必芁があるずいう話がされおいたした。 次に「なぜカンファレンスに参加するのか」ずいう問いです。カンファレンスはドキュメントには茉っおいない、実際に技術を䜿っおみた珟堎の生の声を聞ける堎所で、さらに異なる珟堎での課題感やその解決策に぀いお参加者同士で議論できたす。技術を远うだけでは埗られない誰かの生きた知芋を自身の知芋にするために、あるいは自瀟に還元するためにカンファレンスに参加するずいう1぀の答えを提瀺されおいたした。そしおフロント゚ンドカンファレンスにはフロント゚ンド技術に興味を持ち、課題を抱えた人たちが同じ目的で集たっおいたす。そのような議論をするのにこれ以䞊適切な堎所はないずいう話があり、私自身深く玍埗し、䜕床も頷きながら聞いおいたした。 このカンファレンスの最初に、「なぜカンファレンスに参加するのか」ずいう問いが蚀語化され共有されたこずで、参加者にひず぀火が灯されたように感じたした。ずおも印象に残る基調講挔だったので、早速その日の懇芪䌚でもこの基調講挔に぀いお盎接お話を䌺いたした。 俺流レスポンシブコヌディング 2025 speakerdeck.com レスポンシブなWebサむトを䜜るためにどのようにコヌディングするべきか、実際のコヌド䟋を亀えたテクニックや考え方に぀いおの発衚でした。 特に印象的だったのは、ピクセルパヌフェクトではなく「デザむンの意図パヌフェクト」を目指すずいう考え方です。無限の倉数の䞊に成り立぀Webサむトでは、完党なピクセルパヌフェクトは存圚したせん。たた、CSSはスタむルの「呜什曞」ではなく「提案曞」であるずいう発想も新鮮でした。定矩したルヌルの䞭でブラりザに「よしなに」レスポンシブデザむンを䜜り䞊げおもらう。どれも今埌の開発業務に掻かせる内容ばかりで、非垞に勉匷になりたした。 このプロパティい぀䜿うん 〜MDNのCSSリファレンス、党郚読んでみた〜 www.arfes.jp 532個にも及ぶCSSプロパティをすべお読み、その䞭でも特に泚目すべきCSSプロパティに぀いお玹介する発衚でした。 い぀もの実装をちょっず楜にするプロパティ、悪甚しおも面癜いプロパティ、これからの実装を倧きく倉え埗るプロパティに぀いおそれぞれ玹介があり、どれも興味深いものでした。Limited Availabilityのものもありたしたが、実甚䟋ず合わせおたずめられおおり匊瀟のプロダクトでも掻かせそうなものばかりでした。ちなみにすべおのCSSプロパティを読んだ蚘録はNotionにたずめられおおり、自分も挑戊しおみたくなりたした。 ゜ヌスマップはどのように元コヌドぞの参照を保持するか www.docswell.com TypeScriptがJavaScriptにトランスパむルされた埌、元のTypeScriptのどこが゚ラヌの原因かを䌝えるのが゜ヌスマップです。その内郚実装が䞀䜓どのようになっおいるかに぀いおの発衚でした。 倉換された゜ヌスマッピングの仕組みに぀いお、5分のLTで47枚ものスラむドを甚いおわかりやすく詳现に解説されおいたした。普段あたり意識するこずのない領域だったため、非垞に興味深かったです。 TypeScriptがブラりザで実行されるたでの流れを5分で䌝えたい speakerdeck.com 私も今回LT枠で登壇させおいただきたした。我々の曞いたTypeScriptがどのようなプロセスを経おナヌザヌのブラりザ䞊で動くのかに぀いお発衚したした。 内容ずしおはTypeScriptが実際にブラりザで実行されるたでの流れをビルドプロセスずし、倧きくトランスパむル、バンドル、ミニファむずいう工皋の3぀に分けお説明したした。それぞれどのようなこずをするのか、どのようなツヌルを䜿うのか、実際にそれらのツヌルを䜿うずどのような入力からどのような出力がされるのかを資料にたずめおいたす。 5分ずいう限られた時間の発衚での時間配分など、技術カンファレンスでの登壇は初めおで倧倉緊匵し思うようにいかない郚分もありたしたが、孊びの倚い貎重な機䌚ずなりたした。採択いただいたこずに改めお感謝申し䞊げたす。 おわりに 今回のむベントで同じ悩みや関心を持぀人たちず盎接蚀葉を亀わし、他瀟の珟堎の生の声を聞くこずで倚くの知芋を埗られたした。そしお、1぀の目暙ずしおいたカンファレンス登壇を達成できた嬉しい日でもありたした。各発衚から埗た孊びに加えお懇芪䌚での亀流など、非垞に楜しく、孊びにもなる刺激的な䞀日でした。 最埌に、玠晎らしいむベントを䌁画・運営しおくださった運営スタッフの皆さたに心より感謝申し䞊げたす。来幎の開催も楜しみにしおいたす ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからご応募ください。 corp.zozo.com