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

BtoB SaaS開発基礎講座

BtoB SaaS開発基礎講座

2024年の 日本CTO協会 合同新人研修にて実施した内容です。

YAGASAKI Akihiro

July 22, 2024
Tweet

More Decks by YAGASAKI Akihiro

Other Decks in Technology

Transcript

  1. © 2024 Anti-Pattern Inc. All rights reserved. BtoB SaaS開発基礎講座 2024/06/12

    於 ⽇本CTO協会 合同新⼈研修 株式会社アンチパターン ⽮ヶ崎哲宏
  2. ⾃⼰紹介 3 ⽮ヶ崎 哲宏(Akihiro YAGASAKI) 株式会社アンチパターン 取締役 CTO兼COO 役割︓⽇本のソフトウェアエンジニアを憧れの職業に するためのいろいろ

    経歴︓アマゾン ウェブサービス ジャパン にて SaaSシニアパートナーソリューションアーキテクト Webメディア/SaaSベンダーにて技術責任者ボードメンバー ⼤⼿SIerグループ会社にて情シス責任者 アニメソングのコーラス など 2022, 2023, 2024 Japan AWS Top Engineers (Software) 1975年⽣まれ
  3. © 2024 Anti-Pattern Inc. All rights reserved. 会社の紹介 「⽇本のソフトウェアエンジニアを憧れの職業へ」を掲げるスタートアップ 企業概要

    会社名 株式会社アンチパターン (Anti-Pattern Inc.) 設⽴ 2019年7⽉1⽇ 代表者 ⼩笹 佑京 (おざさ ゆうき) 所在地 東京都港区南⻘⼭3-15-9 MINOWA表参道3階 資本⾦ 65,000千円 主要株主 ⼩笹佑京 決算期 6⽉ 公式WEB/SNS https://anti-pattern.co.jp / X : @antipatterninc SaaSコントロールプレーンをSaaSとして機能提供 B2B SaaSの開発/運⽤/販売を⽀援するSaaS 様々な企業に対するソフトウェア開発の⽀援事業 アジャイルのアプローチでプロダクト価値を最⼤化 ソフトウェア開発⽀援 優秀なエンジニアと、⾼付加価値/⾼単価な案件を依頼 したい企業のマッチングサービス AWSエンジニア特化型マッチングサービス Webアプリケーションをテーマにソフトウェア開発を4年間かけて学び デジタルネイティブ⼈材を輩出 ⼤学⽣向けプログラミング学習コミュニティ ソフトウェアエンジニアに必要な場を提供 エンジニア向け勉強会/交流会/セミナーなども実施 エンジニア特化型コミュニティスペース 実務シミュレーションによるエンジニアのスキル可視化、実⼒向上を図る。 実技型試験サービス AWSエンジニアのスキルチェックサービス 13
  4. © 2024 Anti-Pattern Inc. All rights reserved. SaaS企業の成⻑サイクル BizDevOps⽀援 Product

    Development プロダクト作り Build an Organization 組織作り Financing 資⾦作り 顧客提供 価値の拡⼤ 組織の拡⼤ 投資の拡⼤ 成⻑サイクルを拡⼤ エンジニア採⽤ 企業情報 14
  5. SaaS の活⽤メリット 営業管理ソフト 会計ソフト 労務ソフト 営業管理 SaaS 会計 SaaS 労務

    SaaS コスト & リスク コスト & リスク => 割り勘効果を得ている ⾃社開発 & パッケージソフト SaaS 利⽤ 23
  6. © 2024 Anti-Pattern Inc. All rights reserved. ⽇本でのSaaS Tech系イベント 昨年からちょっと増えてきました

    マイクロサービス、マルチテナント、認証認可、信頼性、UI/UXなど SaaS Tech のお話中⼼ SaaS Tech に関しては⽇本語で読める情報はまだまだ少ない https://saas-tech.connpass.com/event/243204/ https://btob-tech.connpass.com/event/247407/
  7. SaaS の開発/運⽤ではビジネスとテックが⼀体化する必要がある Biz Dev Ops ⼀体となって 価値を届け続ける ⾃社SaaSビジネスにとって 価値のある実装とはなにか︖ 運⽤コストを抑えられる

    作りにできているか︖ 素早く改善できるか︖ 可⽤性やセキュリティ、性能は お客様に影響をあたえてないか︖ 利⽤者 この機能をつけるのは どれくらいの難易度か︖ 不具合が発⽣しずらいか︖ アプリケーションが 作りやすい 環境にできているか︖ 運⽤コストが増えすぎない 料⾦プラン体系か︖
  8. SaaS の開発/運⽤ではビジネスとテックが⼀体化する必要がある Biz Dev Ops ⼀体となって 価値を届け続ける ⾃社SaaSビジネスにとって 価値のある実装とはなにか︖ 運⽤コストを抑えられる

    作りにできているか︖ 素早く改善できるか︖ 可⽤性やセキュリティ、性能は お客様に影響をあたえてないか︖ 利⽤者 この機能をつけるのは どれくらいの難易度か︖ 不具合が発⽣しずらいか︖ アプリケーションが 作りやすい 環境にできているか︖ 運⽤コストが増えすぎない 料⾦プラン体系か︖ エンジニアもSaaSビジネスを ある程度理解することがポイント
  9. © 2024 Anti-Pattern Inc. All rights reserved. SaaS で考えるべきことは多い 認証・認可

    請求 料⾦プラン 新機能追加 セキュリティ 可⽤性 性能 利⽤量計測 ユーザ体験 分析 移⾏
  10. © 2024 Anti-Pattern Inc. All rights reserved. x テナント︕ 認証・認可

    請求 料⾦プラン 新機能追加 セキュリティ 可⽤性 性能 利⽤量計測 ユーザ体験 マルチテナントの難しさ (もちろん場合によってはシングルテナントx複数もあり) 分析 移⾏ SaaS で考えるべきことは多い
  11. © 2024 Anti-Pattern Inc. All rights reserved. x テナント︕ 認証・認可

    請求 料⾦プラン 新機能追加 セキュリティ 可⽤性 性能 利⽤量計測 ユーザ体験 マルチテナントの難しさ (もちろん場合によってはシングルテナントx複数もあり) 分析 移⾏ テナントの概念が⼊ると ⼀気にめんどくさくなる たとえば SaaS で考えるべきことは多い
  12. © 2024 Anti-Pattern Inc. All rights reserved. x テナント︕ 認証・認可

    請求 料⾦プラン 新機能追加 セキュリティ 可⽤性 性能 利⽤量計測 ユーザ体験 マルチテナントの難しさ (もちろん場合によってはシングルテナントx複数もあり) 分析 移⾏ テナントの概念が⼊ると ⼀気にめんどくさくなる たとえば SaaS で考えるべきことは多い テナント分離は SaaS 開発の基礎中の基礎︕︕︕
  13. © 2024 Anti-Pattern Inc. All rights reserved. SaaS 開発/運⽤のポイント -

    1 • テナント サービスの契約をする顧客組織の単位。会社であったり⼀部⾨であったり特定の団体であったり実 際の組織はいろいろある。 • サイロ、プール、ブリッジモデル(、ハイブリッドモデル) リソースの共有範囲を表す。後述の項⽬に合わせて検討が必要。 • SaaSにおける認証と認可 ユーザの認証とともにそのユーザがどのテナントに属しているかという認証、ユーザ単位・テナント単位 両⽅の観点から認可をする必要がある。契約している料⾦プランも関係してくる。 • テナント分離 ⾃⾝のテナント以外にアクセスできないようにマルチテナントにおいて分離は必須になる。コスト、運 ⽤効率、コンプライアンス、展開モデルによって検討する必要がある • データーパーティショニング テナント分離とともに、特にデータ(データベースやストレージなど)をどのように分割していくのかを考 える必要がある
  14. © 2024 Anti-Pattern Inc. All rights reserved. SaaS 開発/運⽤のポイント -

    2 • ノイジーネイバー テナント間でリソース共有していると、とあるユーザのリソース消費が他のユーザの体験(特に性 能)に影響を与えるので考える必要がある • テナントオンボーディング 新しいテナント(顧客)契約時に、そのテナントに関連する全てのリソースを⾃動的にプロビジョニン グする必要がある。 • テナントティアー 多種多様なお客様に対応するため、料⾦プランとセットで機能や利⽤量、また信頼性まで差をつけ て提供することにより、運⽤負荷を適切に分散する • メータリングとビリング 料⾦プランの内容によっては、利⽤量の計測が必須になる。また、その利⽤量をベースに利⽤料⾦ を確定し請求処理を⾏うことが必要。これらも極⼒⾃動化することによりスケールできるようになる。 • テナントアクティビティの収集と分析 SaaSは継続的改善が前提になるため、⼤量のユーザの利⽤状況からインサイトを得て改善を進め ていく必要がある。また、テナント横串でのアクティビティを分析して新たなベストプラクティスを⾒つけ、 新しい価値として実装をしていくことも重要。
  15. © 2024 Anti-Pattern Inc. All rights reserved. SaaSのアーキテクチャ SaaS管理画⾯ テナント管理

    ユーザー管理 認証認可 ログ収集 利⽤量計測 分析 請求 料⾦プラン コントロールプレーン (SaaSの管理に必要な機能群) アプリケーションプレーン (SaaSのアプリケーションの機能群) Webフロントエンド テナント バックエンド DB テナント バックエンド DB テナント バックエンド DB テナント バックエンド DB これらが集まって1つのSaaSになる
  16. © 2024 Anti-Pattern Inc. All rights reserved. 特に意識しなくてもSaaSはおのおのの役割は持っている SaaS管理画⾯ テナント管理

    ユーザー管理 認証認可 ログ収集 利⽤量計測 分析 請求 料⾦プラン Webフロントエンド テナント バックエンド DB テナント バックエンド DB テナント バックエンド DB テナント バックエンド DB 作り⽅によっては分かれていないこともあるが その役割はどこかで持っている
  17. © 2024 Anti-Pattern Inc. All rights reserved. サイロモデル DB サーバ

    DB サーバ DB サーバ SaaS テナントA⽤ テナントB⽤ テナントC⽤ サイロモデルでも、コードベースは1つに保つ (会社ごとのカスタマイズは⾏わない)
  18. © 2024 Anti-Pattern Inc. All rights reserved. フィーチャーフラグ(フィーチャートグル) 料⾦プランや特定企業向けオプションな どの時だけではなく使える

    • 複数のコードベースを管理するのはア ンチパターン • ⻑い間存在する別ブランチも同義 • どこにトグルルータを置くか︖ • 処理の直前ではなくDIなどの活⽤ • フラグをどこに保存するか︖ • ハードコード、パラメータ、設定ファ イル、DB、オーケストレーション ツール、クラウド機能 https://martinfowler.com/articles/feature-toggles.html
  19. © 2024 Anti-Pattern Inc. All rights reserved. プールモデル DB サーバ

    SaaS テナントA, B, C など共⽤ 共⽤インフラでも適切な論理テナント分離を考える
  20. © 2024 Anti-Pattern Inc. All rights reserved. ブリッジモデル DB DB

    DB SaaS テナントA⽤ テナントB⽤ テナントC⽤ サーバ 分離した部分を意識しないでよいプログラミングを⼼がける
  21. © 2024 Anti-Pattern Inc. All rights reserved. ブリッジモデル(その2) SaaS テナントA⽤

    テナントB⽤ テナントC⽤ 分離する部分は様々 サーバ サーバ サーバ DB
  22. © 2024 Anti-Pattern Inc. All rights reserved. ハイブリッドモデル DB サーバ

    DB サーバ SaaS テナントA, B など共⽤ テナントC専⽤
  23. © 2024 Anti-Pattern Inc. All rights reserved. サイロモデル DB サーバ

    DB サーバ DB サーバ SaaS テナントA⽤ テナントB⽤ テナントC⽤ バージョンアップやセキュリティパッチ、 DBスキーマ変更など 全てのテナントを同じ状態に保つのにも 労⼒を必要とする
  24. © 2024 Anti-Pattern Inc. All rights reserved. プールモデル DB サーバ

    SaaS テナントA, B, C など共⽤ ノイジーネイバー問題(性能問題)や セキュリティ対応に労⼒がかかる
  25. © 2024 Anti-Pattern Inc. All rights reserved. ブリッジモデル DB DB

    DB SaaS テナントA⽤ テナントB⽤ テナントC⽤ サーバ 構成が複雑になり、どこで サイロとプールをわけるかが難しい
  26. © 2024 Anti-Pattern Inc. All rights reserved. ハイブリッドモデル DB サーバ

    DB サーバ SaaS テナントA, B など共⽤ テナントC専⽤ 各モデルの⻑所・短所が⼊り交じって 複雑になり、より運⽤に労⼒がかかる
  27. テナント分離モデルごとの特徴 サイロモデル プールモデル ブリッジモデル ・ユーザ認証 ・テナント識別 ・データベース切替 ・運⽤コスト ・複雑度 ・テナント分離

    (主にセキュリティと性能) 不要な場合あり 不要 不要 ⼤ ⼩ ⾼ 必要 必要 不要 ⼩ 中 ⽐較的⼩ 必要 必要 必要 中 ⼤ 中 アプリケーションで
  28. テナント分離モデルごとの特徴 サイロモデル プールモデル ブリッジモデル ・ユーザ認証 ・テナント識別 ・データベース切替 ・運⽤コスト ・複雑度 ・テナント分離

    (主にセキュリティと性能) 不要な場合あり 不要 不要 ⼤ ⼩ ⾼ 必要 必要 不要 ⼩ 中 ⽐較的⼩ 必要 必要 必要 中 ⼤ 中 アプリケーションで ビジネスサイドとテックサイド(エンジニア)で よく話し合って決めましょう エンジニアに丸投げすると、プール(⾵)モデルになる可能性が⾼いです
  29. © 2024 Anti-Pattern Inc. All rights reserved. データ分離(パーティショニング)のいろいろ(RDB編) テナント1 テナント2

    テナント3 テナント4 テナントID テナント5 テナント テナント テナント テナント テナント テナント テナント データベース分離 スキーマ(orテーブル)分離 ⾏分離 セキュリティ要件と性能 運⽤負荷などのバランスで選定
  30. サンプルアプリケーションの実⾏ – 4 3. サンプルアプリケーションの表⽰ 先ほどのURLにブラウザでアクセスすると、ロ グイン画⾯が表⽰される Email: [email protected] Password:

    SaaSTraining でログインすると、チャットの画⾯が表⽰されるので 適当に⽂字を打ってみる ここまでできました︖︕ ここまではただのチャットアプリケーション︕ これをマルチテナント化していきます。 (プール型⾵マルチテナント)
  31. DBをのぞいてみる – 1 4. PostgreSQL拡張機能でDBをのぞく 接続定義を⼊⼒ ↑質問に答えて各種情報を⼊⼒ Hostname: localhost User:

    saasus Password: password Port: 5432 Connection: Standard Connection Database: saasus Display name: localhost
  32. 最低限のテナントコンテキストを⼊れる – 1 5. 最低限のテナントIDを⼊れる 5-1. DBのユーザーテーブルにテナントIDを追加 `php/laravel/api/database/migrations/2014_10_12_000000_create_users_table.php` のコメントアウト部分を外す 5-2.

    DBのユーザーテーブルのテストデータにテナントIDを追加 `php/laravel/api/database/seeders/UserSeeder.php` のコメントアウト部分を外す 5-3. 表⽰処理、書き込み処理にユーザーに応じたテナントIDを追加 `php/laravel/api/app/Http/Controllers/MessageController.php` のコメントアウト部分を外す こんな感じ
  33. 最低限のテナントコンテキストを⼊れる – 3 テナント1⽤チャット テナント2⽤チャット user@ example .com user1@ example

    .com user2@ example .com user3@ example .com 6. いろんなユーザーでログインして書いてみる [email protected], [email protected] はテナント1 [email protected], [email protected] はテナント2 というテストデータになっているため、 各ユーザーで⼊ってテナント間で ちゃんとデータが⾒れないか確かめる
  34. 最低限のテナントコンテキストを⼊れる – 3 テナント1⽤チャット テナント2⽤チャット user@ example .com user1@ example

    .com user2@ example .com user3@ example .com 6. いろんなユーザーでログインして書いてみる [email protected], [email protected] はテナント1 [email protected], [email protected] はテナント2 というテストデータになっているため、 各ユーザーで⼊ってテナント間で ちゃんとデータが⾒れないか確かめる マルチテナントSaaSになった︕ のか︖︕
  35. 攻撃を試す – Brute force attack - 1 7. ログイン認証を突破する攻撃 ブルートフォース攻撃(総当たり攻撃)を軽く試します

    7-1. 攻撃ツール(Hydra)のセットアップ 新しいシェルを作成して、「sample.txt」 のコマンドを実⾏ 「+」を押すと、新しいシェルが開きます こんな感じ 今回は体験を主としているので すごくシンプルな辞書を作ってます
  36. 攻撃を試す – Brute force attack - 2 7-2. 攻撃ツール(Hydra)の実⾏ 「sample.txt」のコマンドを実⾏

    hydra -L usernames.txt -P passwords.txt -f -u -vV localhost http-post-form '/login:email=^USER^&passwo rd=^PASS^:F=wrong' アカウントがバレちゃいました・・・
  37. 攻撃を試す – Brute force attack - 2 7-2. 攻撃ツール(Hydra)の実⾏ 「sample.txt」のコマンドを実⾏

    hydra -L usernames.txt -P passwords.txt -f -u -vV localhost http-post-form '/login:email=^USER^&passwo rd=^PASS^:F=wrong' つまり、認証(ログインとか)は ⾃分で作っちゃダメ︕︕︕ いろんなアタックへの対応とか MFAとか振る舞い検知とか そんなの作ってられない
  38. 攻撃を試す – SQL Injection - 1 8. テナント境界をまたいじゃう攻撃 SQLインジェクションを軽く試します 8-1.

    [email protected](テナント1のユーザー) でログインしてください。 8-2. メッセージに 以下を⼊れてみてください。 hello', now()), ('2', '2', 'hacked message
  39. 攻撃を試す – SQL Injection - 2 8-3. いったんログアウトし、 [email protected](テナント2のユーザー) でログインしてください。

    ※興味がある⽅は、DBのテーブルものぞいてみてください 先ほどのメッセージ 「helloʻ, now()), (ʼ2ʻ, ʼ2ʻ, ʼhacked message」 で、 [email protected](テナント1のユーザー) が [email protected](テナント1のユーザー) になりすまして、 テナント2にメッセージが書けてしまいました・・・
  40. 攻撃を試す – SQL Injection - 2 8-3. いったんログアウトし、 [email protected](テナント2のユーザー) でログインしてください。

    ※興味がある⽅は、DBのテーブルものぞいてみてください 先ほどのメッセージ 「helloʻ, now()), (ʼ2ʻ, ʼ2ʻ, ʼhacked message」 で、 [email protected](テナント1のユーザー) が [email protected](テナント1のユーザー) になりすまして、 テナント2にメッセージが書けてしまいました・・・ プール⾵モデルだと 基本的なセキュリティホールやバグで テナント境界をまたがれてしまいやすそう・・・
  41. 改善チャレンジ︕ • テクニカル • SQLインジェクションが起きないように修正する • +ビジネス • 次に開発する部分と優先順位をディスカッションしてみてください •

    機能⾯(例) • テナント名が固定になっちゃってるけどいいかな︖ • チャットのUIがしょぼい︖ • ログインにGoogle認証⼊れたい • ボイスチャットできるようにしたい • LLMが相⼿してくれるようにしたい • 管理者権限の⼈がユーザーの追加、削除出来るようにしたい • ⾮機能⾯(例) • 新規契約されたテナントの発⾏を出来るようにしたい • 料⾦プランをどうしよう︖ • 請求・⽀払はどうやってやろう • ブルートフォースアタックに対応できるようにする • 性能的にこのままで⼤丈夫か︖ • インフラ構築をどうするか︖ • CI/CDをどうする︖ などなど まだまだ いっぱい
  42. © 2024 Anti-Pattern Inc. All rights reserved. これでいいのか︖︕SaaS︕ SaaS管理画⾯ テナント管理

    ユーザー管理 認証認可 ログ収集 利⽤量計測 分析 請求 料⾦プラン Webフロントエンド テナント バックエンド DB テナント バックエンド DB テナント バックエンド DB テナント バックエンド DB このままの勢いで⾏くと、こうなっちゃう
  43. © 2024 Anti-Pattern Inc. All rights reserved. SaaSのアーキテクチャ SaaS管理画⾯ テナント管理

    ユーザー管理 認証認可 ログ収集 利⽤量計測 分析 請求 料⾦プラン コントロールプレーン (SaaSの管理に必要な機能群) アプリケーションプレーン (SaaSのアプリケーションの機能群) Webフロントエンド テナント バックエンド DB テナント バックエンド DB テナント バックエンド DB テナント バックエンド DB
  44. © 2024 Anti-Pattern Inc. All rights reserved. Conclusion ・技術的にも SaaS

    ならではの考えることがたくさんある ・その中でも、まずはテナント分離の考え⽅が基本になる ・なるべく⾃分で作らないで信頼できる製品を活⽤する ・ (今回はなかったですが)インフラ、アプリ、開発、運⽤を全部ひっくるめて考える必要がある︕ ・ (今回はなかったですが)なので SaaS は作った⼈が運⽤するべし︕ You built it, you run it! ・ (今回はなかったですが)さらに、お客様からのフィードバックを開発・運⽤に活かすべし︕ ・(今回はなかったですが)データを製品改善に活かすべし︕ ということで、 SaaS のエンジニアは楽しいですよ︕
  45. © 2024 Anti-Pattern Inc. All rights reserved. SaaS開発ガイド【基礎編】も合わせてご覧ください 1.SaaSにおけるソフトウェア開発の重要性 -

    SaaS提供事業者の責任 - 成⻑ステージ毎に考慮すべきSaaS運営のポイント - SaaS⽴ち上げ前に知っておきたい開発の進め⽅ 2.SaaSにおけるソフトウェア開発の勘所 SaaS⽴ち上げ前に知っておきたい開発の進め⽅ - BizDevOps - MVP / プロトタイプ SaaS開発時に考慮すべき6つのポイント 1. テナントという概念の考慮 2. 迅速なサービス改善を実現するアーキテクチャの検討 3. セキュリティの強化 4. 拡張性の担保 5. 料⾦プランの設計と請求⽅法の確⽴ 6. データの活⽤ https://saasus.io/resource/e-book/saas-dev-guide-basic SaaS開発ガイド【基礎編】 続編(テナント編)もあります︕
  46. まとめディスカッション その後、チームで ディスカッションしてみてください • 今⽇学んだこと • ⾯⽩かったこと • つまらなかったこと •

    難しかったこと • チームに共有したいこと まずはアンケート回答 お願いします︕ https://docs.google.com/forms/d/e/1FAIpQLScUI7 BctzwwJ5GuaFfSH4R2_W3VWFsc5asOWz3nd0htzu PkTA/viewform 講義内限り
  47. © 2024 Anti-Pattern Inc. All rights reserved. SaaSus Platform 概要

    弊社がもつ SaaS 開発/運⽤ のナレッジを集約し SaaS 作りと運⽤・販売のサポートをする SaaS を提供する https://saasus.io
  48. © 2024 Anti-Pattern Inc. All rights reserved. SaaSus Platform 概要

    認証・認可 請求 料⾦プラン コミュニケーション セキュリティ 利⽤量計測 x テナント管理 分析 業務ロジック 業務ナレッジ ベストプラクティス SaaSの直接的な価値を⽣む ここの実装に集中︕ DB分離 事業モニタリング ここは外部の サービスに まかせるのじゃ