Upgrade to Pro — share decks privately, control downloads, hide ads and more …

マルチテナントSaaSでのRLS導入に際し、並列でDevinを動かし高い品質のコードをパワフル...

Avatar for IkedaNoritaka IkedaNoritaka
July 25, 2025
280

 マルチテナントSaaSでのRLS導入に際し、並列でDevinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例

Avatar for IkedaNoritaka

IkedaNoritaka

July 25, 2025
Tweet

Transcript

  1. ・NoritakaIkeda ・X(Twitter): @omotidaisukijp ・ROUTE06 Liam開発部 ・好きなDevinの使い方: MTG中に出た話題を すぐ裏でPoC化する 自己紹介 2

    はじめに マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例
  2. 我々のチームでは、 Devinは多くのタスクをパワフルに遂行してくれました 9 はじめに マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 - マルチテナント SaaSのRLSポリシーを数日で

    20テーブル近く貼り、プロダクトに貢献した - neverthrowの導入によるエラーハンドリング改善を行い、より保守性の高い設計へ移行した - 数多くのESLintルールを導入し、コードをリファクタリングし開発生産性へ貢献した - MTGで話した内容を誰よりも早く着手し、すぐに PoCを用意した - リポジトリの TODOコメントをすべて Issue化し、大部分を着手・完了 - etc……
  3. - 今日の話を聞いて、 Devinをよりチーム内で活躍させてほしい - Devinにも成果を出してもらえるような開発体制を目指す。よその Devinよりうちの Devinの 方が成果を上げている状態を目指す - 単純な作業からより複雑で規模が大きい作業を任せられるようにする

    - Devinで行なった、マルチテナント SaaSRLSの並列実装の事例 - Devinと協働しながら設計を行う。モデルケースを例示して、セッションを並行して 均一な質の成果を出してもらう 10 はじめに マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 今日話すこと “Large-scale challenges: Devin generally performs better on smaller, clearly scoped tasks. For more complex edits, we recommend breaking up the project into smaller, isolated tasks that you can run in separate sessions that build on each other.” https://docs.devin.ai/get-started/devin-intro#limitations
  4. Devinと行なった、 RLSの並列実装 12 Devinで行なった、マルチテナント SaaSRLSの並列実装の事例 マルチテナント SaaSのRLSを実装する際、 Devinで並列実装をした - アプリケーション側のコードに影響することなく実装を進められた

    - 並列で一貫した品質の実装を、一人で、数日の間にパワフルに完了できた - このプロセスを、 RLSに限らず、リアーキテクチャの際に参考にしていただけたら嬉しい
  5. 前提2: RLS導入の背景 14 Devinで行なった、マルチテナント SaaSRLSの並列実装の事例 マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 マルチテナント SaaSの要件

    - マルチテナント SaaSとは、複数の顧客(テナント)が同じ 1つのソフトウェアインスタンスやインフラを共有しながら も、それぞれが独立してサービスを利用できる形態の SaaS 同じ1つのソフトウェアインスタンスやインフラを共有 - DBも共有する。 - 共有はするが、テナント Aに所属する顧客が、テナント Bに所属する顧客のデータにアクセスできないようにした い Row Level Securityとは - ユーザーごとにアクセスできる「行(レコード)」を制限するセキュリティ機能 - https://supabase.com/docs/guides/database/postgres/row-level-security - https://www.postgresql.jp/docs/9.6/ddl-rowsecurity.html
  6. 前提3: Devin を採用した理由 15 Devinで行なった、マルチテナント SaaSRLSの並列実装の事例 マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 -

    Devin は、以下のような特性があり、今回のような並列・大量の作業には相性が良い - 指示に対して PR 単位で成果物をまとめてくれる - エージェントを複数セッションとして同時に立ち上げられる - 推論能力・推進力が高く、プロンプトのテンプレートを読んで、個々のケースで自己解決しやり切る力が ある
  7. Devinによる並列実装の道のり 16 Devinで行なった、マルチテナント SaaSRLSの並列実装の事例 マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 1. 設計・実装の方針を立てる 2.

    モデルケースを作成する 3. Devinに依頼してすべてのテーブルに対して PRを作成する 4. 人の目で確認して PullRequestをオープンにしていく 5. レビューしてもらい、 Mergeする
  8. Devinによる並列実装の道のり 17 Devinで行なった、マルチテナント SaaSRLSの並列実装の事例 マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 1. 設計・実装の方針を立てる 2.

    モデルケースを作成する 3. Devinに依頼してすべてのテーブルに対して PRを作成する 4. 人の目で確認して PullRequestをオープンにしていく 5. レビューしてもらい、 Mergeする
  9. 設計・実装の方針を立てる 18 Devinで行なった、マルチテナント SaaSRLSの並列実装の事例 マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 - 方針を ADR

    にまとめて明文化 - RLS の設計方針は ADR(Architecture Decision Record)として文書化しました。 - 全テーブルに organization_id を追加し、 RLS はこれを基準に設計する ユーザーは、自身が所属する組織 のデータにのみアクセスできる - クライアントとジョブで異なるアクセスロール( anon と service_role)を区別して制御する 外部サービス連携 など、一般的でない操作については個別に設計する - アプリケーションへの影響を抑える実装構造・トリガーと関数による自動補完の方針 - たとえば、レコードの INSERT 時にアプリケーション側から organization_id を明示的に渡す必要があり、 複数の既存フォームやロジックに影響が波及する メンバーのタスクとコンフリクトしやすくなる - 「organization_id はアプリケーションから渡さない。 DB 側で自動的に補完する構造にする」という方針を取 りました
  10. 設計・実装の方針を立てる 19 Devinで行なった、マルチテナント SaaSRLSの並列実装の事例 マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 DB Trigger・DB Functionsを用いて、

    SQLファイルのみに影響するような実装を進めていく CREATE OR REPLACE FUNCTION public.set_knowledge_suggestions_organization_id() RETURNS trigger AS $$ BEGIN NEW.organization_id := ( SELECT organization_id FROM public.projects WHERE id = NEW.project_id ); RETURN NEW; END; $$ LANGUAGE plpgsql SECURITY DEFINER; CREATE TRIGGER set_knowledge_suggestions_organization_id_trigger BEFORE INSERT OR UPDATE ON public.knowledge_suggestions FOR EACH ROW EXECUTE FUNCTION public.set_knowledge_suggestions_organization_id();
  11. Devinによる並列実装の道のり 21 Devinで行なった、マルチテナント SaaSRLSの並列実装の事例 マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 1. 設計・実装の方針を立てる 2.

    モデルケースを作成する 3. Devinに依頼してすべてのテーブルに対して PRを作成する 4. 人の目で確認して PullRequestをオープンにしていく 5. レビューしてもらい、 Mergeする
  12. RLSを適用するモデルケースの作成 22 モデルケースを作成する マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 Devinに並列で依頼する前に、チームのコード品質に準拠した PRを作成する - あらかじめ作成した大まかなプロンプトで

    Devinへ依頼する - コード品質を安定させるために、結構人の手を入れながらプロンプトの精度を上げていく - PRが完成したら、「ここまでの実装を他のセッションでも行えるようにプロンプトにして」と依頼
  13. モデルケースを実装していく中で修正して行った箇所 24 モデルケースを作成する マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 - アプリケーション側の変更を最小にするための DB補完構造が実際に正しく動作するか検証 -

    実際に補完され、アプリケーションコードには一切変更が不要なことを確認 - Supabase 型自動生成との整合性調整 - トリガーで自動補完される項目も自動生成型では「必須」と解釈され型エラー - organization_id?: string | null とする型オーバーライドを導入 - 利用していない操作( SELECT/INSERT/UPDATE/DELETE)は RLS で禁止するべき - DB補完との整合性を保つために、 SQL構文も一貫性ある形式(サブクエリ形式)に統一 → Devin へのプロンプト作成だけでは見えなかった細部が、実装や PRを通じて浮き彫りに
  14. RLS導入までの道のり 26 Devinで行なった、マルチテナント SaaSRLSの並列実装の事例 マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 1. 設計・実装の方針を立てる 2.

    モデルケースを作成する 3. Devinに依頼してすべてのテーブルに対して PRを作成する 4. 人の目で確認して PullRequestをオープンにしていく 5. レビューしてもらい、 Mergeする
  15. RLS導入までの道のり 30 Devinで行なった、マルチテナント SaaSRLSの並列実装の事例 マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 1. 設計・実装の方針を立てる 2.

    モデルケースを作成する 3. Devinに依頼してすべてのテーブルに対して PRを作成する 4. 人の目で確認して PullRequestをオープンにしていく 5. レビューしてもらい、 Mergeする
  16. 人間が行う必要があったこと① 31 Devinで行なった、マルチテナント SaaSRLSの並列実装の事例 マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 我々のプロジェクトの都合上手を加えた部分です。回避する方法はあったかもしれません - supabaseの自動生成の型の不整合

    - supabase cliで生成している型は全体の最新状態を反映する必要があるため、並列で作成された PR 同士で コンフリクトしやすい状況が生まれました。 Devin上で解決できなかったため、人の手で再生成・ コミットを行う必要があるケースも一部で発生しました。
  17. 人間が行う必要があったこと② 32 Devinで行なった、マルチテナント SaaSRLSの並列実装の事例 マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 我々のプロジェクトの都合上手を加えた部分です。回避する方法はあったかもしれません - アクセス経路やポリシーの過不足

    - RLS ポリシーの設定は、 Devin による “.from('テーブル名 ')” 検索に基づいて実施されていましたが、 アプリケーションからは使用されていない操作( INSERT や DELETE など)が明示的に許可されている ケースがあった。 - 使用されていない操作はすべて禁止とする方針で明示的に修正を行った。
  18. 補足: Devinへ任せているうちにやった方がいいこと 34 Devinで行なった、マルチテナント SaaSRLSの並列実装の事例 マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 Devinをジュニアエンジニアだと例えるなら、稼働に穴が開かないように次のタスクを用意しておくべき -

    私たちができることは Devinのタスクが途切れないように、調査・設計・指示を出し続けること - 私たちが力を入れて作業している際、裏で AIエージェントが走っていないと不安になる状態を目指す - Issueを作る際も、一次調査を任せる、 Issueのテンプレートを埋める作業を任せる、 Sub Issue化を一緒に やるなど、使える箇所はできるだけ使う
  19. おわりに 35 Devinで行なった、マルチテナント SaaSRLSの並列実装の事例 マルチテナント SaaSでのRLS導入に際し、並列で Devinを動かし高い品質のコードをパワフルにプロダクションへ反映させた事例 マルチテナント SaaS における

    RLS(Row-Level Security)の導入方針を整理し、 Supabase 上の複数テー ブルに組織単位のセキュリティ制御を適用していった実践例を紹介しました。 - Devin を活用し、短期間で十数本のマイグレーションと RLS ポリシーの導入を完了 - 成功の背景には、例外パターンの洗い出しとプロンプトのテンプレート化があった - 作業を構造化し、例外を見極める力は、テックリード的視点として依然人間に求められる