SaaS プロダクト A・B・C の間で API をやり取りし、将来は認証基盤を1つにまとめ、プロダクト横断の集計を各プロダクトのダッシュボードに出す。そのための理想の構成と、その構成が理想である条件を整理します。
「理想」は条件で変わります。以下は、いただいた前提(A・B が稼働中で C を新規に作る、プロダクトごとにチームがある、Platform Engineering Team が基盤を持つ、横断集計は各プロダクトの画面に出す)で理想になる構成です。前提が変わった場合の理想は、各章の条件表と第 12 章にまとめています。
全プロダクトのデータを共通のデータモデルで提供する集約 API 層は、今回の前提では理想になりません。ゲートウェイ、サービス間の認証、顧客組織の台帳、イベント基盤、分析基盤、API 規約を Platform チームが提供し、API とデータは各プロダクトが持つ形が理想です。顧客に1つの API 契約で複数プロダクトを出す必要が出たときだけ、その部分に合成層を足します。
A の client と B の tenant は単位が違うので、どちらかに合わせません。上位の Organization、各プロダクトの単位との対応付け、プロダクト間の接続許可(Grant)を台帳に持ちます。台帳は IdP から独立させるので、IdP を何にしても、あとで移行しても残ります。
プロダクト間の呼び出しは、社内の Entra ID(マネージド ID と App Roles)と接続許可の照合で成立します。ユーザー認証の統合を待つ必要はありません。ユーザー認証は、共通 IdP を新設して C で使い始め、A・B のログインを移し、旧ユーザー DB の認証を止める順に進めます。
他プロダクトの API や DB から生データを集めて画面ごとに集計すると、DB 負荷、応答時間、認可の一貫性の面で成り立たなくなります。各プロダクトの DB を Fabric Mirroring で OneLake に複製し、横断集計を事前に作り、接続許可を照合する集計 API から返します。
いただいた情報のうち、構成を決めるのは次の4点です。A は「1顧客 = 1 client、その下に複数 project」、B は「1顧客企業 = 1 tenant、その tenant に A の client が複数つながる」、C は管理単位が未定、ユーザーは各プロダクトが別々に持つ。
このほかに、分かっていないことで理想が変わる条件があります。この解説では下表の「今回の想定」で書き、変わった場合の構成は各章に書きます。
| 条件 | 今回の想定 | 違った場合に変わること | 章 |
|---|---|---|---|
| プロダクト数と連携の増え方 | A・B に C が加わり、連携の組み合わせは増える | A↔B の数本で増えないなら、直接連携と規約だけで足りる | 2 |
| 複数プロダクトをまとめた1つの API 契約 | 要求なし。各プロダクトのユーザーはそのプロダクトの API を使う | 必要なら、ドメインの決定権を持つチームが合成 API を持つ | 2・8 |
| 複数プロダクトを1画面で合成する UI | なし。各プロダクトの画面に横断集計を出す | あるなら、その UI のチームが BFF を持つ | 2 |
| 子会社のデータを親会社側で見るときの承認者 | データの持ち主である A client の管理者が承認する | 契約上、親会社が全子会社分の利用権を持つなら、親の管理者が一括承認できる | 5 |
| 顧客企業ごとの SSO 設定 | 不明 | 数が多く、顧客に自分で設定させたいなら、組織モデルを持つ B2B 向け IdP が合う | 9 |
| A と B のユーザーの重なり | 不明 | 重なりが小さく、横断 SSO の要求もないなら、既存ユーザーの移行は急がない | 9 |
| 横断集計の鮮度 | 大半の指標は数分遅れで足りる | 秒単位が要る指標だけ、イベント経路を別に作る | 11 |
| ネットワーク分離 | 公開 SaaS として一般的な水準 | ゲートウェイまで VNet 内に閉じる要件なら APIM Premium v2 | 13 |
「共通 API 基盤」という言葉は、少なくとも4つの別の構成を指します。どれが正しいかは条件で決まり、今回の前提では ③ が理想です。① と ④ は条件つきで ③ と組み合わせ、② は今回の前提では選びません。
| 構成 | 理想になる条件 | 今回の前提では | 選び方を誤っているサイン |
|---|---|---|---|
| ① 直接連携 + 規約 | プロダクトが2〜3で、連携は数本、増える見込みがない。チーム同士が密に協力できる。統一した外部 API は要らない | 今だけ成立 A↔B だけの今は成立するが、C で組み合わせが増える | 認証、リトライ、テナント対応付けのコードが連携ごとに重複する。どの API が誰に呼ばれているかを誰も把握していない |
| ② 集約 API | 連携するシステムが多く(目安 6 以上)、各システムを規約に合わせられない(買収した製品、外部製品、改修できない既存システム)。共通化する対象が安定していて、読み取りが中心。または、複数プロダクトを1つの API 製品として売ることが事業上必須で、そのドメインの決定権を持つチームがある | 合わない B は新しく、C は未着手で、ドメインモデルが動いている。書き込みもある | 共通層のチームに変更依頼の列ができる。書き込みでプロダクトをまたぐトランザクションや補償処理が必要になる |
| ③ 土台だけ共通 | 自社開発のプロダクトを複数チームが並行して変える。プロダクト間で読み書きがある。API の使い方(認証、規約、ポータル)は揃えたいが、契約を1つにする必要はない。Platform チームがセルフサービスで提供できる | 合う すべての条件に当てはまる | Platform チームが業務データの変換や処理の手順を書き始める。規約を守れないプロダクトがある |
| ④ 合成層 | 複数プロダクトのデータを1画面に並べる UI(スイート画面)や、複数プロダクトをまとめた API がある。その UI や API のチームが持つ | 今は不要 必要になったら ③ の上に足す | 同じ集約を複数の画面が別々に作っている。合成層がシステム間連携の経路として使われている |
A の client は「契約の単位」、B の tenant は「顧客企業の単位」で、意味が違います。共通モデルにすると、どちらかの意味を歪めるか、両方を含む複雑なモデルを誰かが保守することになります。Fowler が紹介する Bounded Context の考え方では、大きなシステムのモデルを完全に統一するのは現実的でも費用に見合うものでもないとされています。Canonical Data Model も、参加するシステムが少ないうちは割に合わないと原典に書かれています。
② では、A の項目追加が共通層の改修を待ちます。Thoughtworks Technology Radar は「API ゲートウェイの形をした ESB」「過度に賢い API ゲートウェイ」を Hold にしています。理由は、業務ロジックを中央の仕組みに入れると結合が強まり、特定チームへの依存が生まれるためです。
認証方式、エラー形式、ページング、API の台帳、流量制限、監視は ③ でも全プロダクトで揃います。Azure API Management の workspaces は、Microsoft が「federated API management」と呼ぶこの形のための機能です。プロダクトチームが自分の workspace を管理し、Platform チームが全体のポリシーと監視を持ちます。
① でも A↔B はつながります。ただし ① でも必ず作ることになる2つ、「呼び出し元のサービスの認証」と「どの B tenant がどの A client のデータを使ってよいか」は、C が加わると作り直しになります。この2つは最初から土台に置きます。API Center や APIM workspace の整備などは、C の着手に合わせて足しても構いません。土台は最小から始めて、使われる分だけ育てます(Team Topologies の Thinnest Viable Platform)。
認証の統合まで終わった最終形です。途中の段階は第 9 章に分けて描きます。青は各プロダクトチーム、緑は Platform チーム、紫は認証、橙は分析の部品です。
| 部品 | 持つチーム | 役割 | この持ち方にする理由 |
|---|---|---|---|
| 各プロダクトの API・DB・ドメインモデル | 各プロダクト | 業務データの読み書き。細かい権限の判定 | 変更の頻度も判断材料もプロダクト側にある |
| APIM インスタンスと全体ポリシー | Platform | 公開、トークン検証、流量制限、ログ | 認証と監視の方法を全 API で揃える |
| APIM の workspace | 各プロダクト(自分の workspace だけ変更できる) | 自プロダクトの API 定義とポリシー | API の追加や変更で Platform チームの作業待ちを作らない。全体ポリシーは継承させる |
| API Center と規約ルール | Platform がルールを持ち、各プロダクトが守る | API の台帳。OpenAPI への Spectral ルールの自動適用 | 規約をレビュー依頼ではなく CI とツールで守らせる |
| Entra ID のアプリ登録・App Roles | 各プロダクトが自 API の App Roles を定義し、Platform が命名と払い出しの規約を持つ | サービス間の認証 | 「誰に何を許すか」は API の持ち主が決める |
| 顧客組織台帳 | Platform | Organization、対応付け、Grant | どのプロダクトにも属さないデータで、全プロダクトが同じ意味で使う |
| イベント基盤 | 基盤は Platform、イベントの定義と送信は各プロダクト | ドメインイベントの配信 | イベントの意味はそれを起こしたプロダクトが決める |
| 共通 IdP | Platform | ログイン、顧客企業との SSO | 1人1アカウントにするには、1か所で管理する必要がある |
| 分析基盤・配信・集計 API | 基盤と配信は Platform、データの契約と指標の意味は各プロダクト | 横断集計の作成と配信 | 指標の意味を知っているのはデータの持ち主で、基盤を共有するほうが安い |
A は「契約ごとの client」、B は「企業ごとの tenant」です。どちらかの単位に揃えるのではなく、上位に Organization(顧客組織)を置き、各プロダクトの単位を Organization に対応付けます。プロダクト間でデータを使う許可は Grant として別に持ちます。
A と B のデータモデルと画面はそのまま残せます。企業グループの親子、どの単位が同じ顧客か、どこからどこへの利用を許したか、を台帳で表します。Atlassian の organization、Google Cloud の Organization、Slack Enterprise Grid も、上位の組織の下に製品ごとの単位を置く構成です。
Entra External ID には、顧客組織を表す専用のオブジェクトがありません。Auth0 などの Organizations 機能を使う場合でも、正本は台帳に置き、IdP へは同期するほうが、IdP の移行や併用に耐えます。Microsoft の Architecture Center も、利用権や所属は IdP ではなくアプリか専用サービスで管理するよう勧めています。
C の顧客単位が企業なら、C 独自の tenant 表を作らず Organization ID を使います。3つ目の単位を増やさずに済みます。C が部署などの細かい単位を必要とするなら、C の中にその単位を作り、Organization に対応付けます。
// 台帳の最小のデータ(業務データは入れない)
Organization (org_id, name, parent_org_id)
ProductAccount (org_id, product, account_id) // product=A なら client_id、B なら tenant_id
Grant (grant_id, grantee_product, grantee_account_id,
source_product, source_account_id, scopes[],
status, requested_by, approved_by, approved_at, expires_at, revoked_at)
Membership (org_id, user_id, role) // 共通 IdP を入れる Phase 2 以降
| 条件 | 理想の置き方 |
|---|---|
| C 以降もプロダクト間の連携が増える(今回の想定) | Platform の台帳に Organization、対応付け、Grant を置く |
| 連携は今後も B → A だけで、A は B の存在を知らなくてよい | B の中の「接続した A client」の表で足りる。ただし A 側の承認記録は A が持つ |
| プロダクトを別会社に売却する、別々に運用する可能性が高い | 共有の台帳への依存を減らす。各プロダクトが接続表を持ち、台帳は参照用の複製にとどめる |
| 顧客の組織構造が深く、プロジェクト単位の共有や委任が頻繁に変わる | 台帳に加えて、関係ベースの認可エンジン(OpenFGA など)を検討する。第 10 章 |
ユーザーがプロダクトごとに別々の現状でも、Grant は作れます。B で申請し、データの持ち主である A client の管理者が A にログインして承認する流れにします。A のログインで承認者の本人確認をするので、共通 IdP を待たずに成立します。
a-101 のデータは X 商事の契約に基づくもので、親会社の tenant で見せてよいかは X 商事側が決めることです。GitHub App のインストール、Slack の組織へのアプリ追加、Entra の cross-tenant access も、リソースを持つ側の管理者が、対象と範囲を選んで許可し、あとから取り消せる形になっています。
取り消しは台帳の Grant を無効にし、イベントで各プロダクトに知らせます。API の呼び出しと集計 API は毎回台帳を照合する(短いキャッシュ付き)ので、分析基盤のデータが数分遅れていても、取り消した時点から返らなくなります。
Phase 3 以降は、B にいる人が a-101 の管理者本人かを共通 IdP のアカウントで判定できます。そのため、A の画面に移らずに B の画面で承認を完結できます。台帳と Grant のデータ構造は変わりません。
| 条件 | 理想の承認のしかた |
|---|---|
| 子会社ごとに契約し、データの持ち主が子会社(今回の想定) | A client の管理者が承認する(上図) |
| 親会社が全子会社分をまとめて契約し、利用権が契約で親会社にある | 親の Organization の管理者が、配下の client をまとめて承認できるようにする。承認の記録は同じ Grant に残す |
| 申請者と承認者が同じ担当者で、通知を待つ流れが煩わしい | A で接続コードを発行し、B に入力する方式にする。コードは短い有効期限と1回限りにする |
| 別の Organization 間(取引先同士)で接続する | 両側の管理者の承認を必須にする |
B の画面で、接続済みの a-101 の project 一覧を出す場合です。B は社内の Entra ID でサービスとしてのトークンを取り、APIM と A の両方が「b-9 は a-101 を読んでよいか」を台帳で確かめます。リクエストに書かれた tenant ID を、確かめずに信じることはしません。
Azure 上のサービスはマネージド ID でシークレットなしにトークンを取れます。App Roles は API ごとに定義でき、APIM の validate-azure-ad-token で検証できます。Entra External ID の client credentials は GA ですが、有料アドオンでトークン発行ごとに課金されます。また External ID のアプリ登録は単一テナント固定で、社内のマネージド ID からトークンを取る方法は文書化されていません。
Microsoft はゲートウェイでの検証を多層防御の一段と位置づけています。オブジェクト単位の認可漏れ(OWASP API Security Top 10 の API1: BOLA)を防ぐ最終判断は、データを持つ A が行います。APIM の照合があれば、A の実装に漏れがあっても未許可の呼び出しは入口で止まります。
「B は A の全データを読める」権限だけを与え、B が送る tenant ID で絞る実装にすると、B の不具合1つで他社のデータが返ります(confused deputy)。RFC 9700(OAuth 2.0 Security BCP)も、アクセストークンの audience と権限を最小限に絞るよう求めています。サブスクリプションキーだけでの認証もしません。
| 方式 | しくみ | 理想になる条件 | 弱点 |
|---|---|---|---|
| P2: サービスのトークン + 台帳照合(上図) | トークンは呼び出し元サービスと粗い権限だけを表す。顧客の範囲は APIM と受け手が台帳で確かめる | ユーザー認証が統合されていない(Phase 1〜2)。バッチや非同期の連携がある。連携のパターンが少ない | 照合を APIM と各受け手に実装する。台帳が止まると連携も止まるので、台帳の可用性とキャッシュが要る |
| P3: 内部 STS が範囲を絞ったトークンを発行 | Platform の STS が台帳を確認し、audience・顧客の範囲・操作を絞った数分有効の JWT を発行する。受け手はトークンだけで判断できる | 受け手のサービスが多く、台帳照合を各所で実装したくない。3 段以上の呼び出しの連鎖がある。「何のために発行したトークンか」を監査で追う必要がある | STS の運用、鍵管理、可用性を Platform が負う。Entra ID は RFC 8693 のトークン交換に対応していないので自作になる。設計は IETF の Transaction Tokens(draft-11、未 RFC)を参考にする |
| P1: ユーザーのトークンを引き継ぐ(OBO) | B のユーザーのトークンから A 向けトークンを取り、A はそのユーザー本人の権限で判断する | 共通 IdP 統合後(Phase 3 以降)。連携が必ずユーザー操作から始まり、A 側でのそのユーザー個人の権限を連携にも効かせたい | ユーザーのいないバッチでは使えない。Entra の OBO は委任スコープだけを引き継ぎ、App Roles は引き継がない |
Phase 1〜2 では、A は B のユーザーが誰かを知りません。そのため連携で効く権限は「組織として許可したか」(Grant)までです。B の特定のユーザーには a-101 の一部の project しか見せない、という要件がある場合は、共通 IdP 統合後の P1 まで待つか、Grant の範囲を project 単位にして B 側で絞ります。
「データ取得・登録・更新」は同期 API で行います。一方で、他のプロダクトで起きた変化を知るために相手の API を定期的に呼ぶ(ポーリング)と、呼び出しが増え続けます。「起きたこと」はイベントで知らせ、大量の集計は分析基盤で扱います。
| 場面 | 使うもの | 理由 |
|---|---|---|
| 相手の今の状態を見て処理を続ける | 同期 API | 例: B の画面で a-101 の project 一覧を出す。呼び出し元が応答を必要とする |
| 相手のプロダクトに登録・更新し、結果で次の処理が変わる | 同期 API + 冪等キー | 再試行で二重登録しないように、POST には冪等キーを必須にする |
| 起きたことを複数のプロダクトが知る | イベント(通知型) | 例: project のアーカイブ、Grant の取り消し。送る側は受け手を知らなくてよい。受け手は必要なら API で詳細を取りに行く |
| 相手が止まっていても動く必要がある、よく読む小さなデータ | イベント(状態を載せる型)+ 受け手側の複製 | 例: 接続済み client の名前と状態。相手の可用性に引きずられない。代わりに複製と整合の管理が増える |
| 期間をまたぐ集計、複数プロダクトの結合 | 分析基盤(第 11 章) | 運用 API や運用イベントで大量のデータを運ばない |
| イベント基盤 | 理想になる条件 | 向かない条件 |
|---|---|---|
| Event Grid namespace | 件数が中程度までのドメインイベントを、複数の受け手に配る。CloudEvents 1.0 形式。受け手が冪等に処理でき、厳密な順序は要らない。受け手が閉域なら pull 配信 | 順序保証、重複排除、トランザクションが要る。namespace の push 先は現在 Event Hubs と Webhook だけ |
| Service Bus トピック | client ごとなどの単位で順序が要る(セッション)。重複排除、トランザクション、デッドレターを使った業務処理。outbox の中継先 | 大量のテレメトリや操作ログの流し込み |
| Event Hubs | 操作ログ、監査、分析用の大量のストリーム。Kafka クライアントを使いたい | 件数の少ない業務イベント(1件ごとのデッドレターが要る)。スキーマ互換チェックは Avro のみ |
業務データの更新とイベントの記録を同じ DB トランザクションで行い、別プロセスが送信します。DB は更新されたのにイベントが出ない、という不整合を防げます。
どの Azure のメッセージ基盤も「少なくとも1回」の配信です。イベント ID か業務キーで重複を捨てます。
「各プロダクトのユーザーはそのプロダクトの API を使える」という要件は、最終形では次の形にします。入口のドメインとポータルは1つ、API はプロダクトごと、認証方式は全プロダクト共通です。
| 項目 | 最終形 | 理由 |
|---|---|---|
| 入口 | api.example.com/a/…、/b/…、/c/…(Front Door → APIM) | あとから API ゲートウェイを入れると URL が変わる。Microsoft もゲートウェイなしの公開をアンチパターンに挙げている |
| 開発者ポータル | APIM の開発者ポータル1つ | workspace が分かれていても1つのポータルに並べられる |
| 顧客システムの認証 | 共通 IdP が発行する OAuth クライアント。クライアントと Organization・プロダクトの対応は台帳で持つ | API キー単独は強い認証ではない。顧客ごとの対応を台帳に置けば、IdP に組織の機能がなくても顧客を特定できる |
| 内部向けと公開の区別 | 同じリソースの API を使い、内部専用の操作だけ公開用とは別の APIM product にしてポータルに出さない | 公開 API と内部 API を二重に保守しない。内部の操作は「audience: 社内」と台帳(API Center)に記録する |
| 顧客への通知 | Webhook(Standard Webhooks 形式の署名)、または Event Grid の event domain | event domain は顧客ごとにトピックを分け、権限も顧客ごとに分けられる |
| 条件 | 理想の構成 |
|---|---|
| 顧客は各プロダクトの API を個別に使う(今回の想定) | 上表のとおり。プロダクトごとの API のまま、使い方だけを揃える |
| 複数プロダクトをまとめた1つの API を顧客に売る | 統合 API を「製品」として持つチーム(ドメインの決定権がある)を作り、APIM の後ろに合成 API を置く。Platform チームには持たせない |
| 顧客の組織 ID をトークンに入れて受け手の実装を減らしたい | 組織つきのマシン間トークンを出せる IdP(Auth0 Organizations、WorkOS など)を選ぶ。Entra External ID の client credentials は組織の情報を持たない |
| 共通 IdP の導入前 | 各プロダクトの既存の API キーやトークンを APIM の後ろでそのまま使う。入口のドメインとポータルだけ先に揃える |
段階ごとに、変える対象を1つに絞ります。サービス間 → 新規プロダクト → 既存ユーザー → 旧資産の削除の順です。タブで各段階の構成を切り替えられます。橙の枠がその段階で変わる部品です。
同じ人が A と B に別のアカウントを持ちます。顧客企業の SSO を各プロダクトで個別に設定することになります。B が A の client を接続するとき、承認者の本人確認をどちらのユーザーで行うかも決まっていません。
A↔B の連携を始める。これが Phase 1 の開始条件です。
プロダクト間連携の効果を、ユーザー移行という大きな作業と切り離して先に出せます。使うのは GA の機能だけです。台帳はどの IdP を選んでも残るので、IdP の製品選定を待つ必要がありません。
共通 IdP の製品を決めた(下の表)。C の開発開始が近い。C に独自のユーザー表を作る前に Phase 2 に入ります。
3つ目のユーザー表を作らずに済みます。既存ユーザーに影響を出さずに、IdP の障害対応、SSO の設定作業、料金を実際の運用で確かめられます。C の顧客のうち A・B も使う人は、この時点ではまだ別アカウントです。
C の運用で IdP の問題を洗い出し終えた。A と B のユーザーの重なりと、同じメールアドレスで別人のケースの件数を把握した。
一括作成だけでは、旧パスワードのハッシュを移せない限り全員にパスワード再設定を強います。JIT だけでは、アカウント自体がありません(External ID の JIT はパスワードだけを移す仕組みで、アカウントの事前作成が前提)。企業 SSO でログインしている利用者は、パスワードの移行自体が不要です。移す順番は、ユーザー数が少なくログイン部分の改修が小さいプロダクトからにします。2つ目のプロダクトは「既存アカウントにリンクする」流れにします。
移行率が決めておいた値を超えた。残りの未移行者はパスワード再設定に誘導すると決めた。
顧客組織台帳、Grant、各プロダクトの細かい権限、サービス間の認証に使う社内 Entra ID は、Phase 1 からそのままです。変遷を通して作り直す部品はありません。
変える対象を毎回1つに絞っています。Phase 1 はサービス間、Phase 2 は新規プロダクト、Phase 3 は既存ユーザー、Phase 4 は旧資産の削除です。どの段階で止めても、それまでに作ったものは無駄になりません。
| 観点 | Phase 0 | Phase 1 | Phase 2 | Phase 3 | Phase 4 |
|---|---|---|---|---|---|
| ユーザーのログイン | A・B が別々 | A・B が別々 | A・B 別々、C は共通 IdP | 全部共通 IdP(移行期間) | 全部共通 IdP |
| ユーザーの正本 | 各プロダクトのユーザー表 | 同左 | A・B は各表、C は共通 IdP | 共通 IdP(旧表は検証用) | 共通 IdP |
| 顧客企業の SSO | 各プロダクトで設定 | 同左 | C は共通 IdP で設定 | 共通 IdP に集約 | 共通 IdP |
| 公開 API の認証 | 各プロダクト独自 | 同左(入口だけ APIM) | C は共通 IdP の OAuth | A・B も共通 IdP を併用 | 共通 IdP に統一 |
| サービス間の認証 | なし | 社内 Entra ID | 同左 | 同左 | 同左 |
| 顧客の範囲の判断 | なし | 台帳の Grant | 同左 | 同左 | Grant + 必要なら OBO |
| 所属(誰がどの組織か) | 各プロダクト | 各プロダクト | 台帳(C の分) | 台帳(A・B・C) | 台帳 |
| 候補 | 理想になる条件 | 避けるべき条件 | 確認した事実 |
|---|---|---|---|
| Microsoft Entra External ID | 契約を Microsoft に集約したい。顧客企業ごとの SSO 設定が少なく、社内で設定作業を回せる。組織と所属を台帳で持つ前提を受け入れる | 顧客企業に自分で SSO を設定させたい。組織単位のロールや組織 ID 入りのマシン間トークンを IdP の標準機能で使いたい。ピーク時のログインがテナントあたり 200 リクエスト/秒を超える | 顧客組織を表すオブジェクトはない。JIT パスワード移行 GA(2026-03)。client credentials GA(2026-01、有料アドオンでトークン単位の課金)。SAML/WS-Fed とカスタム OIDC のフェデレーション対応。トークン発行時のクレーム追加は外部 API の応答 2 秒以内、テナント全体で 50 リクエスト/秒まで。月間アクティブユーザー 5 万まで無料 |
| B2B 向け CIAM(Auth0、WorkOS、Descope など) | 顧客組織、組織単位の SSO、招待、組織単位のロール、組織つきのマシン間トークンを早く揃えたい。企業顧客の SSO 設定が増える見込み | Azure 以外のベンダー契約とデータの置き場所を増やしたくない。組織データを台帳と IdP の二重で管理したくない(するなら台帳を正本にして同期する) | Auth0 は Organizations と組織ごとの接続設定、組織 ID 入りの M2M トークンを持つ。WorkOS の M2M アプリは常に1組織に紐づく |
| Keycloak(自前運用) | Organizations と RFC 8693 のトークン交換を OSS で揃えたい。IdP のパッチ適用と可用性を担える体制がある | Platform チームが小さい。Microsoft は自前 IdP の運用をアンチパターンとしている | Keycloak 26 で Organizations が正式機能、26.2 で標準のトークン交換に対応 |
| Azure AD B2C | (新規では選ばない) | — | 2025-05-01 で新規販売終了。サポートは少なくとも 2030-05 まで。Architecture Center も新規には勧めていない |
| 方式 | 理想になる条件 |
|---|---|
| 一括作成 + JIT パスワード移行 | 旧パスワードのハッシュを IdP に移せない。ユーザーにパスワード再設定を強いたくない。旧 DB を数か月残せる |
| 一括作成 + 全員パスワード再設定 | 旧 DB を早く止めたい。ユーザー数が少ない。ログイン頻度が低く、JIT では移行が進まない |
| パスワード移行なし | 顧客の大半が企業 IdP の SSO でログインしている。または移行を機にパスワードレスに切り替える |
認証の統合と権限の統合は別の話です。「誰か」(認証)と「どの組織に属し、どのプロダクトを契約し、プロダクト間で何を許したか」は共通化し、「プロダクトの中で何ができるか」は各プロダクトに残します。
ログイン、MFA、顧客企業との SSO。
Organization への所属と組織内の管理者、どのプロダクトを契約しているか、Grant。
A の project ごとの編集権限、B の画面ごとの閲覧権限など。意味がプロダクトごとに違い、変更も頻繁です。
| 方式 | 理想になる条件 | 避けるべき条件 |
|---|---|---|
| すべて各プロダクトに置く | プロダクト間で共有・委任する対象がほとんどない。チームの独立性を最優先する | プロダクト間の接続がある(今回はある) |
| 所属・契約・Grant は台帳、細かい権限は各プロダクト | 組織、契約、プロダクト間の接続を全プロダクトで揃えたい。横断の共有は「接続した client を読む」程度の少数パターン | 横断の共有関係が多く、各プロダクトが同じ関係を別々に解釈し始めた |
| 関係ベースの認可エンジン(OpenFGA など) | Organization > 子会社 > client > project の階層と共有関係を、複数プロダクトが同じ意味で評価する。共有と委任が頻繁に変わる。「なぜ許可されたか」を横断で監査する必要がある。Platform が高い可用性で運用できる | 横断の共有が少ない。認可エンジンは全 API の単一障害点になるので、運用体制がないなら入れない |
認可エンジンを後から入れる可能性に備えるなら、API から台帳への問い合わせを OpenID AuthZEN Authorization API 1.0(2026-01 に最終仕様)の形に寄せておくと、問い合わせ先を差し替えやすくなります。OpenFGA は CNCF Incubating(2025-10)です。Azure にはこの種のマネージドサービスがないので、自前で運用することになります。
「集計してデータを返す API」と「集計のためにデータを取得する仕組み」は、別の層の話です。画面が呼ぶのは集計済みの値を返す API、材料を運ぶのは分析基盤への複製で、両方が要ります。避けるべきなのは、プロダクト間の API で生データを運んで、使う側で集計することです。
複数サービスの API を呼んで集める方式(API composition)には、大きなデータを呼び出し側のメモリで結合するという弱点があります。Microsoft のマルチテナント向けガイドも、テナントやシステムをまたぐ集計は中央の分析用ストアに発行する形を勧めています。Fabric Mirroring は Azure SQL Database、SQL Managed Instance、Cosmos DB(NoSQL)、PostgreSQL flexible server で GA です。変更は最短 15 秒間隔で反映され、複製の計算処理は Fabric 容量を消費しません(ただし容量は稼働させておく必要があります)。
各プロダクトチームは、分析基盤に出すデータの項目、意味、顧客キー、鮮度の約束を「データ契約」として持ちます(Open Data Contract Standard などの形式)。Platform チームは Mirroring、OneLake、容量、配信用ストア、集計 API の枠組みを持ちます。全部を Platform が作ると指標の追加が Platform 待ちになり、全部を各チームに任せると基盤が重複します。
| 方式 | 理想になる条件 | 避けるべき条件 |
|---|---|---|
| (a) 表示のたびに相手の API を呼ぶ | 1回に扱う件数が少ない。相手が安価な集計済みエンドポイントを持っている。直前に更新した値をすぐ反映する必要がある。同時利用が少ない | 長期間の履歴、多数の client にまたがる集計。応答時間の目標が厳しい。プロダクト数が増える(呼び出し先の数だけ遅く、落ちやすくなる) |
| (b) イベントで受け取り、自プロダクトに複製 | 使う側が必要なのは小さく安定した一部(接続中の client 一覧と件数など)。相手が止まっていても表示したい。その集計を使うのが自プロダクトだけ | 多くのプロダクトが多くの相手のデータを必要とする。指標の定義をプロダクト間で揃える必要がある。履歴の集計 |
| (c) 分析基盤 + 配信用ストア + 集計 API | 複数のプロダクトが互いのデータを使う。指標の定義を揃えたい。履歴やプロダクト間の結合がある。Platform チームがある。大半の指標が数分遅れで足りる | 連携が1本だけで (a) か (b) で済む |
| 配信用ストアを Eventhouse / Azure Data Explorer にする | 操作ログや時系列の指標。秒単位の鮮度。同時利用が多い(事前集計の materialized view と結果キャッシュを使う) | 更新で変わる業務エンティティ(client、project、契約)の結合が中心 |
| 配信用ストアを PostgreSQL / Azure SQL にする | 事前集計したテーブルが小さめで、顧客キーで引く。アプリ並みの応答時間と接続の扱いが欲しい。チームが SQL に慣れている | 大量の生データへの探索的な問い合わせ(それは分析基盤側で行う) |
| Power BI Embedded(アプリがデータを持つ方式) | ドリルダウンやエクスポートなど探索的な画面を、アナリストが作って頻繁に変える。iframe の見た目で問題ない。エンドユーザーのライセンスは不要(A / F SKU) | 数値を製品の画面に深く組み込む、通知や API でも同じ数値を使う、応答時間を製品側で保証したい |
| Databricks SQL + Lakebase | 会社として Databricks を標準にしている。データエンジニアリングや ML が重い。Lakebase の synced tables で分析基盤から Postgres へ配信する(Azure で 2026-03 GA) | Fabric に容量とガバナンスを寄せる方針 |
| Fabric Warehouse / SQL エンドポイントを画面から直接呼ぶ | 社内向けの管理画面など、同時利用が少なく数秒の応答で足りる | 顧客向けの画面。一定のサブ秒応答を狙った設計ではなく、結果キャッシュは現在無効、同時セッションはワークスペースあたり 2,048 |
指標ごとに次の順で判断します。既定は「5 分以内」とし、画面には必ず「◯時◯分時点」を表示します。
| 問い | はいの場合 |
|---|---|
| 他のプロダクトで更新した直後に、その数字を見て操作するか | その1件だけは相手の API で今の値を取る(方式 a)。一覧や集計は分析基盤のまま |
| 数字に業務上のアラートや SLA が結びついているか | その指標だけ Eventstream(CDC)→ Eventhouse の経路で秒単位にする |
| 日・週・月の傾向を見る指標か | 数分〜1時間の遅れで足りる。Mirroring + 定期集計 |
当てはまる条件にチェックを入れると、第 0 章の構成から変わる点が表示されます。チェックした内容はコピーできるので、質問するときに貼り付けてください。
構成に影響する制約だけを挙げます。いずれも 2026-09-13 時点の Microsoft Learn などで確認しました。
v2 は新規作成のみです。完全な VNet 内配置は Premium v2 と classic Premium だけで、Standard v2 は外向きの VNet 統合です。複数リージョンの単一インスタンスとセルフホストゲートウェイは classic Premium だけで、v2 にはバックアップ/復元もありません。
信頼性ガイド(2026-09-09)は対応と書き、機能表は未対応のままです。作成時にしか設定できないので、Japan East で使えるかをポータルで確かめてから tier を決めます。
組み込みゲートウェイでの workspaces は 2026-06 に GA ですが、ポータル対応は遅れています。workspace では credential manager、synthetic GraphQL、MCP サーバー、セルフホストゲートウェイが使えず、リソース名はインスタンス全体で一意です。専用の workspace gateway にはカスタムホスト名とプライベートエンドポイントがなく、Front Door を前に置きます。
rate-limit-by-key はゲートウェイごとに数えます。顧客ごとに全体で揃えた上限が必要なら quota-by-key か、入口の Front Door で制限します。v2 ではリクエスト本文のバッファ上限が 2 MiB です。
このポリシーは External ID 非対応と明記されています。顧客ユーザーのトークンは validate-jwt に ciamlogin.com の OpenID 構成を指定して検証します。社内 Entra ID のサービス間トークンは validate-azure-ad-token で検証できます。
アプリ登録は単一テナント固定です。リクエスト上限はテナントあたり 200 / 秒、IP あたり 20 / 秒です。M2M は有料アドオンです。カスタムドメインは Front Door 経由で、全アプリを同じログインドメインに揃える必要があります(セッション Cookie がドメイン単位のため)。
Warehouse と SQL エンドポイントは、一定のサブ秒応答を狙った設計ではありません。結果キャッシュは既知の問題で現在無効、セッションはワークスペースあたり 2,048 です。事前集計を配信用ストアに載せます。
同じ容量で重い処理が走ると、顧客向けの問い合わせまで遅延・拒否されます。配信に使う部分は専用の容量に分け、共有容量ではサージ保護を使います。超過分の課金(preview)は通常の 3 倍です。容量を止めると Mirroring も止まります。
公開するオブジェクトには主キーが必要で、キーのない集計ビューは出せません。タイムアウトは 100 秒です。顧客向けの集計 API の代わりにはしません。
Azure AD B2C(新規販売終了)、Cosmos DB の Synapse Link(新規プロジェクト非対応)、Cosmos DB for PostgreSQL(廃止予定、PostgreSQL の elastic clusters へ)。API Center は Japan リージョンがありません(メタデータのみの保存)。
次の項目が決まると、この解説のうち条件つきで書いた部分がどちらかに確定します。
配信用ストアの種類(PostgreSQL か Eventhouse か)、Fabric 容量の大きさ、秒単位の経路の要否が決まります。
子会社の管理者か親会社か、範囲は client 単位か project 単位か、操作は読み取りだけか書き込みもあるか。
共通 IdP の製品、Phase 3 の時期、パスワード移行の方式が決まります。
Mirroring をそのまま使えるか(MySQL なら CDC か open mirroring)が決まります。
Organization をそのまま tenant にできるか、C の中に細かい単位を作るか。
閉域の要否で APIM の tier が決まります。APIM・Front Door・Fabric 容量・External ID(MAU と M2M)の料金は、今回の調査では取得していません。