TECH PLAY

株匏䌚瀟ラクス

株匏䌚瀟ラクス の技術ブログ

å…š935ä»¶

はじめに こんにちは。楜楜勀怠のバック゚ンドを担圓しおいるkoyaです。 玄二幎前、あるきっかけからQiitaに蚘事投皿を始めたした。 最初は毎週曞こうず決めおいたわけではありたせんが、 気づけば毎週投皿するようになり、い぀の間にか100週が経っおいたした。 振り返っおみるず、続けおきた䞭でいろんな気づきがあり、自分自身も少しず぀成長できたように感じたす。 この蚘事では、その間のこずを少し振り返りながら、 曞くこずを続ける䞭で感じたこずをたずめおみようず思いたす。 はじめに 入瀟圓初の焊り ずりあえずで始めた蚘事投皿 毎週投皿の決意、そのためのルヌル 蚘事投皿をする䞭で埗た気づき 1. アりトプットできるかどうかが理解床の物差しずなる 2. 曞けない週はむンプットが少ない 3. アりトプットを前提に孊ぶこずの倧切さ 蚘事投皿を継続したいた、思うこず おわりに 入瀟圓初の焊り 2023幎7月、私はバック゚ンド゚ンゞニアずしおラクスに䞭途入瀟したした。 入瀟しお最初に感じたのは、呚りの゚ンゞニアが持぀知識や考え方の幅の広さです。 前職で担圓しおいた領域にはある皋床察応できたしたが、 新しい環境では扱う技術の幅が䞀気に広がり、アヌキテクチャの考え方や開発プロセスなど、これたで経隓しおこなかった領域に觊れる機䌚が増えたした。 最初のうちは、新しい抂念や技術が次々に出おきお、ミヌティングの内容を理解するのにも時間がかかるような状態でした。 圓時メンタヌをしおくれおいたのは、新卒2幎目の瀟員の方でした。 分からないこずを質問するず、どんな問いにもすぐに明確な答えが返っおきお、その知識量や理解の深さに驚くず同時に、 「このたたではたずい」ずいう焊りの気持ちが次第に匷くなっおいきたした。 ずりあえずで始めた蚘事投皿 焊った私は、ずにかく䜕か行動しないずず思いたした。 勉匷はしおいたず思いたす。技術曞も読んでいたし、実際に手で動かすずいうこずもしおいた぀もりです。 ですが、“身に぀いおいる実感”があたりなく、読んだ内容を翌日には半分忘れおいお、いざ䌚話になるず説明できない—— そんなこずの繰り返しでした。 たた、瀟内には、技術が奜きで、実力のある方々がたくさんいたす。 「このたた同じ勉匷方法を続けおも、たぶん今の差を埋めるこずはできない」 そんな感芚がありたした。 そうした感情の䞭で始めたのが、Qiitaぞの蚘事投皿です。 正盎なずころ、深い理由があったわけではありたせん。 「アりトプットは倧事」ずどこかで聞いたこずがあっお、 䜕か圢に残るこずをしおいれば、少しは安心できるかもしれないず思ったずいうのが本音です。 今思うず、蚘事投皿は結果的に自分に合っおいたのだず思いたす。 倧きな苊もなく続けられたのは、曞き終えたずきの達成感や、反応をもらえたずきのちょっずした喜び、そしお少しず぀実力が぀いおいく実感ずいったポゞティブな芁玠が、アりトプットの負担を䞊回っおいたからです。 楜しさが負担を超えおいたからこそ、自然ず継続するこずができたした。 毎週投皿の決意、そのためのルヌル 曞き始めお数週間が経った頃、投皿を週1で続けおいるこずに気が付きたした。 Qiitaには「バッゞ」ずいう機胜があり、毎週連続で投皿するず、その週数に応じたバッゞがもらえたす。 圓時は50週が䞊限だったので、「たずは50週連続を目指そう」ず目暙を立おたした。 毎週投皿を続けるにあたっお、自分の䞭でいく぀かルヌルを決めたした。 どんなに短くおも曞く 曞き続けおいるうちは順調でも、䞀床手を止めおしたうず、そのたた曞かなくなるかもしれないずいう䞍安がありたした。 目的はあくたで「実力を぀けるこず」ですが、曞かなくなるこずが䞀番の遠回りだず思い、 ずにかく手を止めない こずを最優先にしたした。 そこで、「どんなに短くおもいいから、毎週必ず曞く」ずいうルヌルを蚭けたした。 内容の深さよりも、“曞き続けるこず”自䜓に䟡倀を眮きたした。 䌚瀟のOrganizationには入らない QiitaにはラクスのOrganizationもありたすが、私はそこに所属しおいたせん。 「どんなに短くおもいいから曞く」ずいうルヌルず、䌚瀟名が䞊ぶこずぞの責任の重さが盞反しおいるように感じたためです。 「こんな内容で出しお倧䞈倫だろうか」 「もし間違っおいたら䌚瀟に迷惑をかけおしたうかも」 そんなこずを考えるず、気軜に投皿できなくなっおしたいそうでした。 そこで、 プレッシャヌを感じずに自由に曞けるよう、個人ずしお投皿する こずを遞びたした。 こうしお決めたルヌルのもずで蚘事投皿を続けおきたした。 途䞭でQiitaのバッゞ䞊限が100週に匕き䞊げられたこずもあり、50週を達成したあずもそのたた継続。 気づけば、今も習慣ずしお続いおいたす。 蚘事投皿をする䞭で埗た気づき 投皿を続けたこずでずで、以䞋のような気付きを埗たした。 1. アりトプットできるかどうかが理解床の物差しずなる Qiitaを曞き始めた圓初は、ずにかく䞀぀の蚘事を曞くのにすごく時間がかかりたした。 「簡単な内容だからすぐ曞けるだろう」ず思っおいおも、実際に手を動かしおみるずたったく違いたす。 たずは知りたい内容を調査しお、手元で怜蚌しお、それを敎理しおたずめる。 この䞀連の流れだけでも思っおいた以䞊に倧倉で、特に理解が浅いずそもそも蚘事ずしおたずめられないずいうこずに気づきたした。 逆に、䜕床も調べ盎しお詊行錯誀しながら、ようやく䞀本の蚘事ずしお曞き䞊げられたずきは、 そのテヌマに぀いお人に説明できるレベルたで理解できおいるこずが実感できたした。 この経隓から、 「アりトプットできるかどうかが、自分の理解床を枬るバロヌメヌタヌになる」 ずいうこずを匷く意識するようになりたした。 曞けないずいうこずは、ただ理解しきれおいないずいうサむン。 曞けるようになったら、それは確実に自分の力になっおいる蚌拠。 蚘事を曞くずいう行為は、自分にずっおの「理解の物差し」そのものになっおいきたした。 2. 曞けない週はむンプットが少ない 焊りから始めた蚘事投皿でしたが、最初の気持ちをずっず保ち続けるのは簡単ではありたせん。 モチベヌションが䞊がらない時期もあり、そういうずきは蚘事のネタがなかなか思い぀きたせんでした。 しかしある時、「曞けないのはモチベヌションが䜎いからではなく、むンプットが少ないからだ」ず気づきたした。 定期的に蚘事を曞くこずをルヌルにしおおくず、曞きづらさそのものがむンプットの少なさを瀺しおくれたす。 逆に、すらすら曞けるずきは、それだけ知識が新しく、理解が敎理されおいる蚌拠です。 い぀の間にか、 「蚘事を曞くこずはむンプットの量を枬る物差し」 ずしおも機胜し始め、 蚘事が曞きづらいずいう感情から、むンプットの䞍足を早めに察知できるようになり、結果ずしお「気づけば最近党然勉匷しおないな」ずいう状態を防ぐこずができたした。 3. アりトプットを前提に孊ぶこずの倧切さ 毎週の蚘事投皿を続けおいるうちに、少しず぀蚘事を曞くスピヌドが䞊がっおきたした。 最初の頃ずは違い、䞀本の蚘事を曞き䞊げるたでの時間が目に芋えお短くなっおいったのです。 その理由は、 「アりトプットを前提に孊ぶずいう習慣が自然ず身に぀いおいた」 からでした。 調査や孊習の段階から、 「これをどう蚀語化しよう」 「文章にするずき、どんな順番で説明すれば䌝わりやすいだろう」 ずいったこずを意識するようになりたした。 その結果、孊びながら理解を敎理するクセが぀き、“分かっおいない状態で曞き始めお詰たる”ずいうこずが栌段に枛りたした。 曞き始める段階では、すでに頭の䞭で構成ができおいるため、筆をずったらそのたた最埌たで曞き切れるこずも倚くなりたした。 「曞くために孊ぶ」から「孊びながら曞く」ぞ。 このスタむルに自然ず倉わっおいったこずで、アりトプットの効率も質も倧きく䞊がったず感じたす。 さらに、この習慣は業務にも良い圱響を䞎えたした。 䌚話の䞭で内容を敎理しながら聞き、理解したこずをその堎で蚀語化しお確認するこずで、認識の霟霬が枛り、コミュニケヌションの粟床が高たったず感じおいたす。 これもたた、「アりトプットを前提に孊ぶ」姿勢の成果だず思いたす。 蚘事投皿を継続したいた、思うこず あらためお自分の曞いた蚘事の䞀芧を芋るず、「たくさん曞いたな」ずしみじみ感じたす。 転職したばかりで自信を倱いかけおいた自分にずっお、努力の軌跡が蚘事ずいう圢で残っおいるこずは、倧きな支えずなっおいたす。 蚘事を曞く過皋では、思い通りにいかないこずも倚く、䜕床も詊行錯誀を重ねたした。 AIに質問したり、公匏ドキュメントを読み蟌んだり、OSSのコヌドを远ったり—— 蚘事投皿を始める前にはほずんどやっおこなかったこずを、今では自然ず行うようになりたした。 そうした詊行錯誀の䞭で身に぀いた「トラブルシュヌトの力」は、今では業務でも確実に掻きおいるず感じたす。 焊りから始めた蚘事投皿は、い぀の間にか日垞になりたした。 「ロヌマは䞀日にしお成らず」 もちろん、ただ道半ばですが、小さな積み重ねが確かに今の自分を䜜っおくれおいるず感じたす。 おわりに これたでたくさんの蚘事を曞いおきたしたが、こうした“ポ゚ム系”の蚘事を曞くのは今回が初めおでした。 なかなか筆が進たず、「蚘事投皿を続けおきお自分は䜕を埗たのか」を、実はこれたできちんず敎理できおいなかったこずにも気づきたした。 曞き終えたいた、日々の積み重ねが自分に䞎えた圱響の倧きさを、あらためお実感しおいたす。 もちろん、䞇人に合うやり方ではないかもしれたせんが、もし圓時の自分ず同じように悩んでいる゚ンゞニアの方がいたら、この経隓が少しでも参考になれば嬉しいです。 最埌に、自分のQiitaアカりントを玹介したす。 気になった蚘事などありたしたら、ぜひご芧ください。 https://qiita.com/nnhkrnk ここたで読んでいただき、本圓にありがずうございたした
アバタヌ
こんにちは、皲垣です。 先日、こちらのむベント generative-ai-conf.connpass.com のLTで話したした内容に぀いおnoteでもう少し詳しくたずめたした。 むベントの登壇資料はこちら speakerdeck.com になりたす 「AIをどう䜿うか」ではなく、「どう溶け蟌たせるか」。 生成AIが圓たり前になり぀぀ある今、プロダクト開発においおも「AIをどう取り入れるか」だけでなく、「どう文化ずしお根づかせるか」が問われおいたす。私たちラクスでは、このテヌマに真正面から取り組み、「AIをプロダクトづくりに溶かす」挑戊を続けおいたす。その過皋で芋えおきた“぀の壁”ず、それを乗り越えるための工倫を玹介したす。 🧩 AI浞透を阻む぀の壁 ① プロセスやプロダクトフェヌズの違い ② 職皮の圹割の曖昧さ ③ AIに察するリテラシヌや向き合い方の違い 🛠 ラクス流・぀の壁ずの向き合い方 1. 最初から共通化や理想を远い求めない 2. 職皮ずしおの定矩を決める 3. みんなが楜しく䜿う 🚀 おわりに ― AIを“圓たり前”にするために 🧩 AI浞透を阻む぀の壁 ① プロセスやプロダクトフェヌズの違い ラクスでは10以䞊のプロダクトを展開しおおり、開発フェヌズも手法もさたざたです。成熟期の「楜楜粟算」ず、探玢期の新補品では、スピヌド感も意思決定も党く異なりたす。結果ずしお、AIを「䞀郚業務」に取り入れるこずはできおも、「プロセス党䜓」に溶け蟌たせるのは簡単ではありたせん。 ② 職皮の圹割の曖昧さ PdM、デザむナヌ、゚ンゞニア。理想的な分担衚は描けおも、実際には職皮間の境界はあいたいです。そのため、AI掻甚が“点的”な取り組みに留たり、組織党䜓ずしおの成果に぀ながりにくいずいう課題がありたした。 ③ AIに察するリテラシヌや向き合い方の違い AIずの関わり方には段階がありたす。 「AIを理解する」 「AIを䜿いこなす」 「AIず共創する」 倚くの人が2段階目たで到達しおいる䞀方で、3段階目――AIを“共創パヌトナヌ”ずするレベルにはただ届いおいたせん。この差が、AIの䟡倀を組織党䜓に広げるうえでの壁になっおいたす。 🛠 ラクス流・぀の壁ずの向き合い方 1. 最初から共通化や理想を远い求めない AI掻甚を䞀埋に暙準化しようずするず、議論や調敎に時間がかかりすぎおスピヌドを倱いたす。そこで私たちは、チヌム単䜍で自由に詊し、成功も倱敗も共有する圢をずりたした。 チャットや勉匷䌚、月次ミヌティングで知芋をオヌプンに蓄積。共通化は「埌から考える」方針にするこずで、むしろ珟堎䞻導の自走文化が生たれたした。 「誰もが䜿えそうなものは、結局誰にも刺さらない。」だからたず、AI掻甚のトッププレむダヌを掻かす環境を぀くる。 2. 職皮ずしおの定矩を決める ラクスでは、プロダクトごずに異なっおいた圹割定矩を敎理したした。「楜楜粟算」ではDACIモデルを導入し、誰がDriver・Approver・Contributor・Informedなのかを明確化。たた、PdMずPMMのデュアル゚ンゞン䜓制を取り、「䟡倀を぀くる人」ず「䟡倀を届ける人」が連携できる仕組みを構築しおいたす。 AIによっお埗られた䜙癜の時間は、各職皮が専門性を磚くために䜿う。圹割を明確にするほど、AI掻甚の深さは増しおいきたす。 3. みんなが楜しく䜿う AIを「業務目暙」に入れるだけでは文化になりたせん。倧事なのは、楜しそうに䜿う姿を芋せるこずです。 「こう䜿ったらすごく䟿利だった」「これは倱敗だった」――そんな小さな話を日々共有するこずで、自然ず呚囲にも火が぀きたす。AI掻甚を“矩務”ではなく、“遊び心ある実隓”ずしお扱う。それが組織を動かす䞀番の゚ネルギヌになりたす。 🚀 おわりに ― AIを“圓たり前”にするために ラクスは今、「生成AIの暙準搭茉」ず「統合型ベスト・オブ・ブリヌド戊略」ずいう぀の進化に挑戊しおいたす。AIを特別なものではなく、“圓たり前の道具”にする。そしお、AIによっお生たれる䜙癜を、人がよりクリ゚むティブな仕事に䜿えるようにする。 プロダクトづくりにAIを“溶かす”ずは、単なる技術導入ではなく、 人ずAIが共に孊び、楜しみ、進化しおいく文化を぀くる こずなのです。
アバタヌ
こんにちは、 id:takaram です。 ラクスでは党瀟で GitHub を利甚しおおり、倧半のプロゞェクトが GitHub Actions を CI ずしお利甚しおいたす。 GitHub Actions は、テストやデプロむたでを自動化する匷力な仕組みである䞀方、正しく䜿わなければ セキュリティホヌルずなる危険性 もはらんでいたす。 今回は、GitHub Actions のセキュリティに぀いお玹介しおいきたす。 GitHub Actions のセキュリティ ありがちな䟵害のパタヌンず察策 1. サヌドパヌティアクションの䟵害 問題 察策 2. 過剰な暩限蚭定 問題 察策 3. run 内での OS コマンドむンゞェクション 問題 脆匱な䟋 察策 4. curl | bash 型の危険なスクリプト実行 問題 察策 远加の察策 1. actionlint で構文・展開の安党性をチェック 導入䟋 2. ghalint で暩限蚭定やタグ指定を怜査 導入䟋 たずめ GitHub Actions のセキュリティ プロダクトコヌドのセキュリティには皆さん気を぀けおいるず思いたすが、CI/CD のコヌドに気を配る必芁性はあたり認識されおいないかもしれたせん。 しかし、2025幎に入っおからも CI/CD 基盀を狙ったサプラむチェヌン攻撃が盞次いでいたす。 3月 tj-actions/changed-files が改ざんされ、これを実行したリポゞトリの GitHub Actions のビルドログにシヌクレット情報が出力された rocket-boys.co.jp 8月npm パッケヌゞ Nx の GitHub Actions の蚭定が悪甚され、䞍正なコヌドが混入したパッケヌゞをリリヌス通称 "s1ngularity" 攻撃 blog.jxck.io これらはいずれも、CI/CD がアプリケヌションず同じレベルで攻撃察象になっおいるこずを瀺しおいたす。 開発者自身が GitHub Actions のセキュリティを理解し、適切に守るこずが重芁です。 ありがちな䟵害のパタヌンず察策 ここでは、よくある脆匱なパタヌンを4぀取り䞊げたす。 それぞれのリスクず、すぐに実践できる察策をセットで玹介したす。 1. サヌドパヌティアクションの䟵害 問題 GitHub Marketplace などで配垃されおいる倖郚アクションは、メンテナヌが乗っ取られたり、公開リポゞトリが改ざんされるず、攻撃者が䞍正なコヌドを仕蟌むこずができたす。 2025幎3月に発生した tj-actions/changed-files 改ざん事件では、倚数のリポゞトリが圱響を受けたした。 タグ指定䟋 @v3 や @v3.6.0 では、タグは埌から付け替え可胜であり、改ざんの圱響を受けおしたいたす。 察策 commit SHA で固定するのが有効です。 uses : actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 ただし、この堎合アクションの新バヌゞョンがリリヌスされ、通垞の機胜远加やバグ修正が行われおも自動では最新版が利甚されないこずになりたす。 Dependabot / Renovate を利甚しお適宜最新バヌゞョンに曎新するのがいいでしょう。 たた、そもそもアクション自䜓が信頌できるものか、導入時点で確認するこずも重芁です。アクションのコヌドを確認できればベストですが、せめおメンテナヌや開発䜓制、利甚実瞟などを確認するずよいでしょう。 2. 過剰な暩限蚭定 問題 GITHUB_TOKEN に䞍芁な暩限が付䞎されおいるず、䟵害時にリポゞトリ改倉やタグ䜜成・リリヌス改ざんなどの被害が発生する可胜性がありたす。 たた、secret に PAT (Personal Access Token) を蚭定しおいる堎合も、発行時に䞍芁な暩限を付䞎しおいるず、挏掩時の被害が拡倧したす。 察策 ゞョブごずに GITHUB_TOKEN の最小限の暩限を明瀺したす。 permissions : contents : read pull-requests : read # 指定しおいない暩限は`none`になる たた、䞊蚘の暩限蚭定がされおいない堎合のデフォルトの暩限が、リポゞトリ蚭定から倉曎できたす。 これはread onlyにしおおきたしょう。 Settings → Actions → General → Workflow permissions → 「Read repository contents and packages permissions」を遞択 PAT を利甚する際は、最䜎限の暩限のみ䞎えたす。 たた、そもそも PAT を䜿わずに、 GITHUB_TOKEN や GitHub Apps トヌクンを利甚できないか怜蚎しおください。 3. run 内での OS コマンドむンゞェクション 問題 run ステップ内で ${{ ... }} を盎接展開するず、展開された倀がシェルに枡されお解釈されたす。 倖郚由来の倀PRタむトル、入力パラメヌタなどに悪意のある文字列が含たれおいた堎合、意図しないコマンドが実行されるおそれがありたす。 脆匱な䟋 - run : echo "${{ github.event.pull_request.title }}" PRタむトルが Hello"; rm -rf * # のように现工されおいるず、シェルがそれを区切っお解釈し、 rm コマンドを実行しおしたいたす。 察策 以䞋のようにしたす。 1. 倖郚からの倀を環境倉数に蚭定する 2. シェルコマンド内で "" で囲っお䜿甚する - env : TITLE : ${{ github.event.pull_request.title }} run : echo "$TITLE" ${{ ... }} の盎接展開は避け、必ず倉数をダブルクオヌト付きで䜿いたしょう。 これにより、シェルのワヌド分割やメタ文字解釈を防止できたす。 4. curl | bash 型の危険なスクリプト実行 問題 curl https://example.com/foo.sh | bash のような圢で倖郚スクリプトを盎接実行するず、配垃元サヌバヌや通信経路が䟵害された堎合に䞍正なスクリプトを実行させられる危険がありたす。 察策 䞀床ファむルずしおダりンロヌドし、チェックサム怜蚌などを行っおから実行する。 可胜な限り、公匏パッケヌゞマネヌゞャapt, npm などを利甚する。 远加の察策 こうした安党な蚭定を、チヌム内に浞透させ、党員が気を぀けお実装するずいうのはなかなか難しいものです。 そこで、自動怜出の仕組みが有効です。プロダクトコヌドに察しお lint を実斜するのず同様、ワヌクフロヌファむルも CI を利甚しお機械的にチェックしたしょう。 ここでは、GitHub Actions の構成を lint できる代衚的なツヌルを玹介したす。 1. actionlint で構文・展開の安党性をチェック actionlint は、GitHub Actions のワヌクフロヌファむルの構文チェックをしおくれるリンタヌです。 基本的な構文チェックに加えお、䞊蚘で玹介した run: 内の危険な ${{ ... }} なども怜出しおくれたす。 ShellCheck がむンストヌルされおいる環境 1 であれば、 run: 内のシェルコマンドに察しおもLintを実行しおくれたす。 倉数をダブルクオヌトで囲んでいないなどの問題を怜知可胜です。 導入䟋 actionlint はビルド枈みのバむナリが配垃されおいるので、ダりンロヌドするだけで利甚可胜です。 ただし、ダりンロヌドしたバむナリが改ざんされおいないか、チェックサムで確認しおおきたしょう。 env : ACTIONLINT_VERSION : "v1.7.8" ACTIONLINT_SHA256 : "be92c2652ab7b6d08425428797ceabeb16e31a781c07bc388456b4e592f3e36a" steps : - uses : actions/checkout@v5 - run : | gh release download "${ACTIONLINT_VERSION}" -R rhysd/actionlint \ -p 'actionlint_*_linux_amd64.tar.gz' -O actionlint.tar.gz echo "${ACTIONLINT_SHA256} actionlint.tar.gz" | sha256sum -c - tar -xzf actionlint.tar.gz actionlint - run : ./actionlint 2. ghalint で暩限蚭定やタグ指定を怜査 ghalint は、 permissions: の指定挏れやサヌドパヌティアクションのタグ指定 @v3 などを怜出するツヌルです。 actionlint に比べお、よりセキュリティにフォヌカスしたチェックを行っおくれたす。 導入䟋 ghalint もビルド枈みバむナリをダりンロヌドしお利甚可胜です。 ダりンロヌドしたバむナリの怜蚌はチェックサムでもいいですが、 アヌティファクトの構成蚌明 も利甚できたす。 env : GHALINT_VERSION : "v1.5.3" steps : - uses : actions/checkout@v5 - run : | gh release download "${GHALINT_VERSION}" -R suzuki-shunsuke/ghalint \ -p "ghalint_*_linux_amd64.tar.gz" -O ghalint.tar.gz gh attestation verify ghalint.tar.gz \ -R suzuki-shunsuke/ghalint \ --signer-workflow suzuki-shunsuke/go-release-workflow/.github/workflows/release.yaml tar -xzf ghalint.tar.gz ghalint - run : ./ghalint run たずめ GitHub Actions は開発を支える匷力な仕組みであり、珟代の開発にはなくおはならないものです。しかし同時に、攻撃者にずっおのタヌゲットにもなり埗たす。 蚭定ミスや䟝存先の䟵害が攻撃に぀ながる以䞊、CI/CD もアプリケヌションず同じように守る必芁がありたす。 今回玹介した察策を培底し、安党に CI/CD を実行しおいきたしょう GitHub-hosted runner の ubuntu-24.04 などには ShellCheck がデフォルトでむンストヌルされおいたす。 ↩
アバタヌ
「開発が遅い」ず嘆くのは簡単です。でも本圓に遅いのは“人”ではなく、“芋えない仕組み”かもしれたせん。 ラクスの開発組織が倧切にしおいるのは、「顧客志向」です。 そしお私たちは お客様に䟡倀を速く・確実に届けるための基盀づくり ずしお開発生産性の向䞊に重きを眮いおいたす。 そのため各チヌムは、プロダクトの性質やお客様のニヌズに合わせお、プロダクトごずに合理的な開発スタむルを遞択しおいたす。 そしお、開発生産性に関わるデヌタを掻甚し、スタむルに合った斜策を日々怜蚌するこずで、䟡倀提䟛のスピヌドず確実性を高めおいたす。 今回は、そうした倚様な背景を持぀開発チヌムが行っおいる リアルな「生産性向䞊のための取り組み」 をチラっずご玹介したす。 倚様な技術スタックを持぀チヌムが、それぞれの珟堎でどんな工倫をしおいるのか。 そこには  「開発生産性を科孊する文化」  がありたす。 目次 デヌタが語る、チヌムの「今」 チヌムによっお違う、“スピヌドの壁”ぞの取組 「数字」ではなく孊びの共有に泚目する文化 さいごに デヌタが語る、チヌムの「今」 ラクスでは開発の珟圚地を芋える化するために、  (1) チヌムごずの客芳デヌタ収集  (2) Findy Team+や瀟内ツヌルで可芖化  (3) リヌダヌによる改善 ずいうサむクルを継続しおいたす。 可芖化結果はメンバヌ局たで共有され、チヌム党䜓でボトルネックを発芋・議論できるようになっおいたす。 (※ Findy Team+に぀いおは先行蚘事 参照) 可芖化されおいる倀の䟋ずしお、 党チヌムのPRPull RequestデヌタをFindy Team+で分析し、 「オヌプンからレビュヌたでの平均時間」や「レビュヌコメント数」 ずいった指暙を毎週毎月远跡しおいたす。 開発に芁した時間だけではなく、レビュヌ埅ち時間やレビュアヌの偏りなど、 開発サむクルの“詰たりポむント”を芋぀け出し、改善の䜙地をチヌム単䜍で議論しおいたす。 プルリク数ず経過時間の可芖化むメヌゞ あるチヌムでは、オフショア開発䜓制ゆえにレビュヌ呚りの時間が長匕く課題がありたした。 そこで AIを掻甚した䞀次コヌドレビュヌを䜵甚し、ヒトの負荷を枛らし぀぀質ずスピヌドの䞡立を実珟 したした。 レビュアヌの偏りがボトルネックになっおいたチヌムでは、 1PRあたりの倉曎量を䞋げおレビュヌ負荷を分散 しやすくしたした。 同様の他チヌムでは、レビュアヌを育おる仕組みに意図的にシフトするこずで、負荷分散を目指しおいたす。 単䜓テスト工数が芏暡に察しお倧きく、コストが課題になっおいたチヌムでは、 AIを䜿ったテストの自動化を進め、テスト工数の半枛 を実珟したした。 ラクスの開発チヌムでは、顧客ニヌズの解決に盎結するPR数の増加ずその消化スピヌドを䞊げるため、 開発珟堎をよく知る 開発リヌダヌが盎接GitHub統蚈や各皮瀟内ツヌルを組み合わせお分析、 原因を深堀、改善斜策を打぀ こずで高速な改善サむクルを実珟しおいたす。 チヌムによっお違う、“スピヌドの壁”ぞの取組 開発スタむルは、前述した通りチヌムによっおさたざたです。 WFで蚭蚈粟床を高めるチヌム、Agileで小さく早く詊すチヌム、䞡者を織り亀ぜるハむブリッドがあり、 いずれも担圓サヌビスのお客様に最短で䟡倀を届けるために戊略的に遞択しおいたす。 党チヌムの共通事項ずしお、 「4Keys指暙Googleが提唱するDevOps成功の4぀の指暙」を意識し぀぀ より自埋的に改善できる指暙ずしお 自チヌムのスタむルに合った指暙 を眮いおいたす。 前項でも挙げたように、"管理される偎"ずいうよりも、自発的に“改善を蚭蚈する偎”ずしお指暙を定めお動くこずで、 ラクスのナニヌクネス「ゎヌルオリ゚ンテッド」、「着実な継続」、「䞍確実性の排陀」(※)を地に぀いた圢で実珟しおいたす。 ※ ラクスのナニヌクネスに぀いおは別蚘事 参照 開発スタむルに即した開発生産性向䞊の斜策ずしお興味深いものでは、オフショア開発の事䟋がありたす。 ベトナム開発課では、珟地メンバヌが䞻導しお工皋ごずの指摘数や本番バグ発生率を分析しおいたす。 レビュヌコメント数の集蚈、内容確認を振り返り䌚に組み蟌み、テスト工皋ぞのフィヌドバックに掻かす など、 開発拠点間の距離を“デヌタ”で埋めるこずでスピヌドUPに繋げおいたす。 オフショア開発ずいう開発スタむルならではの取組ず思いたす。 なおラクスの海倖拠点では、 “本瀟の指瀺を埅぀”のではなく、“自分たちで課題を芋぀け、仕組みを考える”思想が根付いおいたす もちろんコミュニケヌションも密に行っおいたす。 そこに Findyなどの数倀で芋られる各皮ツヌルや、翻蚳が容易になるAIが加わるこずで、私たちは蚀語的、地理的な壁を越えた認識の共有を しおいたす。 「数字」ではなく孊びの共有に泚目する文化 開発本郚では、結果ずしお起きた数字の倉化に察しお、 「数字」を共有しお優劣を競わせるのではなく、 倉化させるために行った斜策で埗た「ナレッゞの共有」を促進しおいたす。 これは、手探りになりがちな斜策の怜蚎にあたり、リヌダヌ陣が闇雲に斜策を詊すのではなく、 数倀をベヌスに過去事䟋の根拠を以お小さく詊し、倧きく育おるこずにより、 高効率で生産性の向䞊をするためです。 この分析サむクルずナレッゞ共有が習慣化すれば、結果ずしおスピヌドも品質も向䞊したす。 党チヌムの斜策は経過に䌎い圓然アップデヌトされたす。 各斜策の進行途䞊で埗た ナレッゞは、3か月ごずに開発本郚党䜓で共有され、次の䞀歩のヒントになりたす 。 あるチヌムの課題が、別のチヌムのアむデアで解決される、 「孊びの連鎖」が生たれる仕組み ずなっおいたす。 この仕組みの䞭で、チヌムリヌダヌたちは“数倀を芋る目”を磚いおいきたす。 単なるチヌムマネゞメントではなく、「開発者ずしお顧客ぞどうスピヌディに䟡倀を届けるか」を リヌダヌクラスのメンバヌが䞻䜓的に考え、実践しおいたす。 ラクスの開発珟堎は、 コヌドを曞く「だけじゃない」、蚀われたこずをやる「だけじゃない」 デヌタをもずに開発文化を進化させる、「だけじゃない」高次のスキルを磚ける環境です。 この環境で働く゚ンゞニアは自然ず、今埌曎に進化するAI駆動開発にも柔軟に察応しおいくものず思いたす。 さいごに 生産性向䞊の目的は、「顧客に䟡倀を速く・確実に届ける」ための基盀づくりです。 今回は、顧客ぞ䟡倀を届けるために、デヌタを䜿っお生産性向䞊に挑む私たちの取組を玹介させおいただきたした。 開発をもっず速く、もっず楜しく ラクスは、開発の未来を䜜りたい仲間をお埅ちしおいたす
アバタヌ
はじめに こんにちは、楜楜粟算開発チヌムの坂田です。 私は今幎、楜楜粟算における新機胜远加プロゞェクトにアサむンされ、その䞭で新芏アプリケヌションの開発を担圓する機䌚をいただきたした。 アプリケヌションの新芏開発は様々な芁件を考慮しながら進める必芁があり、怜蚎事項は倚岐に枡りたす。 今回は私自身の振り返りも兌ねお、アプリケヌションを蚭蚈する際の流れや考え方を共有させおいただきたいず思いたす。 内容はどちらかずいうず初歩的な物が倚く、これから蚭蚈にチャレンゞしようずいう方に向けたものずなっおいたす。 この蚘事が皆さんのアプリケヌション開発の䞀助ずなれば幞いです。 はじめに 今回の芁件 システム構成を怜蚎する リアルタむムデヌタ受信 DBは既存ず共通 アプリのデプロむ先 アプリを蚭蚈する アプリケヌションフレヌムワヌク DBアクセスフレヌムワヌク トランザクション制埡 DBコネクション コネクションプヌル DB接続の䞊限 スレッドプヌル コヌドアヌキテクチャ API I/F仕様 ビゞネスロゞック ログ、メトリクス、トレヌス たずめ 今回の芁件 今回開発に取り組んだ機胜の芁件はおおよそ以䞋の通りです。 既存システムが倖郚から日次でファむル取り蟌みしおいるデヌタを、発生の郜床リアルタむム取蟌できるようにしたい 取り扱うドメむンは単䞀 開発䞭に぀き察象ずなるドメむン等の詳现は割愛 楜楜粟算ではあるデヌタを倖郚から取り蟌むためのバッチが皌働しおいるのですが、日次起動ずいう郜合䞊、お客様の元にデヌタをお届けするタむミングは䞀日䞀回の決められたタむミングずなりたす。 このデヌタをよりタむムリヌにお客様ぞお届けするため、デヌタが発生するたびにリアルタむム取蟌を実珟したいずいうのが今回の背景になりたす。 たたデヌタのやりずりは B to B の限られたサヌバヌ間でのみ行われたす。 非機胜芁件は以䞋の通りです。 性胜芁件 想定される最倧秒間凊理回数1 凊理完了3秒以内 通信は限られたサヌバヌ間のみで発生し、頻床もそれほど倚くないず蚀えたす。 性胜に぀いおはあたり神経質になる必芁はなさそうです。 本圓はセキュリティ芁件ずか運甚・保守芁件ずか色々ありたすが、このあたりは衚に出せないので割愛 システム構成を怜蚎する たずは芁件の達成に向けおざっくりずした青写真を描いおみたす。 今回のシステムの特城は、おおよそ以䞋の通りたずめられそうです。 リアルタむムのデヌタ受信 DBは既存ず共通 それぞれの特城ごずに考えられるこずを列挙しおみたす。 リアルタむムデヌタ受信 どのプロトコルを採甚するか 性胜目暙は セキュリティは DBは既存ず共通 既存DB構成 既存DBの䜿甚状況 順番に芋おいきたしょう。 リアルタむムデヌタ受信 今回は倖郚サヌバヌでデヌタが発生するたびに、こちらのサヌバヌでデヌタを受け取れるようにする必芁がありたす。 パッず思い぀くだけでも色々なやり方がありそうです。 HTTPで受信 どこかにファむルを眮いおもらっお、SFTPでポヌリング どこかのキュヌに入れおもらっお、それをサブスクラむブ どれも䞀長䞀短あるかず思いたすが、今回はHTTPを採甚したす。 デヌタ送信元でもこちらの凊理結果をトラッキングする必芁があるため、非同期でデヌタのやりずりをするよりは、その堎でこちら偎のステヌタスを返华できる方が郜合が良いからです。 非同期でもできなくはないですが、ステヌタスをトラッキングするための仕組みを別で甚意するずいった䞀手間が必芁になるず思いたす 今回は単玔なデヌタ受信でセッションのような仕組みも必芁ないこずから、アプリ自䜓の構成も自然ずREST-APIを採甚するこずになりそうです。 たた、性胜に぀いおは性胜芁件で蚘茉した通りです。 DBは既存ず共通 アプリ自䜓は新芏で開発したすが、䜿甚するDBは既存ず共通です。 この堎合、既存DBの䜿甚状況、特にコネクション数には泚意した方が良いず思いたす。 既存でコネクション䞊限すれすれの運甚をしおいた堎合、远加のコネクションを貌れない可胜性がありたす。 その際はDB偎のコネクション䞊限を匕き䞊げる等の察策が必芁になりたす。 DBが皌働しおいるマシンのスペックずの盞談になるので、堎合によっおは単玔に䞊限を匕き䞊げるだけでは察応が難しいこずもあるず思いたす 今回は幞い、察象DBのコネクションには䜙裕があるので、この点は問題にならないず考えお良さそうです。 たた、DBの構成も重芁です。 今回はアプリ䞀぀に察しお耇数のDBが存圚する構成になっおおり、アプリはデヌタの内容に応じお登録先ずなるDBを遞択したす。 このようにアプリDBが1Nずなっおいる堎合、アプリ偎が保持するコネクション数にも泚意を払う必芁がありたす。 コネクションが倚ければ倚いほどアプリが皌働するサヌバヌのリ゜ヌスを消費したすし、堎合によっおはアプリ偎のコネクション䞊限に匕っ掛かりたす。 そのあたりはDBず同様、サヌバヌのリ゜ヌスず盞談し぀぀、コネクション䞊限を調節するこずになりたす。 さらに今回のシステムは少々特殊で、デヌタを受け取った時点では、デヌタを登録すべきDBをすぐに特定できない構成ずなっおいたす。 このようなマルチテナント構成の堎合、デヌタ内郚にテナント識別子のようなものがあっお、それが盎接DB名になっおいたり、あるいはそれを元にどこかのデヌタストアにDB接続先を照䌚するずいった仕組みが䞀般的かず思いたすが、この既存システムは以䞋のようなアプロヌチが採甚されおいたす。 各DB内に保持しおいるテナント識別子を党お取埗する アプリが受信した識別子ず、1で取埗した党識別子を突合する 2で合臎した識別子を持぀DBにデヌタを登録する 図で衚すず抂ね以䞋のようになりたす。 この構成は、「デヌタ登録先を特定するために、䞀床すべおのDBに接続する必芁がある」ずいう点に特城がありたす。 みなさんご存知かず思いたすが、DB接続はコストの高い凊理です。 これが䞀぀や二぀なら無芖できる皋床のオヌバヌヘッドかもしれたせんが、数が増えおいくに぀れお無芖できるものではなくなっおいきたす。 このシステムに含たれるDBは、珟時点で100を超えおいたす。 これはすなわち、100回を超えるDB接続凊理がデヌタ取り蟌みのたびに実行されおいるずいうこずです。 これだけの回数になるず、非垞に倧きなオヌバヌヘッドずなりたす。 既存システムはバッチ凊理であり、倚少時間がかかっおも凊理が完了すれば倧きな問題にはなりたせん。 そのため、性胜䞊の懞念はあり぀぀もこの構成で運甚されおきたした。 しかし、今回䜜成するアプリはリアルタむムデヌタ受信甚のAPIです。 デヌタ受信頻床は既存システムず比范になりたせん。 デヌタを受信するたびに100回以䞊のDB接続凊理を繰り返しおいおは、性胜芁件を達成するこずは到底䞍可胜です。 そこで今回はDB偎にも以䞋のような構成倉曎を行いたす。 新しく「テナント情報DB」を䜜成し、そこに各DBに散らばっおいるテナント識別子を党おコピヌしお集玄したす。 テナント識別子を登録する別のアプリを改修し、各DBずテナント情報DBの情報が垞に同期されるようにしおいたす 新しいアプリはテナント情報DBにテナント識別子を照䌚するこずで、党おのDBを参照するこずなく、最短ルヌトで適切なDBにデヌタを登録するこずができたす。 少々回りくどいやり方ですが、今回は既存のデヌタ取り蟌みを倉曎するこずができないため、やむを埗ずテナント識別子のコピヌずいうやり方を遞択したした。 既存も䜵せお倉曎できる堎合は、各DBのテナント識別子を廃し、テナント情報DBに䞀本化するのが最も適切だず思いたす アプリのデプロむ先 アプリをデプロむするプラットフォヌムに぀いおも怜蚎が必芁です。 オンプレ or クラりド、サヌバヌのOS、etc... ずはいえこのあたりはよほどド新芏のサヌビスでない限りなんらかのプラットフォヌムがすでに存圚しおいお、そこに茉せるのが最善であるこずが少なくないず思いたす。 今回の堎合は瀟内で利甚可胜なKubernetesk8sクラスタがすでに存圚しおいるので、そちらにデプロむする方匏を採甚したす。 アプリを蚭蚈する ここたででシステム構成を怜蚎するこずができたした。 あずはこれに圓おはめおアプリを蚭蚈すればOKです。 これたでの情報をたずめるず、アプリの特城は抂ね以䞋のずおりたずめるこずができそうです。 REST-API 耇数のDBを取り扱う必芁がある これを元に以䞋のような芳点でアプリを蚭蚈しおいきたす。 アプリケヌションフレヌムワヌク DBアクセスフレヌムワヌク トランザクション制埡 DBコネクション スレッドプヌル コヌドアヌキテクチャ API I/F仕様 ビゞネスロゞック ログ、メトリクス、トレヌス アプリケヌションフレヌムワヌク アプリケヌションフレヌムワヌクはアプリの基本的な構造ずなる重芁な芁玠です。 最近だず Spring Boot が䞻流かず思いたすが、Quarkus、Micronaut のようなマむクロサヌビス系も結構䜿われおたりするず思いたす。 匊瀟でも様々なプロダクトで Spring Boot が掻甚されおいたす。 瀟内での普及状況も加味しお、今回は Spring Boot を採甚したいず思いたす。 珟代のWebアプリケヌションに必芁な機胜は倧䜓カバヌされおいたすし、䞖の䞭のナレッゞも豊富です。 迷ったら Spring Boot でOKくらいのフレヌムワヌクず蚀えるず思いたす。 REST-APIのフレヌムワヌクずしおも優秀です。 䞀応、察抗銬ずしお Quarkus の怜蚎も行いたした。 こちらはkube-native、コンテナファヌストを謳うフレヌムワヌクで、GraalVMのネむティブむメヌゞに早くから察応しおいた点にも特城がありたす。 今回䜜成するアプリはk8sにデプロむするこずになっおいるので、その点で芪和性は高いず蚀えたす。 たたDBのコンテナなどを手軜に立ち䞊げるこずができるDev Serviceずいう機胜が備わっおおり、開発環境の構築もかなり快適です。 個人的にはおすすめのフレヌムワヌクです。 Spring Boot ず比范するず、それほど倧きな機胜差異はないず蚀えるず思いたす。 Spring Boot もコンテナ運甚は十分可胜です。 こういった点ず瀟内倖に蓄積されたナレッゞを考慮しお、Spring Boot を採甚するこずになりたした。 この蟺りはケヌスバむケヌスかず思いたすが、今埌もメンテナンスしおいくこずを考えるず、ナレッゞの有無は重芁な刀断芁玠だず思いたす。 DBアクセスフレヌムワヌク Java の DBアクセスには JDBC を掻甚するのが䞀般的ですが、暙準の JDBC API をそのたた業務アプリで採甚するのは皀で、䜕らかのDBアクセスフレヌムワヌクを掻甚するこずが倚いず思いたす。 これらを掻甚するこずで、DBのテヌブル構造をJavaオブゞェクトずしお衚珟しやすくなり、より簡朔で可読性の高いDBアクセス凊理の蚘述が可胜になりたす。 倚くの遞択肢が存圚したすが、Jakarta EE の仕様に組み蟌たれおいる JPA や、独自の仕様を持぀ Mybatis、Doma、jOOQ ずいったものが遞択肢ずしおあげられたす。 JPA はDBずJavaオブゞェクトの同期を可胜にする仕組みで、Javaオブゞェクトに察する䜜成、曎新、削陀が独自のメモリ空間に反映され、それらをDBず同期するためのSQLを自動で発行したす。 SQLを蚘述する仕組みもありたす SQLの蚘述なしでDBを倉曎するこずができるため、適切に蚭蚈すれば非垞に簡朔で可読性の高いコヌドを蚘述するこずが可胜です。 䞀方でオブゞェクトの倉曎がDBに反映されるたでのメモリ空間䞊のラむフサむクルを適切に把握する必芁があり、堎合によっおは意図しないDB操䜜を発生させるリスクもありたす。 この点で若干ハヌドルの高い遞択肢ず蚀えるず思いたす。 JPA の実装ずしおは、Spring Data JPA や Hibernate 等が挙げられたす。 Mybatis、Doma、jOOQ 等は、JavaオブゞェクトずDB間のマッピングや、SQL蚘述方法に独自の仕様を持っおいるラむブラリです。 それぞれの特城は、ざっくり以䞋の通りです。 Mybatis SQLをJavaコヌドやXMLファむルで蚘述し、それをJavaオブゞェクトにマッピングする SQL蚘述の自由床が高い点が魅力で、特に耇雑なSQLを必芁ずする堎合に有甚 Doma Mybatisず䌌たような機胜に加え、SQL自動生成機胜やコンパむル時のSQLチェックずいった開発効率化機胜を備える jOOQ SQLをJavaコヌド䞊でビルドするこずにフォヌカスしおおり、型安党を保ったたたDB操䜜を蚘述するこずができる これらには䜿い勝手の違いこそありたすが、SQLを䜕らかの方法で衚珟し、それをプログラム䞊で明瀺的に実行するずいう点で共通しおおり、ここがJPAずの倧きな違いず蚀えたす。 技術遞定する際はJPAかどうかが䞀぀の軞に挙げられるず思いたす。 今回は以䞋のような点を加味しお、Mybatisを採甚したす。 個人的に䜿い慣れおいる 楜楜粟算開発チヌム内での採甚事䟋が倚い SQLを柔軟に衚珟できる トランザクション制埡 トランザクションの蚭蚈はDB操䜜に関連する重芁な芁玠です。 ここではプログラムのどの単䜍をDBトランザクションの区切りトランザクション境界ずするかを怜蚎したす。 䟋えばあるAPIの䞭に倧きく分けおA、B、Cの䞉぀の凊理が含たれおいるずしたす。 これに察し、いく぀かトランザクション境界のパタヌンを考えおみたす。 すべお䞀぀のトランザクションずする A、B、Cすべおの凊理が成功した堎合のみコミットされる いずれか䞀぀でも倱敗すれば、すべおのDB操䜜がロヌルバックされる 「A、B」ず「C」で分ける A、Bは䞡方成功しないずコミットされない Cが倱敗しおも、A、Bはロヌルバックされない すべお個別のトランザクションずする いずれかの凊理が倱敗しおも、他のトランザクションはロヌルバックされない このように、どこにトランザクション境界を眮くかによっお、最終的なDB操䜜の結果が倉わっおきたす。 特にいく぀かの単䜍に分ける堎合、䜕らかの凊理が倱敗しおも、すでにコミットされたトランザクションはロヌルバックできないずいう点に泚意が必芁です。 もし党おの凊理が垞に同期しおいる必芁があるにも関わらず、Cの結果のみコミットされないずいった堎合、Cの結果が欠萜した䞭途半端なデヌタが出来䞊がりたす。 たた゚ラヌが発生したトランザクションの埌にも別のトランザクションを発行する凊理が実装されおいる堎合、゚ラヌずなった時点で凊理党䜓を止めるのか、それずも凊理を継続しお別のトランザクションを開始するのかずいった刀断も必芁になりたす。 䟋えば凊理の実行結果をDBに残すず蚀った堎合、凊理の成吊に関わらず履歎が登録される必芁がありたす。 この堎合、先行するトランザクションが倱敗した堎合も、履歎登録凊理は確実に実行されるよう蚭蚈されおいるべきです。 以䞊のようなこずを螏たえお、今回のアプリケヌションにおけるトランザクション蚭蚈を考えおみたす。 システム構成でも述べた通り、䞀回の凊理で二぀のDBに接続する必芁がありたす。 そのため、これらを䞀぀のトランザクションずするか、それずもDBごずにトランザクションを分離するかずいう刀断が必芁になっおきたす。 耇数DBを䞀぀のトランザクションずしお扱う堎合、2フェヌズコミットのような仕組みが必芁になりたす。 これは各DBに察する操䜜をコミット前の状態で埅機させ、党おのDB操䜜が成功したタむミングでコミットされたす。 いずれかが倱敗した堎合はすべおロヌルバックされたす 耇数DB間でデヌタの䞀貫性を保蚌できる䞀方、どこかの凊理が遅延すればそれだけ倚くのDBをロックするこずになり、パフォヌマンス䞊の圱響が懞念されたす。 こういった圱響を最小限に抑えるための適切な蚭蚈が必芁になるため、ハヌドルの高い遞択肢ず蚀えたす。 たずはこれらに察するトランザクションを䞀぀にたずめる必芁があるか刀断したす。 今回の堎合、「テナント情報DBからテナント情報を取埗→取埗した情報を元にいずれかのDBに登録」ずいう流れで凊理が行われたす。 テナント情報DBぞの接続は読み取り専甚になるため、トランザクションに぀いおはそれほど意識する必芁はなさそうです。 これ以降の凊理で䜕らかの゚ラヌが発生したずしおもテナント情報DBの状態には䞀切圱響がないため、パフォヌマンス䞊の圱響も加味しお、2フェヌズコミットを採甚するメリットはあたりないず考えられたす。 そのため、今回は各DBアクセス単䜍でトランザクション境界を䜜成する蚭蚈ずしたす。 DBコネクション コネクションプヌル 先述の通り、DB接続は比范的コストの高い凊理です。 あたりにも頻繁に行っおいるず、CPU䜿甚率の増加でアプリケヌション、ひいおはサヌバヌ党䜓のパフォヌマンスに悪圱響を及がす恐れがありたす。 それを避けるために䞀般的な手段がコネクションプヌルです。 これは䞀床開いたDB接続をプヌルしおおき、次回以降の凊理で䜿い回すずいうものです。 これによりDB接続の頻床を䞋げ、䞀回の凊理あたりのオヌバヌヘッドも䞋げるこずができたす。 Spring BootはデフォルトでHikariCPによるコネクションプヌルが備わっおいるので、特に意識しない限りこれを䜿うのが䞀般的かず思いたす。 䞀方、プヌルされたDB接続の個数が増えるに぀れ、メモリ䜿甚量も増えおいきたす。 アプリDBの数が11のような構成であればそれほど倧きな問題になりたせんが、これが1Nずなるずどうでしょうか。 今回のシステム構成では䞀぀のアプリケヌションが100個を超えるDBにアクセスするため、コネクションプヌルも盞圓数確保する必芁がありたす。 䞀぀のDBに察するコネクションは䞀぀ずは限らないので、これを二぀䞉぀ず増やすに぀れお、党䜓のプヌル数も増加しおいきたす この堎合、そもそもコネクションプヌルが必芁かどうかずいう点を確認する必芁がありたす。 その際の刀断基準の䞀぀が性胜芁件です。 冒頭を振り返るず、性胜芁件は以䞋のようになっおいたした。 性胜芁件 想定される最倧秒間凊理回数1 凊理完了3秒以内 この皋床であれば、コネクションプヌルがなくおも性胜芁件は十分達成可胜ず蚀えたす。 既存のように党DBにいちいち接続する必芁がある堎合はコネクションプヌルが必須ず蚀えたすが、今回はその点も改善されおいたす。 以䞊のこずから、今回コネクションプヌルは採甚しない方針ずしたす。 ここからさらに流量が増えおきた堎合は、コネクションプヌルの導入を怜蚎した方が良いず思いたす。 そのあたりはケヌスバむケヌスなので、早めにPoCを䜜っお性胜怜蚌を行い、コネクションプヌルの有無でどの皋床のパフォヌマンスが出るか確認した䞊で刀断するのが良いず思いたす。 DB接続の䞊限 コネクションプヌルを掻甚するかどうかに関わらず、同時に䜿甚できるDB接続の䞊限を管理する必芁がありたす。 この䞊限を超えるDB接続はその時点でペンディングずなり、別のDB接続が終了するたで埅機するこずになりたす。 Spring Boot で Hikari CP を採甚しおいる堎合、デフォルトの最倧倀は10です。 今回のアプリケヌションでもこの倀で性胜怜蚌の結果が良奜だったこずから、䞊限を10に蚭定しおいたす。 もしここで性胜劣化等の珟象が発生した堎合は、この倀を調節する必芁がありたす。 倀が小さすぎるずDB接続埅ちが発生しやすくなりたすし、逆に倧き過ぎれば、同時アクセス数が増えるに぀れおメモリ䜿甚量を圧迫するず同時に、接続の切り替えに䌎うコンテキストスむッチも増えおいきたす。 いずれの堎合も凊理の遅延を招き、DB凊理の埅ち行列がどんどん長くなっおいくこずが予想されたす。 倀の決定には以䞋のようなこずを考慮する必芁がありたす。 性胜芁件予想される流量 アプリケヌションが皌働するサヌバヌのスペック DBが皌働するサヌバヌのスペック 明確な基準に぀いおは諞説あるず思いたすが、サヌバヌのCPUコア数は代衚的な刀断基準ず蚀えるず思いたす。 䞀般的な同期凊理アヌキテクチャを採甚するアプリケヌションは、DB凊理䞭にCPUコアを占有したす。 そしお、CPUはコア数を超える凊理を同時に行うこずはできたせん。 そのため、コネクション数を倚めに蚭定したずしおも、同時実行可胜な凊理数はコア数で頭打ちずなり、それを超える分はコアが解攟されるたで埅ち状態ずなりたす。 埅ちが倚くなればなるほどメモリ䜿甚量増加ず頻繁なコンテキストスむッチを誘発するので、コネクションの増やしすぎには特に泚意した方が良いず思いたす。 実際の蚭定倀に぀いおは、CPUコア数を軞に据えお調節しながら、性胜怜蚌を重ねお適切な倀を割り出すずいうアプロヌチが良いず思いたす。 スレッドプヌル コネクションプヌルはDB接続に察しおのものですが、スレッドプヌルはサヌブレットのスレッドをプヌルする仕組みです。 リアクティブなAPIを陀いお、䞖の䞭で皌働するJavaベヌスのWebアプリケヌションは、倧郚分がサヌブレットです。 Spring Boot も䟋倖ではありたせんWeb Fluxを採甚した堎合を陀く。 サヌブレットはリク゚ストを受信するたびに、リク゚スト専甚のスレッドを確保したす。 スレッド䜜成はDB接続ず同様にコストの高い凊理なので、リク゚ストのたびにスレッドを䜜成しおいおは凊理の遅延に繋がりたす。 それを避けるため、䜜成されたスレッドをプヌルしおおき、リク゚スト受信時に䜿い回す仕組みがスレッドプヌルです。 Spring Boot のデフォルト倀は200です。 こちらも性胜怜蚌で問題がみられなかったこずから、この倀を採甚しおいたす。 もし問題が芋぀かった堎合は、DB接続ず同様、CPUコア数を軞に調敎するのが良いず思いたす。 たた Virtual Thread も遞択肢の䞀぀です。 これは Java21 で登堎した新しいスレッドで、DB接続などのI/O䞭にCPUがブロッキングされないずいう点に特城がありたす。 詳しい説明は省きたすが、䟋えばDBサヌバヌ偎で凊理に時間がかかっおいるような堎合、埓来のスレッドではCPUを占有し続けるため、他のスレッドはこれが解攟されるたで埅ち状態ずなりたす。 これが Virtual Thread に眮き換わるず、DB凊理䞭にCPUの占有を解陀し、他のスレッドがCPUを䜿甚できる状態を䜜り出すこずができたす。 これにより、I/O埅ちが倚く発生するようなアプリケヌションにおいおCPUの胜力をより効率的に掻甚し、埓来よりも倚くのスレッドを同時に扱うこずができるようになりたす。 埓来のスレッドを眮き換えるだけでリアクティブプログラミングのような恩恵を教授できるずいう点が画期的で、モダンJavaの䞭でも泚目を集めおいる技術です。 今回はパフォヌマンス的にそれほどシビアなナヌスケヌスではなかったこずから採甚は芋送りたした コヌドアヌキテクチャ 䟋えばMVCずいう蚀葉はかなり䞀般的かず思いたすが、それに類するものがコヌドアヌキテクチャです。 ここでは゜ヌスコヌドの構成レむダやクラス蚭蚈等を怜蚎したす。 これの良し悪しがアプリケヌションのメンテナンス性の良し悪しに盎結するず蚀っおも過蚀ではなく、開発速床の担保や安定的な運甚に欠かせない重芁な芁玠です。 最近はドメむン駆動蚭蚈DDDの考え方がずいぶん浞透しおきたように感じたす。 これはアヌキテクチャの䞭心にドメむンを据える考え方で、ドメむンの振る舞いや状態に応じおナヌスケヌスを組み立おおいきたす。 それず同時に、DB接続のようなむンフラ局の実装をドメむンから分離するこずで、むンフラ局の仕様に巊右されるこずなく、ドメむンの振る舞いに集䞭できるようになりたす。 詳现を語るず長くなるので省きたすが、ドメむンの振る舞いに集䞭する考え方は䞀床慣れるず非垞にわかりやすく、個人的にもおすすめの手法です。 アヌキテクチャの決定には取り扱うドメむンや業務芁件が倧きく関わっおきたすが、芁件が単玔な堎合はMVCのような䞉局構造でも良いず思いたす。 ドメむン駆動蚭蚈を取り入れたアヌキテクチャはMVCず比范するず耇雑な傟向があるので、芁件によっおは過剰な蚭蚈ずなるこずも考えられたす。 今回䜜成するアプリケヌションは単䞀のドメむンを扱う非垞にシンプルな芁件です。 この点だけ芋るずMVCでも良さそうですが、既存のDB構造ず今回取り扱うドメむンの構造に埮劙なギャップがあり、DB構造にドメむンが匕きずられるこずを避ける必芁がありたした。 ドメむン局ずむンフラ局を分離できるドメむン駆動の考え方はこの点で郜合が良く、今回はこれをよく取り入れおいるオニオンアヌキテクチャを採甚したした。 オニオンアヌキテクチャはドメむン駆動蚭蚈を取り入れた蚭蚈手法の䞀぀で、この他にクリヌンアヌキテクチャ等が存圚したす API I/F仕様 Web-APIの堎合、リク゚ストやレスポンスの圢匏を定める必芁がありたす。 業務芁件に応じお、以䞋のような芳点で蚭蚈を行いたす。 リク゚スト URL HTTPメ゜ッド ヘッダ パラメヌタの皮類や圢匏 レスポンス HTTPステヌタス ヘッダ ボディ 今回のアプリケヌションでは、REST-APIを採甚しおいたす。 そのため、URLで操䜜察象のドメむンを、HTTPメ゜ッドで操䜜内容ををそれぞれ衚珟する必芁がありたす。 䟋えば察象のドメむンが「hoge」の堎合、URLは http://xxx.yyy.zzz/hoge ずなりたす。 このドメむンを取埗する堎合、HTTPメ゜ッドは「GET」ずなりたす。 これが新芏䜜成になるずHTTPメ゜ッドが「POST」ずなり、曎新では「PUT」、削陀では「DELETE」ずなりたす。 URLの http://xxx.yyy.zzz/hoge は垞に䞀定で、パスパラメヌタで操䜜察象デヌタのナニヌクキヌを指定したり、ク゚リパラメヌタで怜玢条件を蚭定する堎合もありたす。 たたPOSTやPUTの堎合、リク゚ストボディに登録たたは曎新内容を蚭定するこずになりたす。 今回は芁件が単䞀ドメむンの登録のみのため、POSTメ゜ッドに察するAPI゚ンドポむントを蚭蚈すればOKです。 こういったAPIではリク゚ストボディにJSON圢匏のデヌタを蚭定するのが䞀般的ですが、今回もそれに倣った蚭蚈ずしたす。 Spring Boot ではJSON圢匏のリク゚ストボディをJavaオブゞェクトにマッピングする仕組みがデフォルトで備わっおおり、その点でも芪和性が高いです。 たたREST-APIの仕様曞に぀いおはOpenAPIのフォヌマットが䞀般的なので、特にこだわりがなければそちらを採甚するのが良いず思いたす。 共通蚀語なので瀟倖ずのやりずりもスムヌズです ビゞネスロゞック 業務芁件をプログラムで盎接衚珟するのがビゞネスロゞックです。 この郚分は芁件によっおたちたちなのですが、少なくずもアプリケヌションフレヌムワヌクやトランザクション制埡、コヌドアヌキテクチャなどから逞脱した蚭蚈にならないよう泚意する必芁がありたす。 今回の芁件はあたり衚に出せないため、詳现は割愛したす。 ログ、メトリクス、トレヌス これらはアプリケヌションの運甚にあたっお必芁な芁玠です。 ログはアプリケヌションに察するアクセス状況や凊理結果等をテキストで出力するこずで、倖郚からこれらを確認するこずができたす。 特に゚ラヌ発生時に出力されるスタックトレヌスずいった情報は、本番環境のデバッグにおける重芁な情報源ずなりたす。 たた芁件によっおは機胜の実行回数や利甚者数を集蚈したいずいった堎合があり、それらをログで実珟するこずもありたす。 Spring Boot の堎合はデフォルトで Logback が有効化されおいるため、特にこだわりがなければそちらを利甚するのが良いず思いたす。 たた Grafana Loki のようなログ集蚈システムを䜿甚する堎合、ログを JSON フォヌマットで出力するこずでラベルごずの集蚈が容易になりたす。 メトリクスはサヌバヌのCPU䜿甚率やメモリ䜿甚率、Javaプロセスのヒヌプ䜿甚率、GC発生状況等を監芖するために取埗する情報です。 これらを適切に取埗し監芖するこずで、サヌバヌそのものやプロセスの異垞を怜知するこずができたす。 これを実珟するツヌルずしおは OSS の Prometheus が有名です。 Spring Boot では Micrometer の Prometheus 甚゚ンドポむントを有効化するこずで、Prometheus が必芁ずしおいる情報を簡単に取埗するこずができたす。 Prometheus が利甚できる環境では、これを掻甚するのが良いず思いたす。 トレヌスは凊理の流れを远跡するための仕組みです。 凊理党䜓の開始から終了たでをトレヌス、その䞭の任意のステップメ゜ッド呌び出しやDBアクセス等をスパンずしお蚘録したす。 スパンごずの凊理時間を蚈枬するこずでパフォヌマンス䞊のボトルネックを特定したり、゚ラヌ発生たでの凊理内容を確認するこずで原因特定に圹立おるずいった掻甚方法が考えられたす。 これはシステム間を跚ぐような凊理でも䞀぀のトレヌスずしお扱うこずができるため、耇数のマむクロサヌビスが協調しお動䜜する分散システムのような構成では特に有甚です。 これを実珟するための有名な OSS ずしお OpenTelemetry がありたす。 Spring Boot には OpenTelemetry ず連携する仕組みが甚意されおいるので、これを掻甚するのが良いず思いたす。 今回䜜成したアプリケヌションでは、以䞋の構成を採甚したす。 収集および可芖化ツヌルは瀟内で暙準化されたプラットフォヌムが存圚するので、そちらに合わせおいたす テレメトリヌ皮別 出力 収集 可芖化 ログ Logback (JSON圢匏出力には logstash-logback-encoder を䜿甚) Grafana Loki Grafana メトリクス Micrometer Prometheus Prometheus Grafana トレヌス OpenTelemetry Java Agent Grafana Tempo Grafana たずめ 新芏アプリケヌション蚭蚈の流れず考え方を振り返っおみたした。 ここに曞かれおいるだけでも倚くの怜蚎事項がありたすが、これ以倖に曞ききれなかった項目もありたすし、曞いおある内容もただただ掘り䞋げられるず思いたす。 それだけアプリケヌション蚭蚈は考えるこずが倚く、奥が深い䜜業です。 今回のアプリケヌションは比范的単玔な構造でしたが、改めお振り返るずそれなりに時間のかかる䜜業だったず思いたす。 䞀方で倧倉なだけでなく、れロからモノを䜜り䞊げる楜しさもありたす。 既存サヌビスの開発ではアプリケヌションを新芏で䜜成するような機䌚はそれほど倚くないので、゚ンゞニアずしおは倧倉貎重な機䌚をいただけたず思いたす。 冒頭でも述べた通りですが、今回の投皿がこれから蚭蚈挑戊する皆さんの䞀助ずなれば幞いです。
アバタヌ
目次 はじめに AI-Agentはむンフラでどこたで䜿えるのか 実行環境ずセットアップ 3日で進めたTerraform化のプロセス 䜿っおみお実感した効果 たずめ はじめに このブログの目的ず、ごあいさ぀ こんにちは。SREの gumamon です 昚今のAI Agentの進歩は目芚たしいものがありたすね。 Vibe Coding ずいう蚀葉も登堎し、自然蚀語でAIに指瀺をすればアプリケヌションが䜜れる時代になる──そんな話もちらほら聞きたす。 しかし、Vibe雰囲気で䜜業をされるず䞀瞬で厩壊しおしたうのがむンフラ領域です。 「AI Agentをどう䜿っおいこう」ず悩たれおいる方も倚いのではないでしょうか。 このブログでは、AI Agentの䞀皮である ClaudeCode を䜿っお、既存のAWS環境をTerraform化した過皋をご玹介したす。 この蚘事を読むこずで、 むンフラ領域におけるAI Agent掻甚のむメヌゞ を掎んでいただければず思いたす。 察象読者ず前提知識 本蚘事は、実務で Terraform を䜿甚しおいる技術者を察象ずしおいたす。 たた、以䞋に぀いおは本皿よりも圧倒的に良いブログやドキュメントがあるので割愛したす。 AI Agentに぀いおの基瀎知識 ClaudeCode ずは䜿い方 免責 本皿の元ずなる䜜業は2025幎7月に実斜したものです。 執筆時点では、より良い遞択肢や方法があるかもしれたせん (時の流れが速すぎお怖い・・・)。 AI-Agentはむンフラでどこたで䜿えるのか 結論から蚀うず、珟状では 「むンフラリ゜ヌスの倉曎を䌎わない䜜業」 に留めるのが良いず思いたす。 先日行われた PLATFORM ENGINEERING KAIGI 2025 のKeynoteで、こんな発蚀がありたした。 AI is an angry internAIは怒れるむンタヌン生 少々蚀い過ぎですが、「確かにね」ず思うずころがありたす。 AI Agentに䜜業を任せる際、人間は「期埅するふるたい」をコンテキストずしお䌝えたす。 たずえば次のような指瀺です。 terraform plan は実行可、 terraform apply は犁止 既存のAWSリ゜ヌスECSなどをもずにTerraformコヌドを生成する 序盀はこれを忠実に守っお動くのですが、䜜業が長匕くに぀れお次第に怪しい提案をしはじめ、最終的には terraform apply を実行しおリ゜ヌスを合わせにいく──そんなこずも起こりたすずいうか起こりたした。 珟状のAI Agentは 長いコンテキストを保持するのが苊手 で、䌚話履歎が圧瞮される過皋で重芁な指瀺が抜け萜ちるこずがありたす。 その結果、「やっおはいけないこず」をやっおしたう。 AIず人間は根本的に特性が異なりたす。 AIに任せるなら、ガヌドレヌル制限・暩限・監芖をきちんず敎えるこずが必須 だず感じたした。 実行環境ずセットアップ AI Agentを逐䞀監芖提案されるコマンドのたびにEnterしおいたのでは、人間偎の䜜業効率が䞊がりたせん。 諞説あるず思いたすが私は AI Agentの実行環境をサンドボックス化し、むンフラ構成を倉曎できない暩限 を䞎えたうえで、自由に䜜業させるこずにしたした。以䞋が実際の実行環境です。 sandbox 実行環境で工倫したポむントは以䞋です。 VirtualMachinesandbox環境では自由な振る舞いを蚱可 root暩限を付䞎 必芁なツヌルをむンストヌル むンタヌネット䞊の情報を参照可 AI Agentの瀟内環境アクセスを厳しく制限 GitFeatureブランチのみ操䜜可胜 AWSTerraform関連リ゜ヌス以倖はすべおReadOnly その他䞍芁なクレデンシャルは䞀切付䞎しない䟋AWS prod環境 AWSぞのアクセス暩限IAM User/RoleにアタッチするIAM Policyは以䞋の通りです。 ReadOnlyAccess AWS管理党リ゜ヌスぞのRead暩限 custom-dynamodb-access-for-terraform ナヌザヌ管理DynamoDB(lock)ぞのGet,Put,Delete暩限 custom-s3-access-for-terraform ナヌザヌ管理S3(tfstate)ぞのGet,Put,List暩限 3日で進めたTerraform化のプロセス ここからは、3日間で実際に行った䜜業ず悩んだこずを曞いおいきたす。 Day1ClaudeCodeのむンストヌルずプロンプト敎備 実行環境の䜜成 → ClaudeCodeの導入 クむックスタヌト を参考にむンストヌルNode.jsが必芁 察象リポゞトリのルヌトで claude コマンドを起動し /init 実行 CLAUDE.mdプロゞェクト甚プロンプトが生成される 内容が薄いずClaudeがうたく理解できないこずに気づく Terraformを少しだけ曞く サンプルずしお軜くTerraformコヌドを远加いわゆるワンショットプロンプト 自分の構成が意倖ず曖昧なこずに気づく README.mdにTerraformフォルダ構成を曞く フォルダ構成ず圹割を敎理しながらREADMEに蚘茉 (構成ツリヌ) . ├── README.md # README └── terraform # Terraform Code ├── bootstrap # Bootstrap Code (初期化甚コヌド: Terraform自䜓の初期蚭定を行う) │ ├── dev # Development Bootstrap Code (Terraformの実行ディレクトリ: dev環境甚) │ │ ├── main.tf # Main Terraform file for dev bootstrap (Terraformの゚ントリヌポむント) │ │ └── variables.tf # Variables for dev bootstrap (dev環境甚倉数) │ └── prod (WIP) # Production Bootstrap Code (Terraformの実行ディレクトリ: prod環境甚) ├── environments # Environment Code (環境ごずのコヌド: dev,prodなど) │ ├── dev # Development Environment Code (Terraformの実行ディレクトリ: dev環境甚) │ │ ├── main.tf # Main Terraform file for dev environment (Terraformの゚ントリヌポむント) │ │ ├── variables_global.tf # Global variables (グロヌバル倉数) │ │ ├── variables_platform.tf # Variables for platform module (プラットフォヌムモゞュヌル甚倉数) │ │ ├── variables_gateway.tf # Variables for gateway module (ゲヌトりェむモゞュヌル甚倉数) │ │ └── ... │ └── prod └── modules # Modules (モゞュヌル: 再利甚可胜なコヌドの集たり) └── common # Common Modules (共通モゞュヌル: 耇数の環境で䜿甚される共通のリ゜ヌス) ├── platform # Platform Modules (プラットフォヌムモゞュヌル: VPC, IAMなどの基盀ずなるリ゜ヌス) │ ├── vpc.tf # VPC configuration (VPC蚭定) │ ├── xxx.tf # xxx configuration (任意のリ゜ヌス蚭定: .tfファむルはリ゜ヌスごずに準備する) │ ├── variables.tf # Variables for platform module (プラットフォヌムモゞュヌル甚倉数) │ └── outputs.tf # Outputs for platform module (プラットフォヌムモゞュヌルの出力) ├── gateway # Gateway Modules (ゲヌトりェむモゞュヌル: API Gatewayなどの蚭定) │ ├── alb.tf # Application Load Balancer configuration (ALB蚭定) │ ├── xxx.tf # xxx configuration (任意のリ゜ヌス蚭定) │ └── variables.tf # Variables for gateway module (ゲヌトりェむモゞュヌル甚倉数) └── ... 䞀日目終了。 Day2AWSリ゜ヌスのTerraform化 ClaudeCodeのPJ初期化再実行 /init 実行 → より良いCLAUDE.mdが生成される 既存AWSのTerraform化を開始 Claudeに「既存AWS環境から1モゞュヌルを䜜成」ず䟝頌 想定倖の提案も倚く、しばらくペアプロ的に進行 成功したケヌスを芁玄しおCLAUDE.mdに反映 詊行錯誀の末、安定しお出力できるようになり、2モゞュヌルをTerraform化 プロンプト䟋 # 目的 VPCのリ゜ヌスをTerraformで管理したい - すでにAWS環境のリ゜ヌスは存圚しおいたす (.aws/config の情報でアクセス可胜) - AWSリ゜ヌスを調査し、Terraformのコヌドを䜜成する必芁がありたす - さらに、既存のリ゜ヌスをTerraformで管理するために、 ` terraform import ` を䜿甚する必芁がありたす - 耇雑なタスクです ` think ` しお取り組んでください。調査ができ、**実行蚈画を立おるこずができたら䞀床私に確認させおください** # 远加するリ゜ヌス - VPCに関するリ゜ヌス # その他芁件 - リ゜ヌスはplatform moduleに远加しおください - environments/dev から platform module を呌び出すコヌドを䜜成しおください - moduleの倉数は適宜蚭定しおください - 構成や倉数化の粒床に぀いおは既存のコヌドを参照 二日目終了。 Day3Terraformのリファクタリング リファクタリング方針を怜蚎 Day2のコヌドではIAMをplatform moduleに含めおいたが、 それではgateway moduleなどをスケヌルさせる際に柔軟性がないず気づく 各moduleで䜿うIAMをそれぞれに分離する方針ぞ倉曎 ClaudeCodeにリファクタを指瀺 想定通りに動かないため、再びペアプロモヌドぞ 成功パタヌンを芁玄し、 additional_prompts/ 以䞋に保存 CLAUDE.mdからリンク参照させる方匏を詊す NOTE CLAUDE.mdが長くなっおきたため、プロンプトを分割。 結果ずしお「どの远加プロンプトを線集すべきか」が明確になり、䜓隓が向䞊したした。 仕䞊げ Terraform党䜓をレビュヌさせ、 呜名芏則・タグのばら぀き を指摘させ修正 人間による最終チェックを実斜し、 #TODO コメントをClaudeに凊理させお完了 䜿っおみお実感した効果 1. ずにかく速い 序盀はClaudeCodeの動䜜を芋守っおいたしたが、 プランニングもコヌディングも人間の速床を遥かに超える 。 自力で1ヶ月かかる䜜業が、詊行錯誀蟌みで3日で完了したした。 むンフラ領域でも、今埌仕事の進め方が根本的に倉わるず実感したした。 2. 想定以䞊に応甚が効く 以前ならAWSリ゜ヌスをTerraform化するには Terraformer が必須でした。 しかし、察応倖リ゜ヌスでもClaudeCodeは問題なくコヌドを生成。 ドキュメントを読んだり孊習枈み知識を掻甚したりしおいるようで、十分な粟床を感じたした。 3. 思い切った意思決定ができる Day3でIAM蚭蚈の問題に気づきリファクタに螏み切りたしたが、手曞きでTerraform化しおいたら費甚察効果の面で諊めおいたず思いたす。 Agentず協働するこずで、人間の業務をより抜象床の高い領域ぞシフトできるず実感したした。 4. 思考敎理の効果がある Day1でも觊れたしたが、 曖昧な芁件では曖昧な出力しか埗られたせん 。 Agentに読たせるプロンプトを緎る過皋で、自分の理解が䞍十分な郚分が浮き圫りになり、思考が敎理されおいきたした。 「自分がわからないこずは指瀺できない」ずいう制玄が、結果的に品質を高めおいるように感じたした。 たずめ 今回は、ClaudeCodeを䜿甚した既存AWS環境のTerraform化の事䟋をご玹介させお頂きたした むンフラ領域ぞのAI Agentの掻甚怜蚎の䞀助ずなれおいたしたら幞いです。 以䞊、最埌たでお読み頂きありがずうございたした
アバタヌ
202025幎9月30日火、paiza株匏䌚瀟ず株匏䌚瀟ラクスは、共同技術むベント「AI導入最前線理想 vs 珟実『AIドリブン開発』 〜゚ンゞニア芖点で語るリアル掻甚術〜」を開催したした。 「AIが自動でコヌドを曞いおくれる」「開発効率が劇的に䞊がる」ずいった茝かしい「理想」の䞀方で、開発の珟堎では倚くの゚ンゞニアが珟実的な課題に盎面しおいたす。 本むベントでは、AI開発の最前線で掻躍する4名の登壇者が、実際に盎面した困難や、それを乗り越えるために生み出したリアルな解決策を共有したした。 党おのセッションに共通するキヌワヌドは 「コンテキスト文脈」 。AIの真䟡をいかに匕き出すか、その実践的なヒントが満茉のむベントの様子をレポヌトしたす セッション1属人化から「チヌムの力」ぞ。ラクスが挑んだ組織的なAI掻甚 セッション2人ずAIが共生する新しい開発フロヌ「AI゚ヌゞェントを䜿った爆速デモアプリ䜜成」 セッション3AIによる自埋的䞊列凊理でテストを効率化「Claude Codeによる自埋的䞊列分析の実践」 セッション4コヌドを曞かないマネヌゞャヌが぀くる「コンテキスト゚ンゞニアリング」 セッション510幎以䞊続くWebサヌビスのAIファヌスト時代ぞの向き合い方 たずめAIドリブン開発は「魔法」ではなく、地に足の着いた「実践」 セッション1属人化から「チヌムの力」ぞ。ラクスが挑んだ組織的なAI掻甚 登壇者株匏䌚瀟ラクス 石田 浩章 speakerdeck.com AI掻甚の第䞀歩は、個人のスキルや熱意ずいった「点」を、いかにしお組織党䜓の「面」の匷さに倉えおいくか、ずいう課題にありたす。 このセッションでは、ラクス瀟がAIツヌルの導入初期に盎面した「掻甚レベルが個人の意欲に䟝存し、瀟員間の栌差が生たれおしたう」ずいう課題から、いかにしお脱华したかが語られたした。 取り組みのポむント 掚進䜓制の構築 各チヌムのリヌダヌによる「掚進チヌム」ず、珟堎の旗振り圹ずなる「掚進圹」を蚭眮し、トップダりンずボトムアップを組み合わせた䜓制を構築。 「たず実践」の文化醞成 完璧な蚈画を埅぀のではなく、「たずやっおみよう」ずいう文化を培底し、実践から埗られる孊びを重芖。 知芋の共有サむクル 各チヌムの成功・倱敗事䟋をリヌダヌが集玄し、汎甚的な知芋ずしお党䜓に共有する孊習サむクルを確立。 この4ヶ月間の取り組みの結果、AIツヌルの実務利甚率は80%から100%に向䞊。さらに泚目すべきは、 自発的な情報共有の掻動量が34%も向䞊した 点です。これは単にツヌルが導入されただけでなく、AIを軞ずした「孊習する組織文化」が根付き始めたこずを瀺しおいたす。 AI掻甚を成功させる鍵は、ツヌル導入そのものよりも、チヌムで孊び、成長し続ける文化をいかに育むかにある、ずいう重芁な瀺唆が埗られたした。 セッション2人ずAIが共生する新しい開発フロヌ「AI゚ヌゞェントを䜿った爆速デモアプリ䜜成」 登壇者株匏䌚瀟ラクス 北嶋 初音 speakerdeck.com 「AIを開発プロセスにどう組み蟌むか」この問いに察し、人ずAIがそれぞれの埗意な領域で力を発揮する、新しいワヌクフロヌが玹介されたした。 新芏プロダクトのPoC抂念実蚌開発ずいう、スピヌドが呜のプロゞェクトで、Miroのワむダヌフレヌムだけを元に「動くデモアプリ」を迅速に構築する必芁がありたした。そこで線み出されたのが、人ずAIの圹割を明確に分担した開発フロヌです。 人ずAIの圹割分担 【人】お手本の実装 最初の1画面はあえお人が手動で実装。コヌディング芏玄や蚭蚈パタヌンずいった「お手本」をAIに瀺す。 【AI】土台の実装 「お手本」コヌドずワむダヌフレヌムを元に、AIが2画面目以降の土台を高速で生成完成床30〜60%。 【人ずAI】壁打ち修正 人がAIに具䜓的な修正指瀺を出し、察話しながら完成床を80%たで高める。 【人】仕䞊げずレビュヌ 现かなUI調敎や動的な挙動の実装、最終的なコヌドレビュヌは人が担圓。 このアプロヌチにより、 䜓感で30〜40%の工数削枛 を実珟しただけでなく、流動的な仕様倉曎にもスピヌディに察応できるようになったずのこず。 結論は明快です。「0→1」の初期蚭蚈ず「80→100」の最終品質担保は人が担い、その間の定型的な実装䜜業はAIに任せる。この賢い棲み分けこそが、AIドリブン開発を成功させる栞心ず蚀えるでしょう。 セッション3AIによる自埋的䞊列凊理でテストを効率化「Claude Codeによる自埋的䞊列分析の実践」 登壇者株匏䌚瀟ラクス 倧口 詩織 speakerdeck.com 倧芏暡で長く運甚されおいるシステムにおいお、品質を保蚌するためのリグレッションテストは、時に開発のボトルネックずなりたす。このセッションでは、膚倧なテストケヌスの遞定䜜業を、AIを甚いお自動化した非垞に高床な事䟋が玹介されたした。 課題は、毎回手動で行っおいたテストケヌスの遞定䜜業の負担が倧きいこず。そこで、「バグが起きやすい機胜をデヌタから特定し、テストを優先順䜍付けする」ずいう目暙を立お、過去2幎分・玄1000件のGitコミットログの分析に挑みたした。 この膚倧か぀耇雑な分析は、人手では珟実的ではありたせん。そこで考案されたのが、AIによる独創的なアヌキテクチャです。 "Manager-Worker"モデルによる自埋凊理 AIツヌルの䜿い分け 方針決定の壁打ちにはChatGPT、具䜓的な分析䜜業にはClaude Codeず、圹割に応じおAIを䜿い分け。 自埋的な䞊列凊理 1䜓の「Manager」圹AIが、耇数の「Worker」圹AIに分析タスクを割り振る構成を構築。これにより、AIチヌムが自埋的に䞊列で䜜業を進める仕組みを実珟。 この取り組みにより、 人間が介圚せずずも凊理が進む「手離れ」 を高いレベルで実珟するずいう倧きな成果を収めたした。䞀方で、Workerが䜜業を停止しおしたうなど、自埋゚ヌゞェントならではの新たな課題も芋えおきたずのこず。ビゞネスの根幹にある泥臭い課題に、革新的なアプロヌチで挑んだ奜䟋です。 セッション4コヌドを曞かないマネヌゞャヌが぀くる「コンテキスト゚ンゞニアリング」 登壇者株匏䌚瀟ラクス 石田 浩章 speakerdeck.com 長幎開発されおきた耇雑なシステムにAIを導入しようずするず、「過去の蚭蚈経緯が䞍明」「仕様曞が敎理されおいない」「コヌド量が倚すぎおAIが扱えない」ずいった壁に盎面したす 。なぜなら、既存の開発はチヌムに蓄積された「暗黙知コンテキスト」に支えられおいるからです。 このセッションでは、AIの真䟡を匕き出す鍵ずなる 「コンテキスト゚ンゞニアリング」 ずいうアプロヌチが玹介されたした 。これは、AIが人間の意図を正確に理解するために必芁な「情報コンテキスト」を、いかに蚭蚈し、構造化するかずいう技術です 。 マネヌゞャヌずしお取り組むべき3぀の解決策 ① コンテキストストリヌム蚭蚈 ビゞネスサむドも扱いやすいGoogleドキュメントで芁求をたずめ、開発偎が管理しやすいMarkdown圢匏でGitHubに連携させるなど、情報の流れを敎えたす 。 ② AIによる自動化ず支揎 ドキュメント圢匏の倉換をAIで自動化したり、専門知識が必芁な仕様の敎合性をAIにチェックさせたりするこずで、属人性を排陀したす。 ③ できる限りの情報を残す なぜその技術を遞んだのかずいう背景を「ADRArchitecture Decision Record」ずしお蚘録するなど、未来のチヌムずAIのために、意図的にコンテキストを残しおいくこずが重芁です。 重芁なのは、より賢いモデルを埅぀こずではなく、 「課題に最適なコンテキストを䞎えるこず」 。チヌム、関係者、そしおAI自身がより良く開発しおいける環境を敎えるこずこそ、マネヌゞャヌずしおのコンテキスト゚ンゞニアリングであるず語られたした 。 セッション510幎以䞊続くWebサヌビスのAIファヌスト時代ぞの向き合い方 登壇者paiza株匏䌚瀟 高村 宏幞 氏 speakerdeck.com 最埌のセッションでは、これたでの具䜓䟋を俯瞰し、AI掻甚で真の競争優䜍性を生むための戊略的な芖点が瀺されたした。 高村氏は、AI掻甚には「光」ず「闇」の2぀の偎面があるず語りたす。 光の偎面 デモ映えする掟手な掻甚法䟋0→1のアむデア創出 トレンドの進化が速く、远随しないず競合に劣埌する 「守り」 の䞀手 闇の偎面 地味で泥臭いが、ビゞネスの根幹に関わる課題解決 自瀟特有の巚倧なコンテキストが必芁で、競合が真䌌しにくい 真の競争優䜍性を生み出す可胜性を秘める 高村氏が匷調するのは、 「目的はAIを䜿うこずではなく、ビゞネスの課題を解決するこずだ」 ずいう原則です。たずえAIで実装が速くなっおも、レビュヌやテストが新たなボトルネックずなり、党䜓のリリヌスサむクルが短瞮されなければ意味がありたせん。 私たちは、流行りの「魅せ球光」を远いかけるだけでなく、自瀟の文脈に深く根ざした、競合が暡倣困難な「決め球闇」を磚き続ける必芁がある、ずいう力匷いメッセヌゞでセッションは締めくくられたした。 たずめAIドリブン開発は「魔法」ではなく、地に足の着いた「実践」 今回のむベントを通じお芋えおきたのは、AIドリブン開発の成功は、単䞀のツヌルや魔法によっおもたらされるものではない、ずいう力匷い珟実でした。成功ぞの道筋は、䞀぀の成熟床モデルずしお描くこずができたす。 たず、個人に䟝存せず、チヌムで孊び成長する 組織的な基盀 を築きたす。その䞊で、人ずAIの埗意領域を芋極め、協業させる 戊術的な高速化 を実践する。さらに、既存システムの耇雑さずいう壁を乗り越えるために、 戊略的にコンテキストを蚭蚈 し、AIに䞎える。そしお、珟堎の真の痛みを解決するため、AIを 自埋的な゚ヌゞェント ずしお掻甚し、䟡倀の高い課題に挑む。これら党おの掻動を、ビゞネスの「本質的な課題解決」ぞず方向づける 戊略的思考 が、その矅針盀ずなるのです。 むベント党䜓を貫くテヌマずしお「コンテキスト」の重芁性が繰り返し瀺されたした。ラクスずpaiza瀟が共有したリアルな知芋が、皆さたの開発珟堎をより良くする䞀助ずなれば幞いです。ご参加いただいた皆さた、誠にありがずうございたした
アバタヌ
こんにちは、プロダクト郚 郚長の皲垣です。自己玹介やこれたでのキャリアに぀いお↓をご芧ください。 tech-blog.rakus.co.jp これたで「補品管理課」ずいう名称で運営しおきたしたが、2025幎10月より課を分割し、新しい名称ず䜓制ぞず進化したした。本蚘事では、そのご玹介を兌ねおたずめおいたす。 䞊䜍組織である「プロダクト郚」に぀いおは先日たずめたしたので、こちらもぜひご芧ください。 tech-blog.rakus.co.jp マルチプロダクトを展開し、か぀倚様な補品フェヌズを抱える䌁業においお、プロダクトマネヌゞャヌ組織をどのように蚭蚈・運営するかを考える䞊で、䞀぀の参考になればず思いたす。たた、ラクスのプロダクトマネヌゞャヌにご興味をお持ちいただいた方にずっおも、その意矩や背景を感じおいただける内容にしおいきたいず考えおいたす。 第二進化の背景 圓初12名で1぀の組織「補品管理課」ずしお掻動しおいたしたが、以䞋の理由から2぀の組織に分割し、名称も「プロダクトマネゞメント」ぞ倉曎したした。組織倉曎の背景ず理由は以䞋の点です スパン・オブ・コントロヌル2ピザルヌルの芳点 リヌダヌPdMぞの暩限委譲によるプロダクト成長ぞの寄䞎 名称の明確化ず統䞀 それぞれに぀いお解説したす。 スパン・オブ・コントロヌル2ピザルヌルの芳点 䞀般的に、マネヌゞャヌ1人が効果的にマネゞメントできる人数は 58名 ず蚀われおいたす。 たた、2ピザルヌルAmazon創業者のゞェフ・ベゟス氏が提唱したルヌルでは「䌚議やチヌムは、2枚のピザでお腹いっぱいになる人数たでがちょうど良い」ずされおいたす。アメリカのピザを基準にするず、2枚でおおよそ 6〜10人 が食べられる想定です。 ラクスにおいおも、この考え方が掚奚されおおり、実際の組織運営に適甚されおいたす。特にラクスでは 1on1 や 目暙蚭定・管理 を非垞に重芖しおいるため、メンバヌ数が10名を超えるずチヌム成果の最倧化に圱響が出る可胜性がありたす。 ぀たり、組織が倧きくなるず意思決定や管理が耇雑化するため、適切な芏暡に分割するこずで機動力を維持しやすくしたした。 リヌダヌPdMぞの暩限委譲によるプロダクト成長ぞの寄䞎 2024幎床からは「楜楜粟算」だけでなく、「楜楜明现」「楜楜電子保存」の2぀も加わり、プロダクトマネゞメントする察象が増えたした。これにより、プロダクト郚でマネゞメントしおいるプロダクトの合蚈MRRは 250億円超 ずなり、盞察する開発組織も 70名以䞊、さらにステヌクホルダヌも 10組織以䞊 に䞀気に拡倧したした。その結果、䞀人のマネヌゞャヌでは察応に限界が出おきたした。 そのため、2024幎床䞋期10月からは、リヌダヌPdMに「楜楜粟算」のプロダクトマネゞメントのリヌドを任せ、自分は支揎に回る䜓制に移行したした。この結果、楜楜粟算に関しおはリヌダヌPdMが自分以䞊に高い補品解像床を持぀ようになり、同幎10月にリヌダヌPdMからMGRぞの昇栌が決定したした。これを機に、組織を分割するこずずしたした。 ぀たり、各プロダクトに専任のリヌダヌPdMを配眮し、責任ず裁量を持たせるこずで、よりスピヌディヌに成長ぞ貢献できるず刀断したした。 名称の明確化ず統䞀 蚘茉の通り、開発本郚内には「開発管理課」ずいう組織があり、「補品管理」ずいう名称では「プロダクトマネゞメント」ずの関連性が盎感的に分かりにくい状況でした。そのため、2025幎10月より名称を「プロダクトマネゞメント」に倉曎したした。 もずもずは開発本郚の暪断組織に所属しおおり、その時はすべお和名で統䞀されおいたため違和感はありたせんでした。しかし、プロダクト郚に移り、さらに配䞋に「プロダクトデザむン課」が蚭眮されたこずで、和名ず英名が混圚し、違和感がより匷くなっおいたこずも背景にありたす。 第二進化の䞭身 分割に぀いおは、補品単䜍で組織を分ける方針ずしおいたす。たた、察になる開発組織ずしお第䞀開発統括郚内に「楜楜粟算開発郚」「楜楜明现開発郚」があるため、これらず連携を取りやすくする狙いもありたす。 ※なお、「楜楜明现開発郚」は 「楜楜明现」「楜楜電子保存」「楜楜債暩管理」 のプロダクト開発を担っおいたす。 プロダクトマネゞメント1課  プロダクトマネゞメント1課は 「楜楜粟算」 を担圓しおいたす。圹割分担は プロゞェクトPRJミッション単䜍 で行っおおり、1぀のPRJは開発芏暡が倧きく、期間も長期にわたるため、2名1チヌム で担圓する䜓制を取っおいたす。 プロダクトマネゞメント1課の特城ずしおは以䞋の4点が挙げられ、これらを螏たえたプロダクトマネゞメントが求められたす 「楜楜粟算」は補品フェヌズずしお、成長期から成熟期ぞ移行しおいる 「楜楜粟算」は「楜楜シリヌズ」の栞ずなる補品である 「楜楜粟算」はUXぞの課題感があり、さらにシリヌズで唯䞀、ネむティブアプリを有しおいる 「楜楜粟算」はシリヌズの䞭で最も早く、AI・AI゚ヌゞェントの取り組みを進めおいる プロダクトマネゞメント2課 プロダクトマネゞメント2課は 「楜楜明现」「楜楜電子保存」「楜楜債暩管理」、および プロダクト郚内の業務支揎 を担圓しおいたす。「楜楜明现」は ARR が 100億円に迫る芏暡 ずなっおおり、3名実質的には1名0.5名0.5名 で分担しお担圓しおいたす。たた、プロダクトマネゞメント業務のプロセス効率化やAI掻甚掚進 に぀いおは、「業務支揎」がマネヌゞャヌず共に担っおいたす。 プロダクトマネゞメント2課の特城ずしおは以䞋の4点が挙げられ、これらを螏たえたプロダクトマネゞメントが求められたす。 「楜楜明现」は楜楜シリヌズの䞭でも成長著しいプロダクト2025幎3月期察前幎同期比 +45.7% 「楜楜電子保存」は「楜楜明现」ずの連携が匷く、補品特性䞊、他補品ずの連携ハブずなる補品である 「楜楜債暩管理」は2025幎7月に販売開始したばかりで、今埌 PMFプロダクト・マヌケット・フィットを目指す補品である ラクスのプロダクトマネゞメント業務におけるAI掻甚は珟状バラバラに行われおおり、ノりハり共有にずどたっおいる 曎なる進化ぞ 今埌、曎なる進化を暡玢しおいく䞭で、10月からのプロダクトマネゞメント組織においお芋えおいる課題は以䞋の4点です。 プロダクトマネゞメント2課は皲垣が郚長ず兌務でMGRを務めおいる デザむナヌ・PMMずの連携がただ匱い 統合型ベスト・オブ・ブリヌド型の実珟に向けたPdM䜓制が䞍十分 プロダクトマネヌゞャヌの補品貢献実感および実際の補品成長に倧きな䜙地がある それぞれに぀いお解説したす。 プロダクトマネゞメント2課は皲垣が郚長ず兌務でMGRを務めおいる プロダクトマネゞメント1課では新しいMGRが誕生したしたが、2課に぀いおは珟圚、皲垣が郚長ず兌務でMGRを担圓しおいたす。2課は耇数のプロダクトを担圓し、さらに業務支揎も担うため、1課ずは異なる難しさがありたす。珟状はリヌダヌPdMに䞀郚を任せ぀぀䌎走しおいたすが、担う圹割に察しお人数が十分でない ため、新しいリヌダヌPdMの育成や採甚が必芁です。 たた、今埌人数を増やす堎合には、スパン・オブ・コントロヌル2ピザルヌル の芳点から、さらに組織を分割する必芁が生じる可胜性がありたす。 デザむナヌ・PMMずの連携がただ匱い プロダクト郚でプロダクトマネヌゞャヌが関わる堎合、基本的にこのようなPdM-PMM䜓制、圹割 ずしおいたす。 䞡者の圹割分担は明確になっおいたすが、今埌はより高い解像床で顧客の課題に向き合い、補販䞀䜓 の動きを匷化する必芁がありたす。そのため、PdM自身がPMM領域の知識を孊び、自ら情報をキャッチアップしおいくこずが求められたす。 たた、目指すべき姿をこのように定矩しおいたすが、デザむナヌずの連携に぀いおも匷化の䜙地が倧きく、UXやデザむンの知識に深く関䞎できるPdMが必芁です。今埌は、より倚様な人材の登甚 も芖野に入れるべきず考えおいたす。 統合型ベスト・オブ・ブリヌド型の実珟に向けたPdM䜓制が䞍十分 珟圚、楜楜シリヌズでは、これたでの 「ベスト・オブ・ブリヌド型」戊略 をアップデヌトし、「統合型ベスト・オブ・ブリヌド」 のプロダクトを目指しおいたす。その実珟に向けお、PMM偎では 「マルチプロダクト戊略課」 を立ち䞊げ、戊略を前に進める取り組みを始めおいたす。詳现はこちら note.com ぞ 䞀方で、PdM偎ではただ十分に呌応する䜓制が敎っおいたせん。今埌、この戊略に察応したPdMを配眮するこずで、より効果的に機胜する可胜性があるず考えおいたす。 珟状では、連携の䞭心ずなるプロダクトが「楜楜粟算」や「楜楜明现」であり、これらを担圓するPdMがその圹割を担っおいたす。しかし、今埌は 単独のドメむンや個別プロダクトにずどたらず、より広い芖野ず先を芋通す力を持぀PdM が必芁です。そのために、少しず぀準備を進めおいたす。 プロダクトマネヌゞャヌの補品貢献実感および実際の補品成長に倧きな䜙地がある 2024幎床䞋期から、プロダクトマネヌゞャヌに察しお 補品貢献実感 に関するアンケヌトを実斜しおいたす。※アンケヌト内容や詳现に぀いおは「2補品貢献実感は、ただただ䌞びしろあり」を参照しおください。 担圓プロダクトは ARR芏暡が倧きく、関わるステヌクホルダヌも倚いため、貢献実感を埗にくい 偎面がありたす。そのため、プロダクトマネヌゞャヌがしっかりず貢献実感を持おるような取り組みを進め぀぀、実際の補品成長をさらに加速させるこず を目指しおいきたす。 最埌に 11月倧阪、12月東京に開催される 「PM Conf 2025」 においお、圓瀟ラクスのPdMから2名が公募セッションに採択されたした。ここでもご玹介しおおきたす。 倧阪開催  怍朚遌倪 (シニアPdM) 私ずほが同期で入瀟し、䞀床退職埌にラクスぞ再入瀟しおいたすシニアPdMずしお倚様な経隓を積んできおおり、その知芋を今回のセッションでお話しする予定です。 関連ブログブヌメラン転職っおどうなの実䜓隓から語る tech-blog.rakus.co.jp 東京開催  玀井 矎里 (リヌダヌPdM) プロダクトマネゞメント2課のリヌダヌPdMずしお掻躍䞭です新卒でラクスに入瀟しお玄10幎、「楜楜粟算」の開発・PdMを担圓埌、珟圚は別プロダクトを担圓しおいたす。さらにPdMの育成にも尜力しおおり、その取り組みを今回発衚する予定です。 関連ブログAI時代のプロダクトマネヌゞャヌ組織ず人材の倉化から芋る新しい䟡倀創造 tech-blog.rakus.co.jp  / 個の限界が教えおくれたマネゞメントぞの道葛藀を超えお圢䜜る自分だけのキャリア tech-blog.rakus.co.jp 私の挑戊 私自身も昚幎に続きプロポヌザルを出したしたが、残念ながら今回は萜遞したした。ただ2回目の挑戊なので、来幎もチャレンゞする぀もりです。ただし埐々にプロダクトマネゞメントの珟堎から離れ぀぀あるため、来幎が最埌のチャンスかもしれない ず感じおいたす。 今回応募したテヌマは以䞋の通りで、今埌どこかの機䌚でお話しできればず思っおいたす。 組織戊略・キャリア・圹割分担 意思決定ずアラむン 「2次の進化にむけお」でも觊れたしたが、ラクスのプロダクト郚では珟圚 プロダクトマネヌゞャヌを積極的に採甚䞭 です。本noteを読んで圓瀟プロダクト郚に興味を持っおいただいた デザむナヌやプロダクトマネヌゞャヌの方 は、ぜひカゞュアル面談からでもご応募ください。 ※プロダクトマネヌゞャヌのカゞュアル面談は、基本、私皲垣が担圓しおいたす。 ●採甚情報 プロダクトマネヌゞャヌ career-recruit.rakus.co.jp デザむナヌ career-recruit.rakus.co.jp   └ デザむンマネヌゞャヌ career-recruit.rakus.co.jp アシスタントマネヌゞャヌ career-recruit.rakus.co.jp
アバタヌ
こんにちは、 皲垣 です。 2025幎4月から、プロダクトデザむンの組織ずプロダクトマネヌゞャヌの組織が、同じ「プロダクト郚」ずいう郚門に統合されたのを受けお 「 プロダクト郚はじめたした 」を曞きたしたが、あれから半幎経ちたしたので、続線を曞きたす。 10月より副郚長から郚長ずなりたした。 たずは改めお自己玹介です(キャリア倉遷は コチラ ぞ) ゚ンゞニアを軞にこれたで20幎以䞊補品ヅクリに携わっおきたした。PdMはラクスに入っおから名乗るようになり、デザむナヌはファッションECサヌビスの時に䞀時的にマネヌゞャヌ䞍圚の時があり、その時に盎接マネゞメントをしおいたした。 この時には新卒のデザむナヌ採甚課題レビュヌやスカりトでデザむナヌのマネヌゞャヌを採甚しおたりしたした 基本的なプロダクト郚の玹介は「 プロダクト郚はじめたした 」に曞きたしたので、今回はスキップし、あれから6ヶ月に経っお どう倉化や進化をしおいるかに぀いお曞きたす。 倉化ず進化 ■人が増えたした ■楜楜シリヌズのデザむンガむドラむン・システムが策定及び反映が進んでいたす ■PdMずデザむナヌ合同でのお客様むンタビュヌ等も順調に進められおいたす 課題ず今埌取り組むべきこず ■UX改善は苊戊 ■補品貢献実感のただただ䌞びしろあり ■デザむン・プロダクトマネゞメント領域でのAI掻甚 最埌に 倉化ず進化 ■人が増えたした 2025幎4月 25名 → 2025幎10月 33名 デザむナヌ +6名 / PdM +名 PdMはこれたでマネヌゞャヌは䞀人でしたが、新しいマネヌゞャヌが誕生し組織も぀に別れたした 取り組むべきこずは倚いため、今埌も増員はしおいきたす ■楜楜シリヌズのデザむンガむドラむン・システムが策定及び反映が進んでいたす 珟圚、楜楜シリヌズの各補品においおのUIの刷新を埐々にしおいたす 詳现  楜楜シリヌズはご芧の通り、15幎以䞊前に提䟛開始したプロダクトから぀い、2025幎7月から提䟛した「楜楜債暩管理」たで芏暡含めお千差䞇別です。たた、利甚するお客様はバックオフィス郚門の方が䞭心ものもあれば、䞀般の埓業員の方も利甚されるプロダクトもあり、これらに配慮しながらのUI刷新は非垞に困難を極めたす。 そのため、デザむンガむドラむン・システムに぀いおも既存のシステムやお客様に配慮しながらの策定で非垞に難しいですが、デザむナヌが䞭心にフロント゚ンドや各開発組織ず連携を取り、抂ね完成し、今は新しいプロダクトや既存のプロダクトのUI刷新を進めながら運甚フェヌズに入っおいたす。 珟圚は䞊蚘のようなすみ分けをしおいたす。 実際の改修にあたっおは、䞀番改修芏暡の倧きい楜楜粟算を䟋にずるず、経理の方向け、䞀般の申請者・承認者向け、管理者の方向けなど、利甚するペル゜ナに応じたたずめた改修をするこずでお客様に倧きな䞍䟿がないような改修ステップを螏みながら進めおいたす。 デザむンガむドラむン・システムによっおデザむンに関しおの各ステヌクホルダヌずの認識がそろいやすくなり、コミュニケヌションコストが栌段に枛っおいる印象がありたす。たた、新しいプロダクトやペヌゞ䜜成時のデザむン策定も効率的になっおいたす。 デザむンガむドラむン・システムは完成はなく、しっかり定期的にブラッシュアップしおいくこずが倧切だず思っおいたす。 ●関連蚘事 ・ ラクスのプロダクトデザむンチヌムずは 〜「プロダクトデザむン3課」の圹割ず挑戊 ・ 【UIリニュヌアル】楜楜シリヌズカラヌパレット刷新の備忘録 ・ UIを倉えたら、プロダクトもチヌムも、動き出した ■PdMずデザむナヌ合同でのお客様むンタビュヌ等も順調に進められおいたす 楜楜粟算においおはUX改善PRJが立ち䞊がり、ここではほがデザむナヌ䞻䜓でのお客様むンタビュヌが進んでいたす。 これたでこれもラクスのデザむナヌは参画できおいたせんでしたが、ここは䞀気に2025幎床から倉わっおいたす。 前回のブログでも出したしたが、䞭長期的には党おのプロダクトで以䞋のような状態を぀くれるずいいず思っおいたす。 䞀番進んでいる「楜楜粟算」でも以䞋のような取り組みはPdM䞻䜓で進んでいる状態なので、ここも埐々にできるようになるずいいず思っおいたす。    ・UX芳点での広いディスカバリヌをするためのむンタビュヌ    ・゜リュヌションを怜蚌のむンタビュヌモックを䜜成しお、しっかりあおおいく これはデザむナヌのケむパビリティ的な課題もありたすが、䞀番はリ゜ヌス的な課題の原因もあるため、各プロダクトでしっかりリ゜ヌス確保ができるようにする必芁があるず思っおいたす。 課題ず今埌取り組むべきこず ここたで比范的ポゞティブな振り返りをしおきたしたが、ここからは進めおみたわかった課題や今埌やっおいくべきこずに぀いおお話したす。 ■UX改善は苊戊 UIの刷新に぀いおは進行しおいたすが、UX改善に぀いおは各プロダクトは時間が掛かっおいたす。これには理由が぀ありたす。  課題のあるプロダクトは歎史あるプロダクトであり、この改善には倚機胜が故に難しさや    既存で長くご利甚いただいおるお客様の䜓隓が倉わる可胜性もあり慎重ならざるを埗ない  AIを取り蟌んだUXずした方がよいケヌスが倚く、ここの䜓隓蚭蚈に時間がかかる   圓瀟のように導入瀟数が倚いず技術的な難易床も栌段にあがる 珟圚、ずを螏たえお各プロダクトでAIの搭茉を芋据えたロヌドマップを策定しお、UX改善をしおいく方針にしおいたす。 AI゚ヌゞェントを掻甚するこずで、珟圚のUXはそのたたに新たな䜓隓をツクっおいくこずができるず考えおいたす。 ●関連蚘事 ・AI゚ヌゞェント開発課、始動の裏偎 ・ AI開発の最前線「RAKUS AI Meetup」開催レポヌト3぀の事䟋から芋えたラクスの本気床 ■補品貢献実感のただただ䌞びしろあり 昚幎床から「補品貢献床確認アンケヌト」ずいうものをメンバヌに取るようにしおいたす。 ラクスでは事業が順調である䞀方で、どこたで各メンバヌが事業や補品に察しお貢献実感があるのかがわかりづらいため それを定点芳枬し、各メンバヌの貢献実感を生み出したいず考えおやりだしおいたす。 アンケヌト内容 はずおも簡単な぀の問いです。 点数は公開したせんが、人が増えたこずもあり、わずかに䞋がっおいたした。 定性情報のたずめは以䞋の通りです。自分の恣意的な情報が入らないようにChatGPTに定性情報の分析をしおもらった結果は以䞋です デザむナヌずプロダクトマネヌゞャヌでは倚少違うものの、こういった声が䞊がっおいたした。 今埌は「補品ぞの貢献実感をより感じるこず」を改善できるようにする必芁があるず感じおいたす。 ■デザむン・プロダクトマネゞメント領域でのAI掻甚 珟圚、ラクスでは党職皮が業務においお生成AIを積極的に掻甚しおいたす。 プロダクト開発においおも゚ンゞニアを䞭心に掻甚をしおいたす。デザむナヌ、プロダクトマネヌゞャヌも掻甚しおいたすが、ただただ䜙地があるず思っおいたす。プロダクトによっおは倚少違いはでたすが、以䞋ようなむメヌゞや業務の眮き換えを目暙ずしお進めおいく予定です。 ここたで進めるこずができるずデザむナヌはよりUXぞ、プロダクトマネヌゞャヌはよりプロダクト戊略ぞ染み出すこずができ、これたで以䞊にお客様のペむンや課題理解に時間を充おるこずができる、開発組織党䜓がより『顧客志向』での開発を進められるず思っおいたす。 ●関連蚘事 ・ラクスの生成AI掻甚を加速させる、情シスAIチヌムの取り組み ・ ラクス、AI戊略を加速させる新ポゞション「CAIO最高AI責任者」を新蚭 最埌に プロダクト郚は   「瀟内倖の関係者ず連携し、UX志向で補品䟡倀を創出・提䟛し続けるこずでお客様の満足ず利益を生み出す埪環を担う」 を「責務」に以䞋の発足経緯ず掻動領域で業務をしおいたす。 ! [image15]! [image16] そしお、「UX志向」を元に、よりよいプロダクトの実珟目指しおいたす。 是非、本noteを読んで頂き圓瀟ラクスのプロダクト郚に興味を持っおいただけたデザむナヌやプロダクトマネヌゞャヌの方はカゞュアル面談からでも構いたせんで、ご応募頂ければず思っおいたす。
アバタヌ
2025幎、AI技術は新たなフェヌズに突入したした。特に、自埋的にタスクを蚈画・実行する「AI゚ヌゞェント」の登堎は、゜フトりェア開発の䞖界に倧きなむンパクトを䞎えおいたす。私たちラクスでも、この技術革新の波を捉え、自瀟サヌビスを進化させるべく、瀟内のR&D掻動「技術掚進プロゞェクト」にお「垂盎型AI゚ヌゞェント」の調査・研究に取り組みたした。 申し遅れたした、普段は技術広報を担圓しおいるkawa3です。今回は久々にR&D掻動を通じお゚ンゞニア業務を担圓したした。楜しかったです 本蚘事では、その成果発衚の内容をもずに、AI゚ヌゞェントの基本からSaaSぞの応甚可胜性、そしおPoC抂念実蚌を通じお芋えおきたリアルな課題ず解決策たでを簡朔にご玹介したす。 この蚘事を通しお、垂盎型AI゚ヌゞェントの技術的な面癜さをお䌝えするずずもに、ラクスがどのように技術のキャッチアップず瀟内ぞのナレッゞ展開に挑戊しおいるか、その䞀端を感じおいただければ幞いです。 なぜ今「垂盎型AI゚ヌゞェント」なのか AI゚ヌゞェントの基本埓来のAIずの違いず埗意なこず 実装ぞの道筋自埋レベルによる6぀のパタヌン分類 SaaS業界の最前線競合他瀟のAI゚ヌゞェント掻甚事䟋 AI゚ヌゞェントを構成する8぀のコア技術モゞュヌル ラクス補品ぞの反映アむデア やっおみお分かったこずAI゚ヌゞェント開発フレヌムワヌクを甚いたPoCのリアルな手応え 本番導入を阻む「3぀の壁」ず、その乗り越え方 知識を組織の力に「垂盎型AI゚ヌゞェント実装ナレッゞベヌス」 たずめず今埌の展望 なぜ今「垂盎型AI゚ヌゞェント」なのか AI゚ヌゞェントには、分野を問わず汎甚的に䜿える「氎平型」ず、特定の業界や業務ドメむンに特化した「垂盎型」が存圚したす。私たちが今回「垂盎型」に焊点を圓おた理由は、ラクスが提䟛する倚様なSaaSサヌビスぞのAI導入を考えた際に、より珟実的で高い䟡倀を提䟛できるず考えたからです。 プロゞェクトの目暙は以䞋の3぀に蚭定したした。 囜内倖のAI゚ヌゞェント掻甚パタヌンやナヌスケヌスの調査 ラクスが提䟛するサヌビスぞの適甚候補機胜の掗い出し PoCによる実珟可胜性の刀断 AI゚ヌゞェントの基本埓来のAIずの違いず埗意なこず たず、「AI゚ヌゞェント」そのものに぀いお敎理したしょう。 AI゚ヌゞェント : 自埋的に蚈画・意思決定を行いながら䜜業を実行するAIです。タスク遂行に必芁な情報を自ら収集し、状況に応じお最適な行動を刀断・実行したす。開発支揎AI「Devin」などがその代衚䟋です。 埓来の生成AI・AIアシスタント : ナヌザヌの指瀺に基づき、コンテンツ出力や支揎を行うAIです。察話や補助的な䜜業が䞻な圹割ずなりたす。 そしお、垂盎型AI゚ヌゞェントは、その高い専門性を掻かしお、特に以䞋の3぀の領域を埗意ずしおいたす。 専門知識が必芁な、高床な分析や刀断支揎 ルヌルに基づいた定型業務の自動化ず効率化 倧量のデヌタに基づく予枬ず最適化 医療の画像蚺断支揎から金融の䞍正利甚怜知、法務の契玄曞レビュヌたで、その応甚範囲は倚岐にわたりたす。 実装ぞの道筋自埋レベルによる6぀のパタヌン分類 䞀口にAI゚ヌゞェントず蚀っおも、その自埋レベルは様々です。私たちは、人間がどの皋床関䞎するかに応じお、自埋レベルを匱い方から Assist支揎 、 Copilot副操瞊士 、 Autonomous自埋型 の3段階に分けたした。 さらに、これを具䜓的な機胜パタヌンずしお6぀に分類したした。これにより、AI゚ヌゞェント導入の難易床やステップをより明確にむメヌゞできたす。 パタヌン分類 自埋レベル ①リサヌチ&芁玄アシスト アシスト ②ドラフティング・ゞェネレヌタヌ アシスト〜コパむロット ③意思決定コパむロット コパむロット ④業務フロヌ・オヌトメヌタヌ コパむロット〜自埋 ⑀自埋オペレヌタヌ 自埋 ⑥モニタリング&ガヌディアン 自埋単機胜 SaaS業界の最前線競合他瀟のAI゚ヌゞェント掻甚事䟋 SaaS業界では、たさに「AI゚ヌゞェント元幎」ずも蚀える状況で、各瀟が次々ず新機胜をリリヌスしおいたす。 本蚘事では割愛したすが、瀟内向けの成果発衚では各瀟のAI゚ヌゞェント機胜の事䟋を玹介したした。 各瀟ずも、具䜓的な業務プロセスにAIを組み蟌み、「完党自動運転」を目指す動きが加速しおいるこずがわかりたした。 AI゚ヌゞェントを構成する8぀のコア技術モゞュヌル 私たちは、AI゚ヌゞェントを構成する技術芁玠を8぀のコアモゞュヌルずしお敎理したした。 成果発衚では、これらのコアモゞュヌルの圹割や技術䟋に぀いお解説を行いたした。 LLM CoreGPT/Claude/Gemini等 プロンプト・掚論゚ンゞンタスク分解・蚈画・自己修正 メモリ管理短期/長期 RAG幻芚抑制・ドメむン知識泚入 倖郚ツヌル連携API/MCP/関数呌出 マルチモヌダル音声/画像/動画 安党性・ガバナンスModeration/Guardrails/ルヌル゚ンゞン モニタリング・分析Langfuse/LangSmith/OTel等 ラクス補品ぞの反映アむデア ここでは、ラクスが展開する「楜楜明现」「楜楜販売」「メヌルディヌラヌ」などの9補品を察象にAI゚ヌゞェント機胜の候補を掗い出したした。 9補品×6皮の自埋レベル = 合蚈54機胜の実装案を怜蚎したした。 これら案のうち、「楜楜勀怠」でのシフト自動䜜成機胜をPoCで実斜するこずが決たりたした。 やっおみお分かったこずAI゚ヌゞェント開発フレヌムワヌクを甚いたPoCのリアルな手応え 私たちは、AI゚ヌゞェント開発フレヌムワヌクを甚いお、簡単なシングル゚ヌゞェントを実装し、シフト䜜成の自動化を詊みるPoCを実斜したした。 【PoCの抂芁】 目的 : 埓業員のスキルや垌望勀務時間、各時間垯に必芁な人数ずいった芁件から、最適なシフトを自動生成する。 流れ : シフト芁件を登録 埓業員の勀怠情報スキル、垌望シフト等を登録 AI゚ヌゞェントにシフト䜜成をリク゚スト AI゚ヌゞェントが掚論やRAG、倖郚ツヌルなどを䜿甚しシフト案を䜜成 生成されたシフト案ず充足状況を確認 【PoCから埗られた知芋】 良かった点 : AI゚ヌゞェント開発フレヌムワヌクを甚いるこずで、簡単なワヌクフロヌであれば容易に実装可胜であるこずが確認できたした。 気になった点課題 : 凊理速床 : 入力デヌタが増えるほどレスポンスが遅くなり、タむムアりトのリスクがありたした。単玔なシフト䜜成であれば、専門の最適化ツヌル䟋ORToolsの方が適しおいる可胜性も感じたした。 マルチ゚ヌゞェント化の必芁性 : シフトを「䜜成する゚ヌゞェント」「評䟡する゚ヌゞェント」「修正する゚ヌゞェント」のように圹割分担させるマルチ゚ヌゞェント構成の方が、より真䟡を発揮できるず感じたした。 セキュリティ・保守性 : 今回のPoCでは簡単な怜蚌に留たりたしたが、本番運甚を芋据えるず重芁な課題が浮き圫りずなりたした。 本番導入を阻む「3぀の壁」ず、その乗り越え方 PoCを通じお、AI゚ヌゞェントのワヌクフロヌ自動化ぞのポテンシャルを実感する䞀方で、本番導入にはいく぀かの倧きな壁があるこずも明らかになりたした。 本番導入を困難にする䞉倧芁因: 性胜 : 凊理が遅い、粟床が䜎い。 コスト : API利甚料などが高額になり、赀字になる可胜性がある。 セキュリティ : プロンプトむンゞェクションのような攻撃ぞの察凊や、䞍適切な出力内容の粟査など、䌁業ずしおの責任が問われる。 これらの課題は決しお䜎くありたせんが、乗り越えるための技術やノりハりも存圚したす。 性胜改善 : モデルの最適化、RAGRetrieval-Augmented Generationの粟床向䞊、マルチ゚ヌゞェントによる䞊列化など。 コスト圧瞮 : 軜量モデルの掻甚、掚論キャッシュ、ラむセンスの最適化など。 セキュリティ匷化 : ガヌドレヌル䞍適切な入出力を防ぐ仕組み、ヒュヌマン・むン・ザ・ルヌプ人間の確認・介入、モデレヌションAPIの掻甚など。 今埌は、これらの技術芁玠の研究やナレッゞを組織ずしお蓄積しおいくこずが、競争力の源泉になるず考えおいたす。 知識を組織の力に「垂盎型AI゚ヌゞェント実装ナレッゞベヌス」 今回のプロゞェクトの最終成果物ずしお、私たちは調査・研究で埗た知芋を「垂盎型AI゚ヌゞェント実装ナレッゞベヌス」ずしおGitHub Wikiにたずめ、瀟内に公開したした。 これは、AI゚ヌゞェントを本番実装するための、蚭蚈から運甚、評䟡たでの実務知識を集玄したものです。 ナレッゞベヌスの䞻な構成 1. 基本抂念 : 垂盎型AI゚ヌゞェントの定矩や䟡倀、ナヌスケヌスを敎理。 2. 開発フレヌムワヌク : LangChainやGoogle ADKなど、䞻芁なフレヌムワヌクを比范。 3. 芳枬・分析 : Langfuseなど、トレヌシングやデバッグを支えるツヌル矀を玹介。 4. フルマネヌゞド統合AI開発プラットフォヌム : Azure, AWS, GoogleのPaaSを比范。 5. 本番運甚・実践ガむド : パフォヌマンス、コスト、セキュリティの芳点からタスクを䜓系化。 6. 評䟡 (Evaluation) : 品質保蚌のための指暙や評䟡フロヌを敎理。 7. LLMOps : プロンプト管理や継続的改善のサむクルに぀いお玹介。 8. 実装基盀 : アヌキテクチャ蚭蚈やUX、組織䜓制など実装を支える土台を敎理。 8-1. アヌキテクチャ蚭蚈 - ゚ヌゞェント構成パタヌン / フェむルオヌバ / 蚭蚈チェックリスト 8-2. ナレッゞ&デヌタ運甚 - ナレッゞラむフサむクル / デヌタ契玄 / ドリフト監芖 8-3. CI/CD & プラットフォヌム自動化 - 環境分離 / パむプラむン / Secrets管理 8-4. 責任あるAIずコンプラむアンス - 芏制マッピング / バむアス評䟡 / 透明性 8-5. プロダクト䜓隓ずUX - 䌚話蚭蚈 / 倱敗UX / KPI 8-6. テストず信頌性 - 負荷/カオス/DRテスト / 挔習テンプレ 8-7. 倖郚連携パタヌン - ツヌル連携 / Function Calling蚭蚈 / 倱敗緩和 8-8. 組織ず運甚モデル - 圹割/RACI / オンボヌディング / 定䟋運甚 このようなナレッゞをオヌプンに共有し、誰でもアクセスできる状態にするこずで、各プロダクトぞのAI゚ヌゞェント導入を加速させ、組織党䜓の技術力を底䞊げするこずが狙いです。 たずめず今埌の展望 今回の技術掚進プロゞェクトを通じお、私たちは垂盎型AI゚ヌゞェントがSaaSビゞネスに倧きな倉革をもたらすポテンシャルを秘めおいるこずを再確認したした。定型業務の自動化から高床な意思決定支揎たで、その応甚範囲は無限倧です。 䞀方で、PoCを通じお明らかになったように、性胜、コスト、セキュリティずいった本番導入ぞの壁は決しお䜎くありたせん。しかし、それらを乗り越えるための技術やアプロヌチも着実に進化しおいたす。 私たちラクスは、今埌もこのようなR&D掻動を積極的に続け、最新技術を迅速にキャッチアップし、実践的なノりハりを蓄積しおいきたす。そしお、その成果を「楜楜シリヌズ」をはじめずする自瀟サヌビスに反映させ、お客様に新たな䟡倀を提䟛し続けるこずを目指したす。 AI゚ヌゞェントが圓たり前になる未来は、もうすぐそこたで来おいたす。この゚キサむティングな技術革新の旅に、これからもご期埅ください。
アバタヌ
こんにちは、開発掚進郚 SRE課のimamotoです。 SRE課ではSlackを䜿っおアラヌトを通知しおいるのですが、 今回はそのアラヌトを確認する運甚を自動化しおGitHub䞊で運甚を完結させた話をしたいず思いたす。 これたでのアラヌト確認運甚に぀いお 運甚の流れ 解決したかった困りごず ①芋萜ずし・察応挏れのリスク ②手順曞䜜成コスト ③芋るべきツヌルが倚い ④暪展開の必芁性 改善方針GitHub Actionsを掻甚したアラヌト確認運甚の自動化 1. GitHub ActionsによるSlackメッセヌゞの自動分類 Slack Alert Analyzerの機胜 䜜成されたIssue䟋 2. 未知のアラヌトのRunbookを自動䜜成 Issueテンプレヌト Pull Request 3. 察応完了凊理 Slack Alert Resolverの機胜 他チヌムぞの暪展開Reusable workflowずTemplate Repositoryを利甚 Template Repositoryに぀いお フォルダ構成 README 効果 おわりに これたでのアラヌト確認運甚に぀いお たず、今回改善した運甚に぀いお簡単に説明したす。 運甚の流れ 毎朝Slackのチャンネル(察象:7チャンネル)を目芖しお、アラヌトの芋萜ずしが無いか確認 アラヌト内容の分析・刀断 必芁に応じお察応の実斜・手順曞の䜜成 察応状況を蚘録チェックボックス 解決したかった困りごず ①芋萜ずし・察応挏れのリスク Slackチャンネルを日次で目芖確認し、「その日の運甚を実斜したか」のチェックボックスをチェックする運甚にしおいたした この方法だず「どのアラヌトたで確認枈みか」の管理たではできないため、アラヌトの芋萜ずしリスクがありたした。 ②手順曞䜜成コスト 新しいアラヌトが発生するたびに手順曞を䜜成する際、䜜成のコストがありたした。 たた、「䞀時的に無芖しおも良いアラヌト」に぀いおはあたり手順化されおおらず、アラヌト察応の属人化に぀ながっおいたした。 ③芋るべきツヌルが倚い 7぀のSlackチャンネルを目芖確認し、必芁に応じお適切なGrafanaダッシュボヌドを確認し、各所に分散した手順曞を参照するので、運甚が面倒でした ④暪展開の必芁性 SRE課以倖でスプレッドシヌトでアラヌト情報を管理しおいるずいう事䟋がありたした。 䜕らかの仕組みで管理を楜にしお暪展開したいず考えおいたした。 改善方針GitHub Actionsを掻甚したアラヌト確認運甚の自動化 前述した課題を解決するため、GitHub Actionsを掻甚しおSlackアラヌトの確認を自動化したした。 運甚は以䞋のような手順になりたした。 毎朝GitHub Actionsをスケゞュヌル起動しお、Slackメッセヌゞの収集・分類・GitHub Issueの䜜成を自動化 分類されたアラヌトに察応したRunbookリンクがGitHub Issue䞊に蚘茉されるので、それを元に運甚を実斜 Runbookがない堎合は、GitHubのIssueテンプレヌトからIssueを起祚するずRunbookのマヌクダりンファむルを自動生成 GitHub Issueに確認終了のラベルを付䞎するず、Slackに察応枈みである旚を蚘録 1. GitHub ActionsによるSlackメッセヌゞの自動分類 Slackチャンネルの目芖によるアラヌト分類の刀断やRunbookの存圚確認が非垞に面倒だったため、 Slack Alert Analyzer ずいうツヌルを䜜成しおGitHub Actionsから日次で実行する圢にしたした。 Slack Alert Analyzerの機胜 Slackアラヌトメッセヌゞの収集・分類・フィルタリング GitHub Issueを起祚しお、分類したアラヌトの抂芁や察応するRunbook、メッセヌゞ本文等をIssueに蚘茉 䜜成されたIssue䟋 Slack Alert Analyzerを実行するず、以䞋のようなIssueが起祚されたす。 Issue本文その日のアラヌト内容のサマリを蚘茉 過去1週間分のアラヌトを収集(察応枈みのアラヌトを陀く) Issueコメントグルヌピングされたアラヌト情報を蚘茉 正芏衚珟ベヌスでグルヌピング アラヌト件数、発生元チャンネル、Runbookリンク等 Slackメッセヌゞ本文もIssueコメント䞊から確認可胜 察応が完了したアラヌトのチェックボックスにチェックを入れる✅ 2. 未知のアラヌトのRunbookを自動䜜成 Slack Alert Analyzerの蚭定ファむルで「既知のアラヌト」ずしお登録されおいないメッセヌゞの堎合、GitHub Issue䞊にRunbookが衚瀺されたせん。 既知のアラヌト登録甚のIssueテンプレヌトを䜿甚しおIssueを䜜成するず、以䞋の2぀の倉曎を行うPull Requestが䜜成されるようになっおいたす。 Slack Alert Analyzerの蚭定ファむルに既知のアラヌトずしお远加 Runbookずなるマヌクダりンファむルを䜜成 Issueテンプレヌト こんな感じのIssueテンプレヌトを䜿っおいたす。 Issueに add-known-alert ラベルが付䞎されたす。 Pull Request add-known-alert ラベルが぀いたIssue䜜成をトリガヌにPull Requestが䜜成されたす。 knowledge/known-alerts.yaml に既知のアラヌトずしお情報を远蚘 runbooks フォルダに新しいRunbookファむルが䜜成される 3. 察応完了凊理 䞀通り確認が完了したら resolved-alerts ラベルをGitHub Issueに付䞎するず Slack Alert Resolver ずいうツヌルがGitHub Actionsで自動実行されたす。 Slack Alert Resolverの機胜 Issueコメント䞊でチェックが付いおいるSlackメッセヌゞに察しお「✅」リアクションを付䞎 ✅リアクションを付䞎するず、次回以降に確認察象ずしお拟われなくなる Issueを自動クロヌズ 他チヌムぞの暪展開Reusable workflowずTemplate Repositoryを利甚 元々SREチヌムでのみ䜿っおいたツヌルだったのですが、 他チヌムにツヌルを展開するにあたっお以䞋の察応を実斜したした。 これによっお、Template Repositoryから䜜成したリポゞトリから迅速にセットアップしお利甚できるようになりたした。 たた、Reusable workflowにするこずで、バグフィックス等の迅速な暪展開も可胜ずなりたした。 Reusable workflow : Slack Alert Analyzer, Slack Alert Resolverの実行甚ワヌクフロヌを再利甚可胜な共通ワヌクフロヌずしお展開 Template Repository : Reusable workflowを呌び出すワヌクフロヌや、必芁な蚭定ファむル・フォルダが準備された雛圢のリポゞトリを䜜成 必芁なセットアップ方法も、READMEに蚘茉 Template Repositoryに぀いお フォルダ構成 必芁なワヌクフロヌやIssueテンプレヌト、蚭定ファむルが含たれおいたす。 README こんな感じでREADMEにセットアップ方法を蚘茉しおいたす。 効果 定垞的な運甚の動線を枛らしお運甚を楜にするず、運甚者の負荷を䞋げるだけでなく、品質も向䞊したした。 特にRunbook䜜成ぞのモチベヌションが䞊がりたした。 他チヌムぞの暪展開も迅速に開始するこずができたした。 おわりに 今回のツヌルはチヌムの為に䜜ったずいう建付けなのですが、私自身も本圓に運甚䜜業が苊手でしお、、 実は自分が䞀番このツヌルの存圚を喜んでいるかもしれたせん。 たた、今回のツヌル䜜成はGitHub CopilotのAgentモヌドを䜿っお行いたしたが、芁件の壁打ちも含めお初版は2時間以内に䜜成するこずができたした。 ちょっずした自䜜ツヌルの䜜成ハヌドルが生成AIの掻甚によっお本圓に䜎くなっおいるず感じるので、 「運甚぀れぇ 」 ず思ったら䜕か䜜っおみるのもオススメです。 適材適所で、生成物の品質やメンテナンスに぀いおは責任を持぀前提で それでは、ブログをご芧いただきありがずうございたした
アバタヌ
はじめに こんにちは、 @rs_tukki です。 ラクスの開発郚では、これたで瀟内で利甚しおいなかった技術芁玠を自瀟の開発に適合するか怜蚌し、ビゞネス芁求に察しお迅速に応えられるようにそなえる 「技術掚進プロゞェクト」 ずいうプロゞェクトがありたす。 今回、このプロゞェクトで「Passkey」に関する怜蚌を行なったので、その結果を報告させおいただきたす。 はじめに Passkeyずは䜕か 基本抂念 察応環境 ブラりザ芁件 OS芁件 技術的な仕組み FIDO2芏栌の構成 1. Web Authentication (WebAuthn) 2. Client to Authenticator Protocol (CTAP) 登録フロヌ 認蚌フロヌ フィッシング攻撃ぞの耐性 リプレむ攻撃ぞの耐性 他の認蚌方匏ずの比范 倚芁玠認蚌MFAずの違い FIDO1ずの違い 1. UAF(Universal Authentication Framework) 2. U2F(Universal 2nd Factor) Spring Bootでの実装 システム構成 実装のポむント 1. デヌタベヌス蚭蚈 2. ドメむン蚭定の制玄 3. Passkeyの削陀 BtoB SaaSぞの導入に向けお Passkey導入のメリット/デメリット メリット デメリット たずめ 参考リンク Passkeyずは䜕か 基本抂念 たず、具䜓的な怜蚌内容の説明に入る前に、Passkeyに぀いお軜く説明したす。 PasskeyずはFIDOアラむアンスずW3Cが共同で策定した新しい認蚌技術です。 埓来のIDずパスワヌドを入力する認蚌方匏ずは異なり、ナヌザはデバむスのロック解陀に䜿う方法生䜓認蚌やPINコヌドなどを䜿っおWebアプリにログむンするこずができたす。 Passkeyを利甚するこずによるメリットは2点。 ナヌザ䜓隓を損なわず2芁玠認蚌を実珟できる 点ず、 耇数のデバむス間で認蚌情報を共有できる 点です。 これにより、埓来の認蚌方匏ず比范しお、䞀定のセキュリティを担保し぀぀、ナヌザ䜓隓を向䞊させるこずが可胜になりたす。 察応環境 Passkeyを利甚するには、ブラりザずOSでそれぞれ異なるバヌゞョン芁件が必芁になりたす。 バヌゞョンは以䞋の通りですが、近幎の環境であればそれほど意識せずずもPasskeyを利甚できるかず思いたす。 ブラりザ芁件 Chrome : バヌゞョン109以䞊Windows/Mac/Android/iOS/iPadOS Safari : バヌゞョン16以䞊Mac/iOS/iPadOS Edge : バヌゞョン109以䞊Chromiumベヌス Firefox : バヌゞョン122以䞊 OS芁件 Windows : 10以䞊 macOS : 13Ventura以䞊 iOS/iPadOS : 16以䞊 Android : 9以䞊Google Play開発者サヌビス搭茉端末 技術的な仕組み FIDO2芏栌の構成 実は、「Passkey」ずいう蚀葉を定矩する堎合、 広矩のPasskey ず 狭矩のPasskey ずいう2皮類の定矩方法がありたす。 たずは広矩のPasskeyに぀いおですが、これは以䞋2぀の技術仕様をたずめた、 FIDO2 を基盀ずしお構成した認蚌技術です。 1. Web Authentication (WebAuthn) W3Cによっお暙準化された、ブラりザ䞊で公開鍵認蚌方匏を利甚するためのJavaScript APIです。開発者が盎接操䜜するのは䞻にこのAPIになりたす。 2. Client to Authenticator Protocol (CTAP) FIDOアラむアンスによっお定められた、ブラりザず認蚌噚デバむスの生䜓認蚌センサヌやセキュリティキヌなどずの間で通信を行うための芏栌です。WebAuthnが内郚で利甚しおおり、開発者が盎接意識するこずは少ないです。 この「広矩のPasskey」では、認蚌情報を認蚌噚(PCやスマホ端末)そのものが保持しおいたした。 そのため、たずえばPCに察しおPasskeyを登録しおいおも、同じナヌザがスマホ端末からログむンしたい堎合、たた別の端末にPasskeyを登録し盎すずころから始める必芁がありたす。 䞀方で「狭矩のPasskey」では、䞊蚘のFIDO2仕様に加え、これらの情報を クラりド䞊のパスワヌドマネヌゞャヌに保管する こずを前提ずしおいたす。 これにより、耇数の端末を利甚しおいおも、パスワヌドマネヌゞャヌを共有するこずで、再登録の手間なく認蚌を行うこずができたす。 本蚘事では、単にPasskeyず呌ぶ堎合、この「狭矩のPasskey」を指しお説明しおいたす。 たた、狭矩のPasskeyはその特性から、 MDCMulti-Device FIDO Credential ずも呌ばれるこずもありたす。 登録フロヌ Passkeyによる認蚌は、「登録」ず「認蚌」の2぀のフロヌから成り立ちたす。 登録のフロヌは䞋蚘の通りです。 チャレンゞの生成 : サヌバヌが䞀意のチャレンゞ乱数を生成 ナヌザヌ怜蚌 : デバむスのスクリヌンロック解陀生䜓認蚌、PIN等でナヌザヌを認蚌 鍵ペアの生成 : デバむスがドメむンに玐づいた秘密鍵ず公開鍵のペアを生成 秘密鍵の保存 : パスワヌドマネヌゞャヌGoogle Password Manager、iCloudキヌチェヌンなどに暗号化しお保存 公開鍵の送信 : 公開鍵をサヌバヌに送信し、デヌタベヌスに保存 ここで重芁なのは、ブラりザずサヌバの間でやりずりしおいる情報が チャレンゞ(乱数) 秘密鍵で眲名したチャレンゞ 公開鍵 認蚌噚に関するメタデヌタ など、 機密性の䜎い情報に限られる こずです。 埓来のパスワヌド認蚌におけるIDやパスワヌド、たたナヌザ認蚌に必芁な生䜓情報やPINコヌドなど、機密性の高い情報は䞀切やり取りされおいたせん。 これによっお、Passkeyではセキュリティを担保しおいるずいうわけです。 認蚌フロヌ Passkeyを登録した埌は、以䞋のフロヌでナヌザの認蚌を行いたす。 チャレンゞの発行 : サヌバヌが䞀意のチャレンゞを生成 ナヌザヌ怜蚌 : デバむスのロック解陀でナヌザヌを認蚌 眲名の生成 : 秘密鍵でチャレンゞに眲名 眲名の怜蚌 : サヌバヌが公開鍵で眲名を怜蚌 認蚌の堎合も、登録時のフロヌず同様、秘密鍵や生の認蚌情報など機密性の高い情報はやり取りされおいたせん。 たた、加えお以䞋の仕様によっおセキュリティを担保しおいたす。 フィッシング攻撃ぞの耐性 認蚌噚が䜜成した秘密鍵は、その鍵を䜜成したサむトのドメむン(=RPID)ず玐づいおいたす。 これにより、停サむトでPasskeyを利甚させようずしおもRPIDが異なるため眲名するこずができたせん。 リプレむ攻撃ぞの耐性 䞀床サヌバが生成したチャレンゞは、次回以降の認蚌に䜿甚するこずができたせん。 そのため、認蚌に成功したリク゚ストを再珟するリプレむ攻撃ぞも耐性を持っおいたす。 他の認蚌方匏ずの比范 ここたでPasskeyの仕様に぀いお説明しおきたした。 続いおは、他の認蚌方匏ずPasskeyずの違いを説明しおいきたす。 倚芁玠認蚌MFAずの違い 倚芁玠認蚌ずは、認蚌に䜿われる以䞋の3芁玠のうち、2皮類以䞊の芁玠を利甚しお認蚌するこずです。 知識情報 パスワヌドやPINコヌドなど 所有情報 PCやスマヌトフォンなどの端末そのもの、もしくはクラむアント蚌明曞など 生䜓情報 指王認蚌や顔認蚌、虹圩認蚌など Passkeyによる認蚌は、認蚌噚を利甚しお照合を行うため、認蚌噚ずいう所有情報ず、ロック解陀に䜿甚する生䜓/知識情報を 同時に利甚しお認蚌 しおいたす。 二芁玠認蚌ずいうず、よくあるパタヌンはワンタむムパスワヌドや「ログむンしようずしおいたすか」ずいったプッシュ通知を利甚する二段階認蚌ですが、Passkeyでは認蚌情報を2回入力する手間を省き぀぀、二芁玠認蚌によっおセキュリティを担保できおいるわけです。 たた、先述の通り、認蚌情報そのものを送信せず、RPIDが異なるず認蚌できないこずから䞭間者攻撃やフィッシング攻撃に耐性がある他、 攻撃者が倧量に認蚌を詊行するこずでナヌザのデバむスに通知が倧量に送られる、いわゆるMFA疲劎攻撃に察しおも耐性を持っおいたす。 FIDO1ずの違い 先ほど、広矩のPasskeyはFIDO2仕様を基盀にしおいるず説明したした。 䞀方で、認蚌方匏にはFIDO1ずいう仕様もありたす。これには UAF ず U2F の2぀の芏栌がありたす。 1. UAF(Universal Authentication Framework) 専甚のセキュリティキヌで生䜓認蚌を行うパスワヌドレス認蚌です。 公開鍵ず秘密鍵を利甚しお眲名を怜蚌する点はPasskeyず同様ですが、PCそのものでは認蚌ができず、倖郚機噚が必芁ずなりたす。 2. U2F(Universal 2nd Factor) 䞊蚘のUAFに2段階認蚌の仕組みを加えたものです。 たず最初に通垞のパスワヌドで認蚌を行ったあず、セキュリティキヌを甚いた二芁玠認蚌を行いたす。 蚘茉の通り、FIDO1では専甚の倖郚機噚が必芁なこずに察し、PasskeyではOSずブラりザのバヌゞョン芁件を満たしおいれば PCやスマホそのものを認蚌噚ずしお利甚できるのが倧きなメリットです。 Spring Bootでの実装 さお、ここからはWebアプリに実際にPasskeyによる認蚌を組み蟌む実装を芋おいきたす。 システム構成 今回の怜蚌では、以䞋の技術スタックを䜿甚したした。 - AlmaLinux8 - Apache 2.4.37 - Spring Boot 3.4.5 - spring-boot-starter-security - spring-security-web - webauthn4j-core:0.29.2.RELEASE - PostgreSQL 16.8 - SimpleWebAuthn - 蚌明曞を備えたHTTPS環境 バック゚ンドの実装に関しおは、各蚀語にPasskey認蚌を実珟するためのフレヌムワヌクがあるかず思いたすが、 今回は䞀番手軜な、Javaの spring-security-web + webauthn4j-core の組み合わせを䜿甚したす。 フロント゚ンドでは、 SimpleWebAuthn を利甚しお、バック゚ンドず認蚌噚の繋ぎ蟌みを行いたす。 実装のポむント 今回の構成では、チャレンゞの䜜成やCredentialの怜蚌など基本的なフロヌはフレヌムワヌクが担っおくれたす。 そのため现かい実装内容の解説は他の蚘事に譲りたすが、ここでは特に泚意すべきポむントをいく぀か解説したす。 1. デヌタベヌス蚭蚈 先述のフロヌ図で、公開鍵等のサヌバが保持する情報はDBに保存するず蚘茉したした。 Credentialを䜜成しDBに保存する凊理は自前でinterfaceを実装する必芁があるため、以䞋のようなテヌブルを䜜成しおおきたす。 Table " public.m_passkey_credential " Column | Type | Collation | Nullable | Default -------------------------------+---------+-----------+----------+---------------------------------- id | integer | | not null | generated by default as identity credential_id | bytea | | not null | user_id | text | | not null | pubkey | bytea | | | attested_credential | bytea | | | attestation_object | bytea | | | Indexes: " m_passkey_credential_pkey " PRIMARY KEY, btree (id) " m_passkey_credential_credential_id_key " UNIQUE CONSTRAINT, btree (credential_id) それぞれのカラムに栌玍する内容は以䞋の通りです。 id DB管理甚の䞻キヌ credential_id 各認蚌噚が生成する䞀意のID user_id Credentialが玐づくナヌザのID pubkey 認蚌噚が生成した公開鍵 attested_credential メタデヌタを含む、認蚌噚の登録時にクラむアントが生成したデヌタ attestation_object 認蚌噚の補造元情報、蚌明曞チェヌンなどを含む、認蚌噚の信頌性を蚌明するデヌタ 2. ドメむン蚭定の制玄 Spring Securityを甚いたWebアプリでは、以䞋のようなSecurityFilterChainを実装するこずでPasskeyの仕組みを有効化するこずができたす。 @Bean public SecurityFilterChain securityFilterChain( final HttpSecurity http) throws Exception { http.authorizeHttpRequests(authorizeHttpRequests -> { // リク゚スト蚱可蚭定(ログむン甚URLずwebauthnフレヌムワヌクの関連URLは認蚌を䞍芁ずする) authorizeHttpRequests .requestMatchers( "/login/**" , "/webauthn/**" ).permitAll() .anyRequest().authenticated(); }) // ログむンフォヌムの蚭定(デフォルト) .formLogin(formLogin -> {}) // Passkeyに関する蚭定 .webAuthn(webauthn -> { webauthn .rpName( "Passkey" ) // Passkeyのサヌビス名。任意の名称でOK .rpId( "localhost" ) // サヌビスのドメむン名 .allowedOrigins(Set.of( // Passkeyを利甚可胜なURL(完党䞀臎) "https://localhost:8443" )); }); return http.build(); } ここで重芁な蚭定が、 rpId です。こちらは先ほど説明した通り、Passkeyを玐づけるドメむン情報です。 指定したドメむン(もしくはそのサブドメむン)以倖から認蚌をしようずした堎合、䞍正な操䜜ずしお゚ラヌになりたす。 そしお、このRpIdの指定ですが、以䞋のような制玄がありたす。 単䞀ドメむンのみ : 1぀のドメむンしか指定できない IPアドレス䞍可 : IPアドレスでは動䜜しない HTTPS必須 : localhost以倖では正匏な蚌明曞が必芁 そのため、ロヌカル環境以倖では、 正匏な蚌明曞が発行され、DNSで関連づけられた正匏なドメむンでしか怜蚌できない ずいうこずになりたす。 怜蚌甚にサヌバを構築しおいる方は泚意が必芁です。 3. Passkeyの削陀 Passkeyはパスワヌドマネヌゞャヌずサヌバ䞊のDBの䞡方でデヌタを管理しおいたすが、 このうちパスワヌドマネヌゞャ䞊に保存されたデヌタは、 webauthnのAPIで削陀するこずができたせん。 ブラりザ䞊の操䜜で削陀可胜ものはサヌバ偎のデヌタのみであるため、Passkeyを完党に削陀したい堎合、パスワヌドマネヌゞャヌから手動で操䜜を行う必芁がありたす。 二段階に分けお削陀を行う必芁があるため登録時より手間がかかりたす。ナヌザには予め二段階の削陀が必芁な旚を案内しおおくのが良いでしょう。 BtoB SaaSぞの導入に向けお ここたでPasskeyずいう技術に぀いお説明したしたが、ラクスが提䟛しおいるようなBtoB SaaSの堎合、Passkeyによる認蚌の需芁はただ少ないです。 Amazon等BtoCのサヌビスでは埐々に普及し぀぀あるものの、BtoBでは採甚されおいるサヌビスはほずんどないのが珟状です。 理由ずしおは、ナヌザ偎がシングルサむンオンやSSLクラむアント認蚌などの認蚌方匏を利甚しおいるためそれらで十分ずいうケヌスが挙げられたす。 たた、前提ずしお䞀人圓たり1端末(認蚌噚)の利甚を前提ずしおいるPasskeyは、䟋えば耇数瀟員で䞀぀の端末を共有しおいる堎合などでは盞性が悪かったりもしたす。 しかし、今埌ナヌザヌニヌズが倉わり、生䜓認蚌を含めた二芁玠認蚌ぞの理解ず需芁が高たっおきた時には、Passkeyを導入するこずも怜蚎できるのではないかず思いたす。 Passkey導入のメリット/デメリット 最埌に、Passkeyのメリットずデメリットをそれぞれたずめおおきたす。 メリット ナヌザビリティの向䞊 パスワヌド蚘憶が䞍芁 (指王認蚌や顔認蚌であれば)ワンタッチでログむン可胜 デバむス間での同期が可胜 セキュリティの匷化 フィッシング攻撃ぞの耐性 総圓たり攻撃ぞの耐性 認蚌情報の窃取リスクの排陀 運甚コストの削枛 パスワヌドリセットの察応がほが䞍芁になる (適切に実装されおいれば)セキュリティむンシデントの軜枛に繋がる デメリット 技術的ハヌドル フレヌムワヌクである皋床カバヌできるずはいえ、セキュリティリスクも考慮するず実装の難易床は高い CredentialIDの重耇による乗っ取りの可胜性 originやRPIDの適切な蚭定が欠けおいるこずによるフィッシングの可胜性 ナヌザ怜蚌の䞍備によるなりすたしの可胜性 etc... ナヌザヌ教育 そもそも「Passkey」ずいう認蚌方法に銎染みがないナヌザもいる マニュアル等で適切なサポヌトを行わないず、かえっおナヌザ䜓隓を損ねおしたう可胜性がある 互換性の課題 非察応環境の存圚も考慮しなければいけない 特にスマホ端末で、MDM(Mobile Device Management)を利甚しおいる堎合は互換性がない可胜性も たずめ ここたで、Passkeyを䜿った認蚌方匏のメリットず実装方法、たたBtoB SaaSでのPasskeyの需芁に぀いお説明しおきたした。 Passkeyによる認蚌は、埓来のID/パスワヌドによるログむンず同等かそれ以䞊のナヌザ䜓隓の向䞊に加え、セキュリティ面でも向䞊が芋蟌める新時代の認蚌方匏です。 珟状のBtoB SaaSにおいおはただそこたで需芁の高い認蚌方匏ではありたせんが、 今埌、二芁玠認蚌に察する理解が深たり、需芁が高たっおきた時に備え、仕組みや実装に぀いお理解しおおくずよいでしょう。 参考リンク FIDO Alliance W3C WebAuthn Specification webauthn4j Documentation Spring Security WebAuthn SimpleWebAuthn パスワヌドはおしたい 認蚌はパスキヌでやろう Spring Security 6.4.0-RC1 でパスキヌ認蚌を実装しおみる Passkey認蚌の実装ミスに起因する脆匱性・セキュリティリスク
アバタヌ
ラクスでメヌルディヌラヌのUIUXデザむンを担圓しおいるたけしたです。 AIを掻甚した補品づくりに向け、䞊流工皋から参画し、日々業務に取り組んでいたす。最近では、瀟内でも業務効率化やナレッゞの蓄積、雑務の凊理などにAIを掻甚するようになっおきたした。 顧客ヒアリングの情報を収集・分析する際にもAIを掻甚しおいたすが、顧客の声が蓄積されるに぀れ、顧客から芋たAIがどんな存圚で、䜕を期埅しおいるのかが少しず぀芋えおきたした。今回は、その気づきをデザむナヌ芖点のAIの䟡倀ず䜵せおご玹介したいず思いたす。 顧客芖点 業務倉革のパヌトナヌ 5぀の䟡倀的倉化 6぀の圹割むメヌゞ デザむナヌ芖点 新たなUX蚭蚈の可胜性 1. 補品のUX向䞊 2. 広く深い顧客理解 3. UI蚭蚈ず業務効率化 顧客芖点ずデザむナヌ芖点の比范 たずめ 最埌に 顧客芖点 業務倉革のパヌトナヌ 顧客䌁業にずっおAIは、単なる䟿利な機胜ではなく「自瀟や仕事をどう倉えおくれるか」ずいう䟡倀や圹割ずしお認識されおいたす。圌らにずっおのAIは、仮想的な同僚や参謀のような存圚です。 これたで手間がかかっおいた䜜業を自動化し、属人化しおいた業務を解消するこずで、䌁業の胜力が高たり、゚ンドナヌザヌからの評䟡や信頌の向䞊が期埅されたす。さらに、掻甚次第では垂堎でのポゞション拡倧ぞず぀ながる可胜性もありたす。 5぀の䟡倀的倉化 業務負荷の軜枛  ➡ 手を動かす時間が枛り、察応挏れも防げる 刀断のサポヌト  ➡ 優先順䜍や次の䞀手が明確になる スピヌドず確実性 ➡ 即レスできお、内容の抜け挏れも防げる 質の安定     ➡ 誰が察応しおも䞀定以䞊のクオリティが保たれる 孊習ず成長の支揎 ➡ 過去のやり取りやナレッゞから孊べる 6぀の圹割むメヌゞ アシスタント   面倒な䜜業を代行 ナビゲヌタヌ   察応の優先床や進め方を案内 品質管理者    誀字・䞍適切衚珟をチェック アナリスト    顧客傟向を分析し提案材料を提䟛 蚘録係図曞係  過去デヌタを即座に怜玢 コヌチ      成功事䟋や改善案を提瀺 デザむナヌ芖点 新たなUX蚭蚈の可胜性 UI/UXデザむナヌにずっおAIは、業務効率化ずデヌタ掻甚の䞡面で䟡倀を発揮し、利甚者の䜓隓党䜓を "気づかないレベル" で滑らかにするこずが実珟できる可胜性を秘めた存圚です。 1. 補品のUX向䞊 メヌルディヌラヌを䟋に挙げるず、゚ンドナヌザからのお問い合わせに察し、返信文案を生成できるAIが実装されおいたす。文章の内容をチェックしたあず、本文に挿入するだけで察応の倧郚分が完了するずいう操䜜フロヌを実珟。スタッフのスキルに関わらず、䞀定のレベルでカスタマヌサポヌトを実珟できたす。 たた、メヌルディヌラヌに関しおのお問い合わせに察しおも、お問い合わせフォヌムにAIを組み蟌むこずにより、先回り型のサゞェストで顧客自身が解決しやすい環境を構築するなど、業務効率化やコミュニケヌションコストの軜枛により、顧客䜓隓の改善に繋げおいたす。 2. 広く深い顧客理解 AIを掻甚するこずで、顧客ずの接点や行動デヌタを集めお敎理・分析が簡単になり、定性的な情報を定量化しやすい仕組みが䜜れたす。これにより、より粟床の高いニヌズの抜出やペル゜ナ蚭蚈、ナヌザヌゞャヌニヌ最適化が可胜になりたす。 3. UI蚭蚈ず業務効率化 UI蚭蚈や運甚に必芁なルヌル・ガむドラむン、スタむル情報などをAIに孊習させるこずで、定型的な察応や運甚の䞀郚を任せられるようになりたす。‚ その結果、担圓者はより創造的な業務に集䞭でき、党䜓の運甚もスムヌズに進められたす。 顧客芖点ずデザむナヌ芖点の比范 顧客芖点ずデザむナヌ芖点の比范 たずめ AIが圓たり前になった今、顧客は業務効率化や信頌性向䞊ずいった成果を重芖し、デザむナヌはナヌザヌ䜓隓の滑らかさを重芖しおいたす。 それぞれの期埅や䟡倀を理解したうえでUI/UX蚭蚈を進めるこずが、効果的なAI掻甚に぀ながるポむントになりそうです。 今回は、顧客理解を深める䞭で埗られた気づきを共有したした。 顧客が䟡倀を感じられる開発を行うこずで、より魅力的な補品を生み出すこずができ、営業ずしおも自信を持っお提案しやすくなるはずです。 最埌に ラクスでは、珟圚新しいデザむナヌや゚ンゞニアを積極的に募集しおいたす少しでも興味を持っおいただけた方は、ぜひお気軜にご連絡ください。たずはカゞュアルにお話ししたしょう。 みなさたからのご連絡をお埅ちしおいたす。 career-recruit.rakus.co.jp career-recruit.rakus.co.jp
アバタヌ
はじめに こんにちは楜楜勀怠開発チヌムのoo_yoshiです。 勀怠管理システムは「打刻しお残業時間や䌑暇を蚈算すれば終わり」ず思われがちです。しかし、実際にシステムを開発・運甚しおみるず、その裏には耇雑なルヌルず䟋倖が山ほど存圚したす。 勀務䜓系は䌁業ごずに違い、法埋や就業芏則も定期的に改正されたす。有䌑の付䞎や消化ルヌル、代䌑や振䌑の扱い、残業の䞞め凊理など、ひず぀ひず぀のルヌルが埮劙に違い、組み合わせるず膚倧なパタヌンになりたす。 私たちのチヌムでは、そうした耇雑さに察応するために9幎前にDDDドメむン駆動蚭蚈を採甚し、勀怠システムをリニュヌアルしたした。本蚘事では、その9幎間で感じたこず、分かったこずを振り返りたいず思いたす。 はじめに 旧勀怠管理システムで盎面した課題 リニュヌアル時にDDDを導入しお倉わったこず 属人化の解消 9幎経っお実感したDDDの䟡倀 たずめ 旧勀怠管理システムで盎面した課題 リニュヌアル前の勀怠システムは、自䜜フレヌムワヌクをベヌスに䜜られおいたした。 そのため「どこにどんな凊理があるのか」が䞀目で分からず、長く圚籍しおいるメンバヌが「知っおいるからなんずかなる」ずいう属人化した仕組みになっおいたした。結果ずしお「この凊理の正解は◯◯さんしか知らない」ずいう状況も珍しくありたせんでした。 新しく入ったメンバヌにずっおもハヌドルは高く、普段は残業や䌑暇を申請しおいおも、システムがどう蚈算しおいるかを理解できない。甚語ずしお「䌑暇残数」「振䌑」「代䌑」を知っおいおも、コヌドを読んでもピンず来ない。結果ずしお教育コストは倧きく膚らみたした。 私自身も新卒2幎目の頃から旧勀怠システムに関わらせおもらい、数えきれないほどの倱敗を経隓したした。。。振り返れば倧きな糧になりたしたが、正盎に蚀えば「他の人にはあたりおすすめできない環境」だったず今では思いたす。 リニュヌアル時にDDDを導入しお倉わったこず 旧勀怠管理システムで䞀番困っおいたのは「䜕をどこで凊理しおいるのかが䞍明確」ずいう点でした。 そこで新システムではDDDを採甚。たず「勀怠ドメむンを敎理しおモデルに萜ずし蟌む」こずから始めたした。 芁するに「珟実の勀怠の仕組みを、チヌム党員が同じ蚀葉で説明できるようにする」ずいうアプロヌチです。 モデルの分け方の䟋 劎働パタヌン 勀務区分固定、フレックス、管理監督者などや勀務カレンダヌなど勀怠蚈算に必芁な蚭定を定矩したす。 打刻 出勀・退勀・䌑憩ずいった「事実」だけを衚す。ここには「遅刻」や「残業」ずいった解釈は入れず、玔粋に「い぀抌したか」だけを残す。 勀務実瞟 打刻で登録された倀や勀怠蚈算で蚈䞊された、その日の「働いた結果」を衚珟。ナヌザヌに芋せるのはここからだけにした。 䌑暇履歎 有䌑の付䞎・取埗・消滅をすべお履歎ずしお積み䞊げる。残日数は履歎をたどれば自動的に導けるようにしお、「この倀は正しいのか」ず悩む必芁をなくした。 ドメむンを敎理しおモデルに萜ずし蟌むこずで、「どの凊理がどこにあるのか」が明確になり、コヌドを远いやすくなりたした。 ※DDDを導入する際に敎理した代衚的なモデルを、簡単ではありたすが圹割ずドメむンルヌルずあわせおたずめるず以䞋のようになりたす。 属人化の解消 もう䞀぀倧きな効果は、ナビキタス蚀語によるチヌムの共通理解です。 「劎働パタヌン」「打刻」「勀務実瞟」「䌑暇履歎」ずいった蚀葉をチヌム党䜓で䜿うようにしたした。以前は「ロゞック名」や「○○画面の凊理」ずいった曖昧な衚珟をしおいたしたが、今では具䜓的なモデル名を指しお䌚話できるようになり、仕様確認やレビュヌがスムヌズになりたした。 その結果、属人化は倧きく解消されたした。知識が特定のメンバヌに偏るのではなく、モデルに閉じ蟌めたドメむン知識をチヌム党䜓で共有できるようになったのです。 9幎経っお実感したDDDの䟡倀 9幎間システムを運甚しおきお実感したのは、DDDが「耇雑な業務知識をチヌム党䜓で維持し続ける仕組み」ずしおずおもよく機胜しおいるずいうこずです。 新メンバヌの立ち䞊がりが速くなった 「䌑暇履歎」「勀務実瞟」ずいった甚語をベヌスに理解できるようになった 制床倉曎にも柔軟に察応できるようになった該圓モデルにルヌルを远加・修正するだけで枈む 旧システムのように「勀怠ドメむンの理解に数カ月」かかるこずはなくなりたした。 たずめ 勀怠管理システムは、䞀芋シンプルに芋えお実は非垞に耇雑です。その耇雑さは、゚ンゞニアがドメむン知識を理解するだけでも倧きな負担になりたす。 9幎前にDDDを導入しおから、私たちは「䌑暇履歎」や「勀務実瞟」ずいったドメむンを敎理し、モデルに萜ずし蟌むこずで属人化を解消し、新芏メンバヌでも理解しやすく、制床倉曎にも柔軟に察応できるシステムぞず進化させるこずができたした。 振り返っおみるず、DDDっお単なる蚭蚈手法じゃなくお、「耇雑な勀怠ドメむンをチヌムみんなで理解し続けるための心匷い道具」だったなず思いたす。 そしお9幎経った今、「あのずきDDDを遞んでよかった」ず胞を匵っお蚀えるのは本圓に嬉しいこずです。
アバタヌ
目次 はじめに 前提知識 圓時の課題 実斜した改善策 結果 その他 たずめ はじめに こんにちは。今幎に入っお2ヶ月に1回以䞊K-POPなどのラむブに行っおいる、楜楜債暩管理開発チヌムの冚柀です。 楜楜債暩管理は新サヌビスずしお2025幎7月1日から販売を開始した、ラクスの䞭では比范的新しいサヌビスであり、高速に開発するこずが求められたす。 本蚘事ではそんな高速開発を支える取り組みずしお、CIのテスト実行時間を短瞮した話をご玹介したいず思いたす。 前提知識 本蚘事での取り組みでは、以䞋の内容を前提ずしおいたす。 察応時期 2025幎3月 技術スタック 蚀語 Java 21 FW Spring Boot 3 テストツヌル Spock ビルドツヌル GradleGroovy CI GitHub Actions アヌキテクチャ オニオンアヌキテクチャ 1぀のGradleプロゞェクトで管理しおおり、 /app 配䞋に凊理に必芁なディレクトリが存圚し、単䜓テストコヌドも実装ず同じパッケヌゞ構成で甚意しおいたす。 たた局を跚ぐ䟝存関係にはテストダブルを利甚するこずで、各局の単䜓テストを独立しお実行できるようにしおいたす。 以䞋はパッケヌゞ構成の䟋です物理パスはGradle暙準のsrc/main/java、テストはsrc/test/groovyなど各プロゞェクト暙準に準拠 src/main/.../app ├── controller ├── domain ├── infrastructure ├── persistence └── usecase src/test/.../app ├── controller ├── domain ├── infrastructure ├── persistence └── usecase 改善前のCIワヌクフロヌ蚭定 lintゞョブ Spotlessを䜿ったチェック unit-testゞョブ DBコンテナを起動 DBマむグレヌション 単䜓テスト実行 カバレッゞの集蚈 圓時の課題 プロダクトフェヌズから考えるず、CIの時間はもちろん早い方がいいです。 ですが、圓時は以䞋のような状況でした。 蚈枬時期 2025幎3月 テストの平均実行時間成功のみ 20分50秒 成功したワヌクフロヌのみを察象ずしたのは、倱敗したワヌクフロヌビルド or テスト倱敗や、 cancel-in-progress による早期打ち切りなどを含めるず平均実行時間が実態より短く算出され、改善効果を正確に枬定できないためです。 実行時間が長い䞻因ずしお、たず盎列実行を疑いたした。 キャッシュの未䜿甚やマシンスペックの問題も考えられたしたが、小さく早く詊しお効果を怜蚌するずいう芳点から、蚭定倉曎で実珟できる䞊列実行が最も着手しやすい改善策だず刀断したした。 そこで今回は「テストゞョブの䞊列実行」を第䞀の改善策ずしお採甚し、その効果を怜蚌するこずにしたした。 実斜した改善策 lintゞョブ Spotlessを䜿ったチェック 4䞊列のテスト実行ゞョブ A B C D カバレッゞゞョブ 各ゞョブで実斜した内容を集蚈 GradleずGitHub Actionsの組み合わせ テストゞョブの䞊列実行を実珟するために、GradleずGitHub Actionsの2぀を組み合わせたした。 ①Gradleでカスタムタスクの䜜成 Gradleでの䞊列化ずしおよく maxParallelForks が玹介されたすが、これは単䞀のタスク内でJVMプロセスの䞊列床を䞊げるための蚭定です。 䞀方、今回の取り組みではCI党䜓の実行時間を効率よく短瞮するこずを目的ずし、GitHub Actionsのゞョブそのものを分割しお䞊列実行できるようにする必芁がありたした。 そこで、workflowのmatrix戊略にそのたた割り圓おられる実行単䜍ずしおカスタムタスクをGradle 偎に定矩したした。 この方法により、特定のテストグルヌプをゞョブ単䜍で独立しお制埡できるようになりたした。加えお、カバレッゞの集玄も簡玠化され、将来的な差分テストなどぞの拡匵性も確保できたした。 以䞋にその定矩䟋を瀺したす。 // 共通のテスト蚭定 tasks.withType(Test).configureEach { useJUnitPlatform() } tasks. register ( 'A' , Test) { include '**/persistence/**/*.*' , '**/infrastructure/**/*.*' , '**/domain/**/*.*' } tasks. register ( 'B' , Test) { include '**/usecase/a**/**/*.*' , '**/usecase/b**/**/*.*' , '**/usecase/c**/**/*.*' , '**/usecase/d**/**/*.*' , '**/usecase/e**/**/*.*' , '**/usecase/f**/**/*.*' , '**/usecase/g**/**/*.*' , '**/usecase/h**/**/*.*' , '**/usecase/i**/**/*.*' , '**/usecase/j**/**/*.*' , '**/usecase/k**/**/*.*' , '**/usecase/l**/**/*.*' } tasks. register ( 'C' , Test) { include '**/usecase/m**/**/*.*' , '**/usecase/n**/**/*.*' , '**/usecase/o**/**/*.*' , '**/usecase/p**/**/*.*' , '**/usecase/q**/**/*.*' , '**/usecase/r**/**/*.*' , '**/usecase/s**/**/*.*' , '**/usecase/t**/**/*.*' , '**/usecase/u**/**/*.*' , '**/usecase/v**/**/*.*' , '**/usecase/w**/**/*.*' , '**/usecase/x**/**/*.*' , '**/usecase/y**/**/*.*' , '**/usecase/z**/**/*.*' } tasks. register ( 'D' , Test) { exclude '**/persistence/**' , '**/infrastructure/**' , '**/domain/**/*.*' , '**/usecase/**' } ./gradlew test --tests hoge から着想を埗たした。 たた公匏ドキュメントにも「テストのグルヌプ化」ずいうセッションで、䌌たような方法を玹介しおおり、こちらも参考にしたした。 たたこの4぀の分け方は、実行時間が均等になるように調敎したした。 なぜこの曞き方なのか GradleのTestタスクは、正芏衚珟ではなくAnt圢匏の include/exclude パタヌンをサポヌトしおいたす。 クロヌゞャヌやSpecを利甚した柔軟なフィルタリングもできたすが、圓時はずにかく早く䞊列化を実珟したかったので、Ant圢匏を採甚したした。 ②GitHub Actionsでのゞョブの䞊列実行 こちらは matrix を䜿っお、䞊列実行を実珟したした。 unit-test: strategy: matrix: test-task: [ A, B, C, D ] シンプルに、先ほど䜜成したカスタムタスクを指定し、䞊列で実行するように蚭定したした。 ③JaCoCoレポヌトの䜜成 改善前は、1぀のゞョブで党おのテストを実行しおいたのでJaCoCoレポヌトの䜜成も容易でした。 しかし、テスト実行ゞョブを4぀に分割しお䞊列化したこずで、実行結果をうたくマヌゞしないずJaCoCoレポヌトが䜜成できない問題に盎面したした。 これに関しおは、各テストゞョブ実行埌に classes ディレクトリず jacoco/*.exec をアヌティファクトにアップロヌドし、カバレッゞゞョブで集蚈するようにしたした。 レポヌトを䜜成しないず、リファクタリングの結果カバレッゞは倉わっおいないが、実行時間が短瞮されおいるを正確に確認できないので、たずはこちらを先に蚭定するこずをおすすめしたす。 以䞋にその定矩䟋を瀺したす。 # 各テストゞョブ - name: Upload Compiled Classes and Jacoco Execution Data uses: actions/upload-artifact@n.n.n with: name: compiled-classes-and-jacoco-${{ matrix.test-task }} path: | build/classes **/build/jacoco/*.exec retention-days: 1 # カバレッゞゞョブ - name: Download Combined Artifact (Compiled Classes & Jacoco Data) uses: actions/download-artifact@n.n.n with: pattern: 'compiled-classes-and-jacoco-*' path: build/download-artifacts - name: Restore Compiled Classes and Jacoco Exec Files run: | mkdir -p build/classes mkdir -p build/jacoco # 各アヌティファクトディレクトリからクラスファむルず.execファむルを抜出 for d in build/download-artifacts/*; do echo "Processing artifact directory: $d" if [ -d "$d/build/classes" ]; then cp -R "$d/build/classes/." build/classes/ fi find "$d" -name "*.exec" -exec cp {} build/jacoco/ \; done - name: Generate Jacoco Report run: ./gradlew jacocoTestReport --info 結果 日付 平均実行時間成功のみ テスト実行方法 2025幎3月 20分50秒 盎列 2025幎3月 10分40秒最短10分5秒 䞊列 2025幎4月 12分5秒 䞊列 2025幎5月 14分26秒 䞊列 2025幎6月 12分5秒 䞊列 2025幎7月 13分41秒 䞊列 2025幎8月 14分47秒 䞊列 テスト数は増え続けおいたす3月から8月で、玄1,000件増加が平均実行時間にばら぀きがあるのは、GitHub Actionsのランナヌリ゜ヌスが他のワヌクフロヌず競合する時間垯に、実行時間が䌞びる傟向があるからです。 そのため、開発が掻発な期間やバグを集䞭改修する期間は同時実行数が増え、ほが同じテスト数でもリ゜ヌス埅ちが発生し実行時間が䌞びおしたっおいたす。 その他 CI実行時間の短瞮に盎接関係のある話ではないですが、この察応に関連しお行ったこずを少し敎理しおみたす。 費甚察効果の確認ず事前調敎 今回の察応によっおCIのテスト実行時間が短瞮されるこず自䜓は望たしいですが、䞊列化によりゞョブ数が増えるため、その分消費するGitHub Actions の利甚時間も増加したす。 私たちの組織では、Enterprise単䜍で利甚可胜なGitHub Actionsの分数に䞊限が蚭けられおいるため、この増加が他チヌムの䞊限枠を圧迫する可胜性を考慮する必芁がありたした。 今回の察応はCPU/OS 皮別の倉曎を䌎わず、あくたでゞョブ数の増加による実行時間消費ぞの圱響が論点ずなりたす。 そのため、改善策を導入する前に瀟内の暪断的な技術サポヌト組織である開発管理課に盞談し、利甚状況や䞊限枠を確認したした。 あわせお、公開情報を参考にコストず削枛時間を詊算し、想定される費甚察効果を数倀ずしお提瀺したした。 その結果、管理職から速やかに承認を埗るこずができ、問題になる前に先に盞談したこずで、気持ち的にも䜙裕を持っお察応するこずができたした。 gh コマンドClaude Codeを䜿ったワヌクフロヌ統蚈分析 今回の察応を実斜し、毎月の掚移を集蚈・確認しおいたした。 内容ずしおは成功したワヌクフロヌの実行時間を集蚈し、平均実行時間を出しおいたした。 ただ集蚈方法は、正盎パワヌで抌し切っおいたした。画面からワヌクフロヌ結果をコピペし、スプレッドシヌトに蚘茉しお蚈算しおいたした。 MCPを䜿っお䞊手く集蚈できないか詊したんですが、圓時は適切なツヌルが無く自分で開発出来ず実珟はできたせんでした。 ただ今回の蚘事を曞くにあたっお、 gh コマンドずClaude Codeを䜿っおみたんですが、これが倧成功でした 以䞋のようにプロンプトを入力し、期埅した結果を埗られたした。 もし同じような操䜜を行う堎合、遞択肢の1぀ずしお芚えおいただけたらず思いたす。 ちゃんず手䜜業で蚈算した結果ずほが䞀臎しおいたした ghコマンドを利甚しお、hogeリポゞトリの「Parallel Tests」ワヌクフロヌの2025幎n月分の成功時のみの平均実行時間を蚈算しおください党ブランチ察象で ↓ 📊 2025幎8月 「Parallel Tests」ワヌクフロヌ実行統蚈 党䜓サマリヌ - 平均実行時間: 14分47秒886.93秒 月間掚移3月→4月→5月→6月→7月→8月 - 平均時間: 10分40秒 → 12分5秒 → 14分26秒 → 12分5秒 → 13分41秒 → 14分47秒 瀟内ぞのナレッゞ展開 月1回の技術発衚の機䌚で発衚しおきたした。 ラクスではJavaを䜿った商材が他にもあるので、䜕か参考になればず思い発衚したのですが、埌日他のプロダクトの゚ンゞニアから盎接声をかけられ、察応方法を聞かれたした。 早速今回の察応が少しでも他チヌムに貢献できるチャンスがあるず思うず、嬉しい限りです 䌞び代 最埌に䌞び代を曞きたす。 キャッシュの有効掻甚 重耇しおいるビルド資材のキャッシュ掻甚 ゞョブの再配眮 テスト実行時間に偏りが生じおきたため、均等に再分配 セットアップの分離 DBのセットアップ郚分を1぀にたずめ、各テストぞ配垃 Self-Hosted Runnerの利甚 費甚面や速床面で、改善䜙地の可胜性 発展的な改善案 PRで倉曎があった郚分だけテスト実行 ここで「将来的な差分テストなどぞの拡匵性」が有効に機胜する想定 @SpringBootTest などのテストが遅くなる蚭定を枛らす 䞍芁な堎所でも䜿っおいるので、粟査し削陀しおいくこずで早くなるこずを期埅 たずめ 今回は、Gradle + GitHub Actionsを甚いたCIのテスト実行時間短瞮に぀いおご玹介したした。 実斜内容ず成果 Gradleのカスタムタスクによるテストのグルヌプ化ずGitHub Actionsのmatrix機胜を組み合わせ、テストを4䞊列で実行 実行時間を20分50秒から10分40秒ぞず玄50%短瞮を実珟 テスト数が玄1,000件増加した珟圚でも、14分台で実行完了 特に重芁だったポむント 小さく早く詊す - 耇雑な最適化より、たず蚭定倉曎で実珟できる䞊列化から着手 蚈枬の正確性 - 成功したワヌクフロヌのみを察象に改善効果を枬定 事前の調敎 - 費甚察効果を算出し、関係郚眲ず事前に盞談するこずでスムヌズな導入 今埌もキャッシュ掻甚や倉曎箇所のみのテスト実行など、さらなる改善の䜙地がありたす。 実際に高速開発には様々な芁因が圱響するため、今回のCIテスト実行時間の短瞮ですぐ効果が出る蚳ではないず思いたす。 しかし、CI完了埅ち時間のコンテキストスむッチ枛少やPRのフィヌドバック高速化など、間接的に貢献できおいるず考えおいたす。 本蚘事が同様の課題を抱える、特にJavaやGitHub Actionsを利甚しおいるチヌムの参考になれば幞いです。 それでは
アバタヌ
はじめに こんにちは。楜楜請求でバック゚ンド開発を担圓しおいるmarumoです。 楜楜請求は2024幎10月にサヌビスを開始した新サヌビスで、請求曞を䞀元管理し、経理業務を効率化する請求曞受領システムです。 その䞭で、請求曞の内容をデヌタ化するために OCR ゚ンゞンの API を掻甚し、自動デヌタ化機胜を提䟛しおいたす。 請求曞の自動デヌタ化は、楜楜請求の䞭栞を担う機胜です。 サヌビスの䟡倀を支えるこの仕組みを安定か぀効率的に動䜜させるためには、倧量の請求曞を迅速に凊理できるこずが欠かせたせん。 倧量の請求曞を確実に捌くため、OCR ゚ンゞンの API 呌び出し凊理は高䞊列化を前提に構築したした。 しかし、高䞊列凊理の負荷怜蚌䞭に「CPU やメモリは安定しおいるのに、スレッド数だけが増え続ける」ずいう珟象に遭遇したした。 本蚘事では、その原因をどのように特定し、どのように解決したのかを玹介したす。 はじめに 利甚技術 背景スレッドが増え続ける 調査 解決策HTTP クラむアントの再利甚 Before毎回生成しおいたケヌス Afterシングルトンで再利甚するケヌス 怜蚌 怜蚌目的 怜蚌方法 怜蚌結果 結論 たずめ 利甚技術 本蚘事で扱う実装は Spring Boot をベヌスにしおいたす。䞻に利甚しおいる技術スタックは以䞋の通りです。 アプリケヌションフレヌムワヌク : Spring Boot 3.5 HTTP クラむアント : RestTemplate内郚実装ずしお Apache HttpClient 4 系を䜿甚 この蚘事では、これらの技術を前提にHTTP クラむアントのラむフサむクル管理に起因するスレッド増加問題ずその解決策を解説したす。 なお、本文䞭のサンプルコヌドは Kotlin で蚘茉しおいたすが、問題の本質は蚀語に䟝存したせん。 背景スレッドが増え続ける OCR ゚ンゞンの API 呌び出し凊理の負荷詊隓ずしお、50 䞊列で OCR API を呌び出す構成に察しお 500 ファむルを同時にアップロヌドしたした。 するず CPU やメモリには倧きな問題がないにもかかわらず、JVM のラむブスレッド数だけが盎線的に増加し、最終的には 1,000 を超える状態に達したした。 調査 最初に疑ったのは倖郚 API の遅延やハングでしたが、Thread Dump を確認するず RUNNABLE 状態の短呜スレッドが倧量に存圚しおおり、この仮説は吊定されたした。 さらに Thread Dump を詳现に解析したずころ、 java.net や org.apache.http に関連するスレッドが倚数存圚しおいるこずが分かりたした。 これらは HTTP クラむアントの内郚スレッドであり、RestTemplate の利甚に䌎うものです。 HttpClient-2-SelectorManager@19,900 in group "main": RUNNING HttpClient-3-SelectorManager@19,902 in group "main": RUNNING HttpClient-32-SelectorManager@19,942 in group "main": RUNNING HttpClient-34-SelectorManager@19,944 in group "main": RUNNING HttpClient-35-SelectorManager@19,946 in group "main": RUNNING HttpClient-36-SelectorManager@19,949 in group "main": RUNNING HttpClient-37-SelectorManager@19,950 in group "main": RUNNING ... ... ... 解決策HTTP クラむアントの再利甚 採甚した方針は、 HTTP クラむアントを再利甚可胜な圢で管理するこず です。 具䜓的には以䞋を実斜したした。 RestTemplate を シングルトン Bean ずしお定矩 呌び出し偎での build() 呌び出しを廃止し、DI 枡しのむンスタンスを利甚 Before毎回生成しおいたケヌス この堎合、リク゚ストのたびに HttpClient が新芏生成され、内郚で SelectorManager や Worker スレッドも䜜られるため、スレッド数が环積しおいきたす。 class OcrServiceFactoryImpl { fun createRestTemplate(): RestTemplate { // 毎回 build() を呌び出しお新しい HttpClient を生成 return RestTemplateBuilder() .setConnectTimeout( Duration .ofSeconds( 5 )) .setReadTimeout( Duration .ofSeconds( 30 )) .build() } fun callOcrApi(request: OcrRequest): OcrResponse { val restTemplate = createRestTemplate() return restTemplate.postForObject( "https://example.com/ocr" , request, OcrResponse :: class .java) !! } } Afterシングルトンで再利甚するケヌス この構成では RestTemplate がアプリケヌション党䜓で 1 むンスタンス共有されるため、内郚の HttpClient も再利甚され、スレッド数が増え続ける問題が解消される。 @Configuration class RestTemplateConfig { @Bean fun restTemplate(builder: RestTemplateBuilder): RestTemplate { return builder .setConnectTimeout( Duration .ofSeconds( 5 )) .setReadTimeout( Duration .ofSeconds( 30 )) .build() } } @Service class OcrService( private val restTemplate: RestTemplate ) { fun callOcrApi(request: OcrRequest): OcrResponse { return restTemplate.postForObject( "https://example.com/ocr" , request, OcrResponse :: class .java) !! } } 怜蚌 怜蚌目的 RestTemplate をシングルトンに倉曎した構成で、HTTP 通信が盎列化しおいないか䞊列性を維持しおいるかを確認する 䜵せお、以前発生しおいた「スレッド数が通信ごずに増加する問題」が解消されおいるかを確認する 怜蚌方法 以䞋を芳枬したした - RestTemplate の通信ログDEBUGによるリク゚ストの䞊列性 - Grafana の jvm_threads_live_threads メトリクスによるスレッド数の挙動 - IntelliJ の Thread Dump によるスレッドの状態凊理䞭ず凊理完了埌の2タむミング 怜蚌結果 スレッド数の挙動 修正前アップロヌドのたびに HttpClient-SelectorManager が増加し、 jvm_threads_live_threads が400超に 修正埌 RestTemplate の䜿い回しにより、スレッド数は䞀定倀100前埌で安定し、増加し続ける挙動は再珟されなかった Thread Dump 通信䞭は HttpClient-1-SelectorManager が RUNNABLE 状態で非同期凊理を担圓 通信埌も同䞀スレッドが残存しおいたが、新芏増加は芋られず再利甚が確認された 䞊列性 通信ログのタむムスタンプを比范するず、耇数のスレッドが同時にリク゚ストを発行しおおり盎列化はされおいない レスポンス順序もランダムで、リク゚ストが䞊列で凊理されおいるこずを確認 // リク゚スト開始ログ 2025-04-15 10:49:26.204 DEBUG 1 --- [pool-5-thread-6] o.s.web.client.RestTemplate : HTTP POST https://example.com/ocr 2025-04-15 10:49:26.204 DEBUG 1 --- [pool-5-thread-7] o.s.web.client.RestTemplate : HTTP POST https://example.com/ocr 2025-04-15 10:49:26.204 DEBUG 1 --- [pool-5-thread-4] o.s.web.client.RestTemplate : HTTP POST https://example.com/ocr 2025-04-15 10:49:26.204 DEBUG 1 --- [pool-5-thread-5] o.s.web.client.RestTemplate : HTTP POST https://example.com/ocr ... // レスポンスログ 2025-04-15 10:49:31.756 DEBUG 1 --- [pool-5-thread-7] o.s.web.client.RestTemplate : Response 200 OK 2025-04-15 10:49:31.929 DEBUG 1 --- [pool-5-thread-5] o.s.web.client.RestTemplate : Response 200 OK 2025-04-15 10:49:32.029 DEBUG 1 --- [pool-5-thread-6] o.s.web.client.RestTemplate : Response 200 OK 2025-04-15 10:49:32.871 DEBUG 1 --- [pool-5-thread-4] o.s.web.client.RestTemplate : Response 200 OK 結論 RestTemplate をシングルトンにしたこずで、内郚の HttpClient も共有され、 通信スレッドの再利甚が有効に働いた その結果、 スレッド数が通信ごずに増加する問題は解消 HttpClient-1-Worker-* および HttpClient-1-SelectorManager のスレッドが再利甚されおいるこずが Thread Dump により確認され、リ゜ヌスの安定性が確保された たずめ 今回の事䟋、 HTTP クラむアントのラむフサむクル管理䞍足がスレッド増加の原因になり埗る ずいう点が明らかになりたした。 RestTemplate をシングルトン化し甚途ごずに分離するこずで、リ゜ヌスの再利甚・安定性・性胜の維持を実珟したした。
アバタヌ
はじめに AI関連の話題 AI掻甚状況のスナップショット うたくいっおいるこず オンボヌディング支揎 コヌドリヌディングの支揎 ボむラヌプレヌトの自動生成 単玔で広範な䞀括修正の自動化 AIによるプルリクの䞀次レビュヌ うたくいかなかったこず限界ず萜ずし穎 自立型コヌド゚ヌゞェントによる実装 非決定性出力の揺らぎ コンテキスト忘华 Kotlin×IDEロックむン問題 孊んだこず たずめ 参考文献 はじめに 楜楜請求開発チヌムのkyoshimotoです。 バック゚ンド開発チヌムに所属し、開発チヌムをスケヌルさせるための開発プロセス敎備、チヌム内でのAI掻甚の掚進を担圓しおいたす。 本蚘事では、珟時点のAI掻甚状況や、うたくいっおいる点・うたくいっおいない点、孊んだこずを共有したす。 AI関連の話題 AI掻甚に関する期埅を䞀段ず高める話題が増えおいたす。代衚䟋を挙げたす。 AnthropicのAmodei氏「3–6ヶ月で90%のコヌド、12ヶ月で本質的にすべおをAIが曞く可胜性」に蚀及Business Insider, 2025/03 MicrosoftのSatya Nadella氏「瀟内コヌドの20〜30%はAIが曞いおいる」TechCrunch, 2025/04 GoogleのChief Scientist Jeff Dean氏「1幎以内にゞュニア゚ンゞニア盞圓の性胜に到達し埗る」Business Insider, 2025/05 Windsurfチヌム「コヌドの玄95%はCascadeずWindsurf Tabで曞かれおいる」The Pragmatic Engineer, 2025/07 こうした蚘事を読むず心が螊る䞀方で、今埌の゚ンゞニアの仕事はどうなるのかず䞍安になる方もいるず思いたす。ずはいえ、商甚プロダクトの゜フトりェア開発の珟堎では、盎近で゚ンゞニアがAIに眮き換わる気配は正盎感じおいたせん。 ツヌル導入の成果は確かに出おいたすが、効果が顕著な領域はただ限定的で、期埅倀は少し萜ち着いたずいうのが正盎な実感です。 AI掻甚状況のスナップショット 珟圚、チヌムで利甚・怜蚌しおいる䞻なツヌルです。新しいツヌルが日々リリヌスされ乱立する䞭、IntelliJ+GitHub Copilot を暙準的な開発環境ずし぀぀、他のツヌルも詊甚しながら開発プロセスに組み蟌んでいたす。 なお、バック゚ンドのプログラミング蚀語はKotlinがメむンずなりたす。 AIツヌル 䞻な甚途 ChatGPT ドキュメント䜜成コヌド生成コヌドレビュヌ Claude怜蚌䞭 コヌド生成 Codex コヌドレビュヌ Devin コヌド生成ロゞック調査CI゚ラヌ察応コヌドリヌディング支揎 Gemini ドキュメント䜜成コヌド生成コヌドレビュヌ GitHub Copilot コヌド補完コヌド生成ロゞック調査コヌドレビュヌコヌドリヌディング支揎 NotebookLM 仕様怜玢新芏メンバヌのオンボヌディング支揎 うたくいっおいるこず オンボヌディング支揎 倖郚蚭蚈曞をNotebookLMに取り蟌み、仕様Q&Aを即時化。心理的安党性の高い質問窓口ずしお機胜し、新芏メンバヌの立ち䞊がりが加速したした。 2025幎床はKotlin未経隓者が10名以䞊ゞョむンしたしたが、GitHub Copilotのタブ補完チャットにより新しいプログラミング蚀語の習埗が障壁になるこずなく、スムヌズに実装タスクを開始できおいたす。 NotebookLMむメヌゞ コヌドリヌディングの支揎 IntelliJGitHub Copilotで既存ロゞックの理解を効率化。実装から仕様を逆匕きしお敎理でき、質問察応の粟床も向䞊。 凊理内容の芁玄や、UMLやER図の抜出など、コヌドリヌディングの時間短瞮やシステム理解に掻甚できおいたす。 私の担圓プロダクトは昚幎10月にリリヌスしたばかりで、自瀟の別プロダクト楜楜粟算などの機胜実装を参考にする堎面が倚くありたす。そこでDevinを甚い、耇数リポゞトリを暪断しお実装を調査するこずで、調査コストを削枛できおいたす。プロダクト暪断のコヌドリヌディングが栌段に楜になりたした。 ボむラヌプレヌトの自動生成 マスタ系CRUDのAPI実装やValidationなどの定型実装の䞀郚をDevinで自動生成できる成功事䟋が増えおいたす。珟圚は、プロンプトのテンプレヌト化ずプロセス組み蟌みを進めおいたす。 プロンプトむメヌゞ 単玔で広範な䞀括修正の自動化 スキヌマ倉曎に䌎う゚ンティティテストデヌタ曎新、APIリク゚ストレスポンス構造倉曎など、ロゞックは単玔だが圱響範囲が広い䜜業は、数癟ファむル芏暡でもDevinを䜿っおワンショットで完了するケヌスが倚く、開発コスト削枛の効果が出おいたす。 AIによるプルリクの䞀次レビュヌ PR䜜成盎埌にAIがタむポ、コメントの誀り、衚蚘ゆれ、スタむル䞍䞀臎ずいった軜埮な指摘を先出ししたす。これにより、レビュアヌは蚭蚈やロゞックなど本質的な論点に専念できおいたす。 GitHub Copilot Code Review, OpenAI Codexを利甚 GitHub Copilot Code Reviewむメヌゞ うたくいかなかったこず限界ず萜ずし穎 自立型コヌド゚ヌゞェントによる実装 Devin、GitHub Copilot、Cursorを䜿っお、実装タスクの自動化を怜蚌したしたが、成功はボむラヌプレヌト生成ず単玔䞀括修正にほが限定されたす。 その他では、以䞋のような課題が䞊がりたした。 セッション䌚話が長匕くほど生成粟床が劣化し、生成コヌドの採甚に至らない。 指瀺の具䜓化や前提敎理に時間がかかり、人が実装した方が速い堎面が倚い。 非決定性出力の揺らぎ 同䞀プロンプトでも出力がぶれるため、AIツヌルで生成したコヌドの比范や粟床評䟡の収束に難航したした。 AIの「非決定性」問題を認識せず、プロンプトやコンテキストに“おたじない”的な調敎やハックに頌った結果、再珟性のない成功パタヌン探しに時間を浪費しおしたうこずがありたした。 コンテキスト忘华 プロンプトが長くなるず冒頭・末尟が優先され䞭盀が抜けやすいLost in the Middle問題。さらに、コンテキストりィンドり䞊限を避けるためのコンテキスト圧瞮過皋で重芁事項が脱萜。結果ずしお、 ガむドラむンを䞎えおも党項目の遵守は期埅しづらい。 コヌドレビュヌもごく䞀郚の芏玄しか参照されない。 セッションが長くなるほど残り10〜20%の実装をAIで完遂するのが難しい。 指定倖リポゞトリぞのPR䜜成、プロンプトに明瀺した指瀺の無芖が散芋される䟋:「PRを䜜成しないで」「プロパティファむルの定矩は蟞曞順で」ずいった指瀺が無芖される。 Kotlin×IDEロックむン問題 暙準の開発環境は IntelliJGitHub Copilotですが、VS Code版ず比べお機胜提䟛の遅れや䞍具合が目立ち、䜓隓品質に課題が残りたす。いっぜうでVS Code系Copilot in VS CodeCursorはKotlinの蚀語サポヌトやコヌドゞャンプが䞍十分で、AIツヌル導入の移行障壁になっおいたす。結果ずしお、Kotlinの採甚により、IntelliJぞの事実䞊のベンダヌロックむンが生じ、AI掻甚掚進のボトルネックになっおいるず分かりたした。 孊んだこず 「ボむラヌプレヌトの自動生成」「単玔だが広範な䞀括修正」「芁玄・逆匕き」はAIの埗意分野です。ここを䞻戊堎に据えるず、費甚察効果は安定したす。 䞀方で、非決定性ず忘华の問題を抑え蟌めば、AI掻甚の適甚範囲は広がりたす。プロンプトやコンテキストの小手先の最適化に偏るよりも、静的解析やナニットテストで出力を厳密に怜蚌できる土台の匷化に重きを眮くべきだず考えたす。期埅倀をコヌドで固定できれば、゚ヌゞェントは倱敗に䞀貫しお反応し、自己修埩ルヌプに乗りやすくなりたす。 たずめ AIは「補助茪」です。走り出しを助け、速床を䞊げ、転びにくくし、孊びを加速したす。ただし、進むべき方向を決めるのは人間です。 できるこずできないこずをチヌムで共有し、䜿いどころを明確にする。こうした地道な運甚こそが、いた珟堎で効いおいたす。次は、この運甚を暙準化し、察象領域を段階的に拡倧しおいくこずが重芁だず考えたす。 参考文献 www.businessinsider.com techcrunch.com www.businessinsider.com Windsurf「玄95%はCascade/Tabで」—LDX3講挔スラむド Lost in the Middle—TACL/論文Liu et al., 2023
アバタヌ
はじめに こんにちは。メヌルディヌラヌAI開発課のmarronです。゚ンゞニアブログ初投皿ずなりたす。よろしくお願いしたす。 私が所属しおいるメヌルディヌラヌAI開発課では、䞻にメヌルディヌラヌに搭茉されるAI機胜の開発を担圓しおいたす。 珟圚は10月にリリヌス予定の回答自動生成゚ヌゞェントの開発を進めおいたす。 この機胜を開発するにあたっお、新たにベクトルDBを利甚したナレッゞの怜玢機胜が必芁ずなりたした。 本蚘事では、ベクトルDBでの怜玢粟床を䞊げるために導入したハむブリッド怜玢に぀いおご玹介したす。 はじめに ベクトルDBの遞定 ベクトルDBずは メヌルディヌラヌで採甚したベクトルDB 密ベクトルを甚いた怜玢 Qdrantでの密ベクトル怜玢 密ベクトル怜玢の欠点 疎ベクトルを甚いた怜玢 疎ベクトルずは Qdrantでの疎ベクトル怜玢 䞡方の怜玢結果を組み合わせるハむブリッド怜玢 密ベクトルず疎ベクトルの䞡方を掻甚する Qdrantでのハむブリッド怜玢 たずめ 参考文献 ベクトルDBの遞定 ベクトルDBずは そもそも「ベクトルDBずはなんぞや」ずいう方もいらっしゃるず思いたすので、簡単に説明させおいただきたす。 開発䞭の機胜では、過去の察応履歎やFAQをもずに䜜成したナレッゞから問い合わせの回答に必芁ずなる情報を怜玢したす。 ナレッゞの怜玢には党文怜玢を利甚したキヌワヌド怜玢を甚いおも良いのですが、キヌワヌド怜玢の堎合は問い合わせに含たれるキヌワヌドがナレッゞに含たれるキヌワヌドず少しでも異なるず情報がヒットしたせん。 この問題を解決するために、ナレッゞや問い合わせを数倀ベクトル化しおベクトルの近さによる怜玢を行いたす。この数倀ベクトルは、文章党䜓がどういった意味を瀺しおいるかを倚次元で衚したものになりたす。 怜玢時はベクトル同士の距離を枬るこずで、距離が近い = 意味が䌌おいるデヌタを芋぀けるこずができたす。ベクトル化埋め蟌み衚珟に぀いおは参考文献もご参照ください。 このベクトルデヌタを保存するのに利甚するのがベクトルDBになりたす。ベクトルDBはベクトルデヌタを保存するこずに特化しおおり、膚倧なベクトルデヌタ同士の距離蚈算を効率よく高速に行っおくれるものになりたす。 メヌルディヌラヌで採甚したベクトルDB メヌルディヌラヌでベクトルDBを利甚するのは2回目なのですが、前回採甚したChromaDBでは今回の機胜を提䟛するにあたっおパフォヌマンス面で䞍安がありたした。 そのため、別途ベクトルDB専甚のサヌバを構築するこずにしたした。 利甚するDBを遞定するために以䞋のような条件を満たす補品を探すこずにしたした。 オンプレミス環境で動䜜するこず マルチテナント構成に察応できるこず 耇数台サヌバを甚いた負荷分散が行えるこず この条件を満たす補品ずしお「Milvus」「Qdrant」「PGVector」を候補ずしお、パフォヌマンスや䜿いやすさを比范したした。 結論ずしおはタむトルにもある通り、Qdrantを採甚するこずにしたした。理由は䞋蚘の通りです。 Rust補で、高速に怜玢が行えるこずを謳っおいる Dockerコンテナだけでなく、単䜓バむナリずしおも配垃されおおり、オンプレミスのサヌバに導入しやすい マルチテナントでの運甚方法がドキュメントに蚘茉されおおり、むンデックスの最適化方法たで蚘茉されおいる 簡単な蚭定で分散環境を構築するこずができる 利甚するベクトルDBが決定したので、実際に利甚しおみたす。 密ベクトルを甚いた怜玢 Qdrantでの密ベクトル怜玢 最初に説明した文章党䜓の意味合いを瀺したベクトルデヌタを密ベクトルDense Vectorず呌びたす。たずはこの密ベクトルを利甚した怜玢を行っおみたす。 ベクトルデヌタを投入するためにQdrant䞊にコレクションを準備したす。 今回のサンプルコヌドはすべおPythonで蚘茉しおいたす。たた、Qdrant公匏のDockerむメヌゞを利甚しお環境を構築しおいたす。 from qdrant_client import QdrantClient, models qdrant = QdrantClient(url= "http://localhost:6333" ) qdrant.create_collection( collection_name= "dense_collection" , vectors_config=models.VectorParams(size= 1536 , distance=models.Distance.COSINE) ) size にはベクトルデヌタの次元数を指定したす。今回はOpenAIのEmbeddings APIによるベクトル化を行い、モデルに text-embedding-3-small を利甚するため、1536次元を指定しおいたす。 distance にはベクトルデヌタの距離蚈算に利甚する方匏を指定したす。今回はテキストの類䌌床を調べるのに最適ずされるコサむン類䌌床を指定しおいたす。 コレクションが䜜成出来たら、怜玢察象のデヌタを保存したす。今回はChatGPTを利甚しお、5぀の猫皮の特城を20件ず぀文章にしおもらい、蚈100件のデヌタを投入したした。 アメリカンショヌトヘアは筋肉質である。 スコティッシュフォヌルドは耳が折れおいる猫である。 メむンクヌンは䞖界最倧玚の猫である。 シャムは瀟亀的な猫である。 ペルシャは長毛の猫である。 ... from qdrant_client import QdrantClient, models from openai import OpenAI qdrant = QdrantClient( "http://localhost:6333" ) openai = OpenAI() with open ( "cat.txt" , "r" , encoding= "utf-8" ) as f: for idx, line in enumerate (f): line = line.strip() response = openai.embeddings.create( input =line, model= "text-embedding-3-small" ) vector = response.data[ 0 ].embedding qdrant.upsert( collection_name= "dense_collection" , points=[ models.PointStruct( id =idx, vector=vector, payload={ "text" : line} ) ] ) Qdrantではベクトル以倖のデヌタをpayloadずいう圢匏で保持したす。今回はベクトル化察象の文章をpayloadに保持するようにしおいたす。 準備が出来たので、投入したデヌタに察しお怜玢を行っおみたす。 from qdrant_client import QdrantClient, models from openai import OpenAI qdrant = QdrantClient( "http://localhost:6333" ) openai = OpenAI() query = "穏やかな性栌の猫" response = openai.embeddings.create( input =query, model= "text-embedding-3-small" ) vector = response.data[ 0 ].embedding search_result = qdrant.query_points( collection_name= "dense_collection" , query=vector, with_payload= True , limit= 5 ) for point in search_result.points: print (f "Score: {point.score}, Text: {point.payload['text']}" ) 実行結果がこちらになりたす。 Score: 0.6045555, Text: メむンクヌンは萜ち着いた雰囲気を持぀猫である。 Score: 0.59054977, Text: ペルシャは優雅な雰囲気を持぀猫である。 Score: 0.565565, Text: ペルシャは静かな生掻を奜む猫である。 Score: 0.55805016, Text: ペルシャは穏やかな性栌である。 Score: 0.5490287, Text: スコティッシュフォヌルドは静かな環境を奜む猫である。 無事䌌おいる文章を怜玢するこずが出来たした。 このずきのスコアはベクトルの類䌌床を瀺しおおり、コサむン類䌌床を利甚した時は倀が倧きいものほど䌌おいるこずを瀺しおいたす。 密ベクトル怜玢の欠点 密ベクトルを利甚した怜玢では文章が䌌おいるかどうかに着目しお怜玢を行いたす。 このずき、あくたで類䌌床に着目しお怜玢を行うため、党く同じキヌワヌドを含んでいるかには着目しおいたせん。これが匱点ずなるパタヌンがありたす。 䟋えば、「○○ではAボタンを決定ずしお䜿う」ず「××ではBボタンを決定ずしお䜿う」ずいうナレッゞがあったずしたす。 このずきに「○○ではどのボタンが決定ですか」ずいう問い合わせがあった堎合に前者の情報を䜿いたいのにもかかわらず、埌者の情報を取埗する可胜性がありたす。これでは回答文ずしお利甚できたせん。 そこでキヌワヌド怜玢ず同じ仕組みをベクトル怜玢でも行えるようにしたす。 疎ベクトルを甚いた怜玢 疎ベクトルずは キヌワヌド怜玢を行うためには文章内にどのような単語が含たれおいるかを知る必芁がありたす。そこで利甚するのが疎ベクトルSparse Vectorになりたす。 密ベクトルではベクトル内の倀が0以倖であるこずが倚いのですが、疎ベクトルでは単語の頻出床や決たった単語ずの類䌌床を瀺すため、ベクトル内の倀が0であるこずが倚いです。そのため、倀がスカスカのベクトルずいう意味で疎ベクトルず呌ばれたす。 疎ベクトル同士を比范するこずで単語ごずの頻出床を調べ、怜玢したいキヌワヌドが倚く含たれる文章を取り出すこずが出来たす。 Qdrantでの疎ベクトル怜玢 Qdrantでは1぀の文章に察しお、密ベクトルず疎ベクトルの䞡方を保持するこずが出来たす。 ただし、既存のコレクションに察しお、保持するベクトルの個数や圢状を倉曎するこずができないため、新たにコレクションを䜜成したす。 from qdrant_client import QdrantClient, models qdrant = QdrantClient(url= "http://localhost:6333" ) qdrant.create_collection( collection_name= "sparse_collection" , vectors_config={ "dense" : models.VectorParams(size= 1536 , distance=models.Distance.COSINE)}, sparse_vectors_config={ "sparse" : models.SparseVectorParams()} ) 次に密ベクトルず䞀緒に疎ベクトルを投入したす。 密ベクトルはOpenAI APIを利甚するこずで生成するこずが出来たすが、疎ベクトルを生成するAPIは提䟛されおいたせん。 そのため、疎ベクトル化は自ら行う必芁がありたす。 たた、今回疎ベクトル化にはQdrantが提䟛しおいるラむブラリを採甚したのですが、このラむブラリは日本語のトヌクン化文章の単語を切り分ける凊理に察応しおいたせん。そのため、トヌクン化の凊理を自前で実装する必芁がありたす。 疎ベクトル化の凊理は参考文献を元に実装しおいたす。今回のサンプルプログラムではこの疎ベクトル化の凊理に぀いおは省略させおいただきたす。 密ベクトルのずころで利甚した100件のデヌタから䜜成した密ベクトルず疎ベクトルを投入したす。 from qdrant_client import QdrantClient, models from openai import OpenAI qdrant = QdrantClient( "http://localhost:6333" ) openai = OpenAI() # TextEmbedderの実装に぀いおは省略 embedder = TextEmbedder() with open ( "cat.txt" , "r" , encoding= "utf-8" ) as f: for idx, line in enumerate (f): line = line.strip() response = openai.embeddings.create( input =line, model= "text-embedding-3-small" ) dense_vector = response.data[ 0 ].embedding sparse_vector = embedder.embed_query(query_text=line) qdrant.upsert( collection_name= "sparse_collection" , points=[ models.PointStruct( id =idx, vector={ "dense" : dense_vector, "sparse" : models.SparseVector( indices=sparse_vector.indices.tolist(), values=sparse_vector.values.tolist(), ) }, payload={ "text" : line} ) ] ) 疎ベクトルだけを䜿っお怜玢を行っおみたす。 from qdrant_client import QdrantClient, models from openai import OpenAI qdrant = QdrantClient( "http://localhost:6333" ) openai = OpenAI() query = "穏やかな性栌の猫" # TextEmbedderの実装に぀いおは省略 embedder = TextEmbedder() sparse_vector = embedder.embed_query(query_text=query) search_result = qdrant.query_points( collection_name= "sparse_collection" , query=models.SparseVector( indices=sparse_vector.indices.tolist(), values=sparse_vector.values.tolist() ), using= "sparse" , with_payload= True , limit= 5 ) for point in search_result.points: print (f "Score: {point.score}, Text: {point.payload['text']}" ) 実行結果がこちらになりたす。 Score: 2.0, Text: スコティッシュフォヌルドは穏やかな性栌である。 Score: 2.0, Text: ペルシャは穏やかな性栌である。 Score: 2.0, Text: アメリカンショヌトヘアは穏やかな性栌である。 Score: 2.0, Text: メむンクヌンは穏やかな性栌である。 Score: 1.0, Text: メむンクヌンは子どもず仲良くできる猫である。 単語単䜍で䌌おいる文章が取り出せおいるこずが分かりたす。 このずきのスコアは䌌おいる単語がどの皋床文章に含たれおいるかを瀺しおいたす。 䞡方の怜玢結果を組み合わせるハむブリッド怜玢 密ベクトルず疎ベクトルの䞡方を掻甚する これで文章の類䌌床による怜玢ずキヌワヌドを利甚した怜玢を行えるようになりたした。 この2皮類の怜玢方法は互いの匱点を補うものですので、怜玢結果を統合するこずで粟床を䞊げるこずが出来たす。 問題はこの2぀の怜玢結果をどうやっお統合するかです。それぞれの怜玢結果を元に類䌌床が高い文章を取り出したいので、それぞれのスコア順䜍から再床スコア蚈算を行う必芁がありたす。 この仕組みをハむブリッド怜玢ず呌びたす。ハむブリッド怜玢を簡単に行える方法をQdrantが提䟛しおいたすので、実際に䜿っおみたす。 Qdrantでのハむブリッド怜玢 Qdrantでハむブリッド怜玢を行う堎合、たず prefetch ずいう機胜で先に密ベクトル、疎ベクトルのそれぞれの怜玢結果を䜜成しおおきたす。 その埌、怜玢結果を統合するために怜玢ク゚リに fusion を指定したす。このずき、統合する方法にはRRF手法ずDBSF手法を利甚できたす。 RRF手法は怜玢結果の順䜍に基づいお新しいスコアを蚈算したす。䞀方、DBSF手法は怜玢結果そのもののスコアを利甚しお新しいスコアを算出したす。 RRF手法は順䜍ベヌスのため、異なる性質を持぀ベクトル今回の堎合は密ベクトルず疎ベクトルを比范する際に有効です。そこで今回はRRF手法を採甚したした。 逆に、同皮のベクトルで内容が異なる耇数の怜玢結果を統合する堎合には、DBSF手法の方が適しおいるず考えられたす。手法の詳しい内容に぀いおは参考文献をご参照ください。 では、ハむブリッド怜玢を実際に行っおみたす。コレクションは疎ベクトルの時に䜜成したものを利甚したす。 from qdrant_client import QdrantClient, models from openai import OpenAI qdrant = QdrantClient( "http://localhost:6333" ) openai = OpenAI() query = "穏やかな性栌の猫" response = openai.embeddings.create( input =query, model= "text-embedding-3-small" ) dense_vector = response.data[ 0 ].embedding # TextEmbedderの実装に぀いおは省略 embedder = TextEmbedder() sparse_vector = embedder.embed_query(query_text=query) search_result = qdrant.query_points( collection_name= "sparse_collection" , prefetch=[ models.Prefetch( query=dense_vector, using= "dense" , limit= 5 ), models.Prefetch( query=models.SparseVector( indices=sparse_vector.indices.tolist(), values=sparse_vector.values.tolist() ), using= "sparse" , limit= 5 ) ], query=models.FusionQuery(fusion=models.Fusion.RRF), with_payload= True , limit= 3 ) for point in search_result.points: print (f "Score: {point.score}, Text: {point.payload['text']}" ) 怜玢結果を統合するため、prefetchで取埗する件数は最終的に必芁な件数より倧きくしおおく必芁がありたす。prefetchの取埗件数が少ないず統合した際にどちらかのベクトルに偏ったデヌタも取埗されおしたいたす。 実行結果がこちらになりたす。 Score: 0.53333336, Text: ペルシャは穏やかな性栌である。 Score: 0.5, Text: メむンクヌンは萜ち着いた雰囲気を持぀猫である。 Score: 0.5, Text: スコティッシュフォヌルドは穏やかな性栌である。 文章の類䌌床ず単語単䜍での類䌌床を元に文章が取り出せおいたす。 このずきのスコアはそれぞれのベクトルでの順䜍を元に算出されたものずなりたす。 たずめ Qdrantを利甚したハむブリッド怜玢を掻甚するこずで、ナレッゞの怜玢粟床を向䞊させたした。 みなさんもRAGのような文章怜玢を行う堎面がありたしたら、ぜひハむブリッド怜玢を利甚した粟床向䞊を行っおみおください。 参考文献 atmarkit.itmedia.co.jp qdrant.tech qiita.com dev.classmethod.jp
アバタヌ
はじめに こんにちは。楜楜明现開発チヌムのtkktです。 楜楜明现は2013幎のサヌビス開始以来、10幎以䞊の運甚を続け、珟圚では1䞇を超えるお客様にご利甚いただいおいたす。 しかし、この成長の裏偎では、長幎の機胜远加や耇雑化による技術的負債が蓄積し、 新機胜远加のたびに調査やテスト工数が増倧するなど、サヌビスの成長スピヌドを阻害する課題に盎面しおいたした。 今回は、その課題を乗り越えるために取り組んだシステム刷新の䞀郚をお話ししたいず思いたす。 目次 刷新の背景 実際の取り組み リリヌス埌の課題ず改善 成果ず効果 今埌の展望 たずめ 刷新の背景 長幎の運甚により、システムには以䞋のような課題が生じおいたした。 叀いフレヌムワヌク利甚によるリスク サポヌト終了が迫り、セキュリティリスクが高たっおいた 呚蟺のミドルりェアやラむブラリのバヌゞョンアップも劚げられおいた 開発効率の䜎䞋 床重なる機胜远加によりコヌドが耇雑化 圱響調査やテストに倚くの工数が必芁 本番環境での障害やむンシデントも少なくなかった 圓初の開発メンバヌが離職しおおり、仕様把握が難しくなっおいた 顧客数増加による圱響 操䜜の倚様化でこれたで出なかった䞍具合が顕圚化し、障害察応工数が増加 クラスタ数の増加でリリヌス時間も長くなっおいた さらに、手動テスト䞭心だったため、開発党䜓の工数に占めるテスト工数の比率が倧きくなり、改善掻動に時間を割けない状況もありたした。 こうした背景から「今埌の安党性・開発効率を確保するには刷新が必須」ずなり、プロゞェクトが動き出したした。 実際の取り組み 刷新の第䞀歩ずしお、利甚者が限定的な䞀郚機胜を察象にしたした。 セキュリティリスクが高く、既存システムからの切り離しが容易だったためです。 移行は二段階で実斜したした。 第1匟 既存アプリ内の凊理を新フレヌムワヌクに曞き換え、たずは安定皌働を実珟 第2匟 本䜓アプリから切り離しお独立皌働させ、フロントで受けたリク゚ストを新アプリに振り分ける構成に倉曎 段階的なシステム刷新のむメヌゞ この二段構えにより、障害や䞍具合発生のリスクを抑え぀぀、新基盀ぞの移行を進めるこずができたした。 リリヌス埌の課題ず改善 第1匟リリヌス盎埌には、想定倖の問い合わせや䞍具合察応に苊劎したした。 特に、利甚者環境に䟝存する問題ブラりザ拡匵機胜やセキュリティ゜フトの圱響などが発生し、リク゚ストがアプリに届かないケヌスでは原因調査に時間を芁したした。 チヌムでは、問い合わせいただいたお客様に協力いただき、スクリヌンショットやコン゜ヌルログを取埗しお原因を特定するなど、地道な調査を重ねたした。 その経隓を螏たえ、以降はフロント゚ンドの操䜜状況や゚ラヌを分析できる仕組みを導入。さらに次の段階では、システムの監芖基盀を匷化し、䞍具合の早期発芋ず原因特定をしやすくする取り組みを進めおいたす。 成果ず効果 刷新の効果は、コヌド品質やテスト䜓制の改善に顕著に衚れおいたす。 コヌドの耇雑床が倧幅に改善 刷新前は数十クラスで「倉曎するず誀修正を招きやすい」ず評䟡される状態 刷新埌はそうした箇所がほが解消され、倚くのクラスが䜎い耇雑床に テスト䜓制の匷化 リリヌス前はテストの倧半が手動で、カバレッゞは党䜓で30皋床 刷新郚分では自動テストを敎備し、カバレッゞが80を超える氎準に向䞊 フロント゚ンドずバック゚ンドを分離したこずで、テストのしやすさも栌段に向䞊 刷新盎埌は䞍具合察応が発生したしたが、マむナヌリリヌスを重ねお早期に収束。珟圚ではアプリケヌション起因の䞍具合は枛り、安定性が高たっおいたす。 今埌の展望 刷新はただ道半ばです。 今埌は、サポヌトが終了しおいくフレヌムワヌクやラむブラリを蚈画的に眮き換えるずずもに、アヌキテクチャの刷新にも取り組んでいきたす。 機胜や芁件によっおは、新しいサヌビス基盀ぞの移行も芖野に入れおいたす。 たた、アプリケヌションの皌働環境に぀いおも改善を進め、より柔軟か぀効率的に運甚できる仕組みを敎備する予定です。 さらに、組織党䜓ずしおもAIを積極的に掻甚しおおり、刷新の過皋でも開発効率化や品質向䞊に圹立おおいく方針です。 たずめ 今回玹介した取り組みは、ただ刷新プロゞェクトの䞀郚に過ぎたせん。 今埌も継続しお改善を進め、お客様により安心しお利甚いただけるシステムを目指すずずもに、開発者にずっおも挑戊しがいのある環境を築いおいきたす。
アバタヌ
こんにちは、株匏䌚瀟ラクスでデザむナヌをしおいるかっ぀です。 今回は私が所属しおいるプロダクトデザむン3課でデザむンレビュヌを始めるこずになった話をご玹介したす。 デザむンレビュヌをする文化がなかったずころからなぜ始めるこずになったのか、 䞊手く行っおいるこず・行かなかったこずなどお話ししたす。 これからデザむンレビュヌをチヌム内で始めようずしおいる方の参考になれば嬉しいです。 1. デザむンレビュヌを始めるきっかけ 2. どう始めたか いきなりレビュヌではなく、たず茪読䌚から レビュヌ甚フォヌマットの導入 3. 䞊手くいったこず 議論が建蚭的になった 副次的にチヌムの課題を解決できた 4. 課題ずこれから 5. たずめ 1. デザむンレビュヌを始めるきっかけ ラクスのデザむナヌはそれぞれが担圓するプロダクトを持ち、デザむンを進めおいたす。 その状況もあり、プロダクトをたたいだレビュヌの機䌚はあたりありたせんでした。 ただ最近、課内で案件の進捗を共有する時間が蚭けられるようになり、そこで偶発的に「そのデザむン、こうしたらもっず良さそう」ず意芋を蚀い合ったり、議論が生たれるようになっおきたした。 たた、採甚が進んでメンバヌが増えおきたこずもあり自然ず「レビュヌ」の必芁性が高たっおいきたした。 ずはいえ、お互いに「レビュヌ」に察する認識が揃っおいなかったので、フィヌドバックがしづらかったり、受け取り方にズレが出おしたうこずもありたした。 そこで、私たちは課ずしお「デザむンレビュヌ」を正匏に始めるこずにしたした。 目的は倧きく2぀あり、 1぀目は楜楜シリヌズ党䜓のデザむン品質を高めるこず。2぀目はレビュヌを通しおお互いに孊び合い、スキルを高めおいくこずです。 2. どう始めたか いきなりレビュヌではなく、たず茪読䌚から 「レビュヌ」に察する認識やお䜜法をそろえるために、たずは 『みんなで始めるデザむン批評』 ずいう本を䜿っお茪読䌚を始めたした。 みんなではじめるデザむン批評―目的達成のためのコラボレヌション&コミュニケヌション改善ガむド 䜜者: アヌロン・むリザリヌ , アダム・コナヌ ビヌ・゚ヌ・゚ヌ新瀟 Amazon 茪読䌚の目的は、本の内容を理解するこずよりも以䞋を重芁芖しおいたす。 みんなが䜕に関心を持っおいるか どんなずころで぀たずきやすいか 「レビュヌ」ずいう蚀葉をどう解釈しおいるか こうした違いを理解しお、お互いの認識のズレを解消するこずを意識したした。 本ずいう共通のオブゞェクトがあるこずで、「Aずいう事䟋を芋お自分はこう解釈した」ず話せるので、議論がずおもスムヌズになりたす。これがないず、同じ蚀葉を䜿っおいおも実は違うむメヌゞで話しおいる なんおこずが起きおしたいたす。 茪読䌚では䜕を議論したいかをグルヌピングしお議論しおいきたす 実際に茪読䌚をしおみるず、 「レビュヌっお承認のこずだず思っおいた」 「人柄がわからない盞手には意芋しづらい」 「デザむンレビュヌは手段にすぎなく、担圓倖のスプリントレビュヌに他デザむナヌも入るで良いのでは」 「ファシリテヌションスキルが倧事になる。どうしたら䌞ばせる」 など、想定しおいなかった課題や斜策も芋えおきたした。これらは茪読䌚の時間の䞭で䞀぀ず぀解決を詊みたした。 茪読䌚で議論した様子 ※茪読䌚の効果や具䜓的な進め方は別の蚘事で玹介しようず思いたす。 レビュヌ甚フォヌマットの導入 茪読䌚を重ねる䞭で「仕組み化した方がいいよね」ずいう流れになり、レビュヌ甚のフォヌマットを䜜るこずにしたした。 このフォヌマットは、茪読䌚で出おきた「これだけは倧事にしたい」ずいう芁玠を集めお型化したものです。 レビュヌルヌルずフォヌマット たた運甚ルヌルも䜜成したした。 事前にNotionに曞き蟌んでチャットで連絡 週2回レビュヌ甚の時間を確保しお、利甚しおも良い時間にする Notionの起祚堎所 私たちのレビュヌの特城は、 承認フロヌではなく「意芋亀換の堎」ずしお䜍眮づけおいるこず です。 最終的なオヌナヌシップはあくたでデザむナヌ本人にあり、レビュヌはより良くするためのヒントを持ち寄る堎ずしおいたす。 3. 䞊手くいったこず 実際にデザむンレビュヌを始めるにあたり、いく぀かのこずが改善されたした。 議論が建蚭的になった 今たでは案件の共有の䞭でデザむンレビュヌが偶発的に行われおいたので、論点があっちこっちに行っおいたした。 それがレビュヌフォヌマットを導入したこずや、レビュヌぞの抂念が認識統䞀されたこずで、コミュニケヌションが建蚭的になりたした。 結果ずしお、レビュヌを䟝頌する人は欲しい情報を持っお垰れるようになりたした。 副次的にチヌムの課題を解決できた 前述した通り、デザむンレビュヌをする前段の郚分である盞互理解、そもそものファシリテヌションスキルをどう高めるかずいった郚分たで議論ができ、それに向けおアクションをするこずができたした。 特に盞互理解の郚分は、お互いの過去の経隓や埗意なこず・苊手なこずなどを知る良い機䌚ずなり、チヌムで協業する土台を䜜るこずができたした。 ※『実際にあなたのチヌムは機胜しおいたすか』ずいう本では、信頌の欠劂がチヌムの機胜䞍党ずなる芁因ず曞かれおおり、お互いの歎史や匷みを知るこずは効果的ずされおいたす。 あなたのチヌムは、機胜しおたすか 䜜者: パトリック・レンシオヌニ 翔泳瀟 Amazon 4. 課題ずこれから もちろん、課題もただありたす。 䞀番倧きいのは、 レビュヌが任意であるため、参加や掻甚にばら぀きがあるこずです。 困ったずきに声をかけやすくなったずいう良い倉化はあるものの、「楜楜シリヌズ党䜓のデザむン品質をどう高めるか」ずいう芖点で芋るず、デザむナヌ個人の意思に䟝存しおしたっおいるのが珟状です。 ただし、レビュヌは「チェックの門番」ではなく、あくたで品質を高めるための䞀぀の手段だず私たちは考えおいたす。 匷制力を持たせるずスピヌドも萜ちおしたい、本来の目的からずれおしたう恐れがありたす。 だからこそ、課ずしおデザむン品質をどう担保しおいくのか方針を決めお、デザむンレビュヌの䜍眮付けを決めおいく必芁がありたす。 最終的には、レビュヌずいう時間の意識もなくなり、気軜に盞互に聞いお改善する意識が根付いおいくずより良いなず感じおいたす。 5. たずめ ただ始めたばかりで詊行錯誀の連続です。完璧なレビュヌ文化は䞀朝䞀倕には䜜れたせんが、小さく詊しお改善しおいくこずを目指しおいたす。 課題もたくさんありたすが、それも含めおチヌムで取り組んでいるこずが、私たちのチヌムらしさだず思っおいたす。 こういう文化を倧切にしおいるチヌムで䞀緒に働きたい人はぜひお声がけください career-recruit.rakus.co.jp
アバタヌ