Entra ID SSO × NotebookLM 完全構成ガイド:Web UI利用とAPI従量課金の2パターン

はじめに

「EntraでSSOしつつNotebookLMを使いたい」という要件に対し、目的によって正しい構成が全く異なります。

本記事では以下の2つのユースケースをそれぞれ具体的に解説します。

ユースケース想定読者課金モデル
パターンA: 社員がWeb UIでNotebookLMを業務利用IT管理者・情シス月額固定(Workspaceライセンス)
パターンB: 開発者がNotebookLM APIをアプリに組み込む開発者・アーキテクト従量課金(API呼び出し単位)
graph LR A[Entra ID\n社内IdP] --> B{ユースケース} B -->|社員のWeb UI利用| C[パターンA\nWorkspace SSO連携] B -->|API組み込み・従量課金| D[パターンB\nWorkforce Identity Federation] C --> E[NotebookLM Plus\nWorkspace内で利用] D --> F[NotebookLM API\nVertex AI経由] style A fill:#0078d4,color:#fff style C fill:#34a853,color:#fff style D fill:#1a73e8,color:#fff style E fill:#fbbc04,color:#000 style F fill:#ea4335,color:#fff

パターンA:社員Web UI利用(Entra ID SSO × Google Workspace)

全体アーキテクチャ

graph TB subgraph "社内環境(既存)" AD[オンプレAD /\nEntra ID] USER[社員PC\nブラウザ] end subgraph "連携レイヤー" GCDS[Google Cloud\nDirectory Sync\nユーザー同期] SAML[SAML 2.0\nSSO] end subgraph "Google環境" GW[Google Workspace\nEnterprise Plus] NLM[NotebookLM Plus\n※Workspace同梱] VAULT[Google Vault\n監査・保持] DLP[Workspace DLP\nデータ制御] end AD -->|ユーザー・グループ同期| GCDS --> GW AD -->|認証リクエスト| SAML --> GW USER -->|SAML認証| SAML USER -->|SSO後アクセス| NLM NLM --> VAULT NLM --> DLP style AD fill:#0078d4,color:#fff style SAML fill:#ea4335,color:#fff style NLM fill:#fbbc04,color:#000

前提条件

項目要件
Google WorkspaceエディションBusiness Plus以上(NotebookLM Plusが含まれるのはEnterprise推奨)
NotebookLMライセンスGemini Business/Enterprise アドオン または Enterprise Plus同梱
Entra IDP1以上(SAML SSO設定に必要)
ユーザー同期Google Cloud Directory Sync (GCDS) またはMicrosoft Entra Google Workspace SSO

設定手順

ステップ1:Google Workspaceドメイン設定

1
2
3
4
# 1. Google Admin Consoleでドメイン検証(TXTレコードをDNSに追加)
# 確認コマンド例(社内DNS担当者向け)
nslookup -type=TXT your-company.com
# 期待値: "google-site-verification=xxxx..."

ステップ2:Entra IDをSAML IdPとして設定

Entra ID側の設定:

  1. Azure Portal > エンタープライズアプリケーション > 新規作成
  2. 「ギャラリーから追加」> “Google Workspace” を検索して追加
  3. シングルサインオン > SAML を選択
  4. 以下を設定:
SAML設定項目
識別子(エンティティID)google.com/a/your-company.com
応答URL(ACS URL)https://www.google.com/a/your-company.com/acs
サインオンURLhttps://www.google.com/a/your-company.com/acs
属性マッピングuser.mailemailaddress

Google Admin Console側の設定:

  1. セキュリティ > 認証 > サードパーティIdP(SSO)
  2. 「SSO プロファイルを追加」
  3. Entraの「フェデレーションメタデータXML」をアップロード
  4. ドメインに対してIdPを有効化

ステップ3:GCDS によるユーザー同期

sequenceDiagram participant AD as オンプレAD / Entra ID participant GCDS as Google Cloud Directory Sync participant GW as Google Workspace Note over GCDS: スケジュール実行(推奨: 毎時) GCDS->>AD: LDAPクエリ / Graph API でユーザー取得 AD-->>GCDS: ユーザー・グループ一覧 GCDS->>GW: ユーザー作成・更新・停止 GW-->>GCDS: 同期完了 Note over GW: 新規ユーザーは即座にSSO可能

GCDS設定のポイント(Entra ID連携時):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<!-- gcds-config.xml の主要設定例 -->
<config>
  <!-- EntraIDをGraph API経由で参照する場合 -->
  <ldapConfig>
    <hostname>login.microsoftonline.com</hostname>
    <authType>OAUTH2</authType>
    <clientId>your-app-client-id</clientId>
  </ldapConfig>
  <!-- 同期対象OUの指定 -->
  <userConfig>
    <searchBase>DC=your-company,DC=com</searchBase>
    <query>(memberOf=CN=Google-Workspace-Users,...)</query>
  </userConfig>
</config>

Azureエンジニア向けTips: GCDSは「Entra ConnectのGoogle版」と考えると理解しやすいです。同期方向はAD→Googleの一方向のみで、GoogleをマスターIdPにはできません。

ステップ4:NotebookLMのOU制御

Google Admin ConsoleでNotebookLMのアクセスをOU単位で制御できます。

graph TD ROOT[ルートOU\nyour-company.com] --> CORP[法人部門] ROOT --> IT[IT・開発部門] ROOT --> RESTRICTED[機密情報取扱部門] CORP -->|NotebookLM: ON| CORP_USERS[一般社員\nNotebookLM利用可] IT -->|NotebookLM: ON\nAPI連携: ON| IT_USERS[開発者\n全機能利用可] RESTRICTED -->|NotebookLM: OFF| REST_USERS[制限部門\nNotebookLM利用不可] style CORP fill:#34a853,color:#fff style IT fill:#1a73e8,color:#fff style RESTRICTED fill:#ea4335,color:#fff

Admin Console操作手順:

  1. Admin Console > アプリ > Google Workspace > NotebookLM
  2. 対象OUを選択 > サービスのステータス
  3. 「オン(一部のユーザー向け)」を選択してOU単位で有効化

ステップ5:DLPとガバナンス設定

NotebookLMに社内文書をアップロードする際のデータ漏洩リスクをDLPで制御します。

DLPルール例対象アクション
個人番号(マイナンバー)の検出NotebookLMへのアップロードブロック+管理者通知
クレジットカード番号Drive全般警告表示
社外秘ラベル付きファイルNotebookLMへのソース追加ブロック

コスト試算(パターンA)

項目費用目安
Google Workspace Enterprise Plus約3,000〜4,000円/ユーザー/月
Gemini Enterprise アドオン(NotebookLM Plus含む)約3,400円/ユーザー/月
GCDS無料
Entra ID P1(既存の場合)既存コストに含む
合計約6,400〜7,400円/ユーザー/月

パターンB:API従量課金利用(Entra ID × Workforce Identity Federation)

全体アーキテクチャ

graph TB subgraph "開発者環境 / アプリケーション" DEV[開発者 / アプリ] ENTRA_TOKEN[Entra IDトークン\nOIDC JWT] end subgraph "GCP 認証レイヤー" WIF[Workforce Identity Federation\nPool & Provider] IAM[Cloud IAM\nロールバインディング] STS[Security Token Service\nトークン交換] end subgraph "GCP サービス" VERTEXAI[Vertex AI\nNotebookLM API] LOGGING[Cloud Logging\n監査ログ] BILLING[Cloud Billing\n従量課金] end DEV -->|1. Entraで認証| ENTRA_TOKEN ENTRA_TOKEN -->|2. トークン提示| WIF WIF --> STS STS -->|3. GCPトークン発行| IAM IAM -->|4. API呼び出し許可| VERTEXAI VERTEXAI -->|5. レスポンス| DEV VERTEXAI --> LOGGING VERTEXAI --> BILLING style WIF fill:#ea4335,color:#fff style VERTEXAI fill:#1a73e8,color:#fff style BILLING fill:#34a853,color:#fff

Workforce Identity Federationとは

Workforce Identity Federationは、外部IdP(Entra ID等)のユーザーがGCPリソースにアクセスできるようにする仕組みです。Azureでいえば「Entra External ID」や「B2B連携」に近いですが、GCPリソースへのアクセス制御に特化しています。

graph LR subgraph "Azureでの類似概念" A1[Entra External ID] -->|外部ユーザーの認証| A2[Azure Resources] A3[Managed Identity] -->|サービス認証| A2 end subgraph "GCPでの対応" B1[Workforce Identity\nFederation] -->|外部ユーザーの認証| B2[GCP Resources] B3[Workload Identity\nFederation] -->|サービス認証| B2 end A1 -.対応.- B1 A3 -.対応.- B3

設定手順

ステップ1:GCPプロジェクト・APIの有効化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# GCPプロジェクトの設定
gcloud config set project YOUR_PROJECT_ID

# 必要なAPIを有効化
gcloud services enable \
  iam.googleapis.com \
  iamcredentials.googleapis.com \
  aiplatform.googleapis.com \
  sts.googleapis.com

# Workforce Identity Pool作成
gcloud iam workforce-pools create "entra-pool" \
  --location="global" \
  --display-name="Entra ID Pool" \
  --description="Microsoft Entra ID workforce pool"

ステップ2:Entra IDをOIDCプロバイダーとして登録

1
2
3
4
5
6
7
8
9
# Workforce Identity ProviderにEntra IDを追加
gcloud iam workforce-pools providers create-oidc "entra-provider" \
  --workforce-pool="entra-pool" \
  --location="global" \
  --display-name="Microsoft Entra ID" \
  --issuer-uri="https://login.microsoftonline.com/YOUR_TENANT_ID/v2.0" \
  --client-id="YOUR_ENTRA_APP_CLIENT_ID" \
  --attribute-mapping="google.subject=assertion.sub,google.email=assertion.email,google.groups=assertion.groups" \
  --attribute-condition="assertion.tid == 'YOUR_TENANT_ID'"

Entra ID側の設定(アプリ登録):

  1. Azure Portal > アプリの登録 > 新規登録
  2. リダイレクトURI: なし(APIアクセス用)
  3. 証明書とシークレット > クライアントシークレット作成
  4. APIのアクセス許可 > openid, email, profile, User.Read を追加
  5. トークン構成 > オプションクレームで email, groups を追加

ステップ3:IAMロールのバインディング

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Entra IDグループに対してVertex AIのロールを付与
# ※ グループIDはEntraのオブジェクトID
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
  --member="principalSet://iam.googleapis.com/locations/global/workforcePools/entra-pool/group/ENTRA_GROUP_OBJECT_ID" \
  --role="roles/aiplatform.user"

# ログ閲覧権限(監査用)
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
  --member="principalSet://iam.googleapis.com/locations/global/workforcePools/entra-pool/group/ENTRA_GROUP_OBJECT_ID" \
  --role="roles/logging.viewer"

Azureとの対応:

AzureGCP
az role assignment create --assignee {group_id}gcloud projects add-iam-policy-binding --member="principalSet://..."
ロール定義(カスタムロール)IAMカスタムロール
マネージドIDWorkload Identity

ステップ4:アプリケーションからのAPI呼び出し

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
import google.auth
import google.auth.transport.requests
from google.oauth2 import credentials
import requests

# ===== 方法1: Application Default Credentials (ADC) を使用 =====
# Workforce Identity連携後はADCが自動的にEntraトークンを使用
# 環境変数: GOOGLE_APPLICATION_CREDENTIALS または gcloud auth login

def call_notebooklm_api_with_adc():
    """ADCを使ったNotebookLM API呼び出し"""
    creds, project = google.auth.default(
        scopes=["https://www.googleapis.com/auth/cloud-platform"]
    )
    auth_req = google.auth.transport.requests.Request()
    creds.refresh(auth_req)

    headers = {
        "Authorization": f"Bearer {creds.token}",
        "Content-Type": "application/json",
    }

    # NotebookLM API エンドポイント(Vertex AI経由)
    endpoint = f"https://notebooklm.googleapis.com/v1beta/corpora"

    response = requests.post(endpoint, headers=headers, json={
        "display_name": "社内ナレッジベース",
        "description": "製品マニュアルと技術文書",
    })
    return response.json()


# ===== 方法2: Entraトークンを直接STSでGCPトークンに交換 =====
import msal  # Microsoft Authentication Library

def get_gcp_token_from_entra():
    """EntraトークンをGCPトークンに交換する"""

    # 1. Entraでトークン取得
    app = msal.ConfidentialClientApplication(
        client_id="YOUR_ENTRA_CLIENT_ID",
        client_credential="YOUR_CLIENT_SECRET",
        authority=f"https://login.microsoftonline.com/YOUR_TENANT_ID"
    )
    entra_token_result = app.acquire_token_for_client(
        scopes=["https://graph.microsoft.com/.default"]
    )
    entra_token = entra_token_result["access_token"]

    # 2. GCP STS でトークン交換
    sts_url = "https://sts.googleapis.com/v1/token"
    sts_payload = {
        "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange",
        "audience": f"//iam.googleapis.com/locations/global/workforcePools/entra-pool/providers/entra-provider",
        "subject_token_type": "urn:ietf:params:oauth:token-type:id_token",
        "subject_token": entra_token,
        "requested_token_type": "urn:ietf:params:oauth:token-type:access_token",
        "scope": "https://www.googleapis.com/auth/cloud-platform",
    }
    sts_response = requests.post(sts_url, json=sts_payload)
    gcp_token = sts_response.json()["access_token"]

    return gcp_token


# ===== NotebookLM APIの主要操作 =====
class NotebookLMClient:
    BASE_URL = "https://notebooklm.googleapis.com/v1beta"

    def __init__(self, token: str):
        self.headers = {
            "Authorization": f"Bearer {token}",
            "Content-Type": "application/json",
        }

    def create_corpus(self, name: str, description: str) -> dict:
        """ノートブック(コーパス)作成"""
        return requests.post(
            f"{self.BASE_URL}/corpora",
            headers=self.headers,
            json={"display_name": name, "description": description}
        ).json()

    def add_document(self, corpus_id: str, content: str, source_url: str = None) -> dict:
        """ドキュメント追加(ソースとして)"""
        payload = {"display_name": "document", "text_content": {"text": content}}
        if source_url:
            payload["source_url"] = source_url
        return requests.post(
            f"{self.BASE_URL}/corpora/{corpus_id}/documents",
            headers=self.headers,
            json=payload
        ).json()

    def query(self, corpus_id: str, question: str) -> dict:
        """RAGクエリ(質問への回答生成)"""
        return requests.post(
            f"{self.BASE_URL}/corpora/{corpus_id}:generateContent",
            headers=self.headers,
            json={"query": question}
        ).json()

ステップ5:ローカル開発環境の設定

開発者がローカルPCからEntra ID認証でGCPにアクセスするための設定です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# gcloud CLIでWorkforce Identity認証を設定
gcloud config set auth/credential_file_override /path/to/workforce-credentials.json

# workforce-credentials.json の内容
cat > workforce-credentials.json << 'EOF'
{
  "type": "external_account_authorized_user",
  "audience": "//iam.googleapis.com/locations/global/workforcePools/entra-pool/providers/entra-provider",
  "subject_token_type": "urn:ietf:params:oauth:token-type:id_token",
  "token_url": "https://sts.googleapis.com/v1/token",
  "credential_source": {
    "url": "http://localhost:8888/token",
    "headers": {"Metadata-Flavor": "Google"},
    "format": {"type": "text"}
  }
}
EOF

# ブラウザでEntraログイン後にAPIアクセス可能
gcloud auth login --workforce-pool-user

コスト試算(パターンB)

注意: NotebookLM API の料金は2026年3月時点でプレビュー段階のため変動があります。Vertex AI Gemini APIの参考値を記載します。

項目費用目安
Workforce Identity Federation無料
Cloud IAM無料
Vertex AI API 呼び出し入力1,000トークンあたり約$0.00015(Gemini 1.5 Flash相当)
Cloud Logging(監査ログ)最初の50GB/月は無料
GCPプロジェクト維持費使用量ベース(最低料金なし)
特徴使った分だけ課金・月額固定なし

2パターンの比較とユースケース選定

graph TD START[要件整理] --> Q1{主な利用者は?} Q1 -->|一般社員・ビジネスユーザー| Q2{月額コストを\n固定したい?} Q1 -->|開発者・エンジニア| Q3{GCPを既に\n使っているか?} Q2 -->|Yes| A[パターンA\nWorkspace SSO連携] Q2 -->|No・従量が良い| Q4{APIで\nアプリに組み込む?} Q4 -->|Yes| B[パターンB\nWorkforce ID Federation] Q4 -->|Webブラウザで使いたい| A Q3 -->|Yes| B Q3 -->|Noだが導入検討可| B Q3 -->|Workspaceだけで完結したい| A style A fill:#34a853,color:#fff style B fill:#1a73e8,color:#fff

詳細比較表

比較項目パターンA(Workspace SSO)パターンB(Workforce ID Federation)
対象ユーザー一般社員・情報系ワーカー開発者・AIアプリ開発チーム
アクセス方法ブラウザ(notebooklm.google.com)API(REST / Python SDK)
課金モデル月額固定(Workspaceライセンス)従量課金(API呼び出し単位)
Entra SSOSAML経由でWorkspaceにSSOOIDCトークンをGCPに交換
ユーザー管理GCDSでEntraからGoogle同期GCPのWorkforce Poolで直接管理
Google Workspaceが必要か必須不要
設定複雑度中(SAML + GCDS)高(Workforce ID + IAM)
監査ログAdmin Console + Google VaultCloud Audit Logs
DLP制御Workspace DLPVPC Service Controls + Org Policy
NotebookLM機能Web UIの全機能APIで公開された機能のみ
GA状況(2026年3月)GA済みNotebookLM APIはプレビュー

ハイブリッド構成(両パターン同時運用)

大企業では「一般社員はパターンA、開発チームはパターンB」というハイブリッド構成が現実的です。

graph TB ENTRA[Entra ID\n全社のIdP] subgraph "一般社員向け(パターンA)" GCDS[GCDS\nユーザー同期] GW[Google Workspace] NLM_WEB[NotebookLM\nWeb UI] end subgraph "開発チーム向け(パターンB)" WIF[Workforce Identity\nFederation] GCP[Google Cloud\nProject] NLM_API[NotebookLM API\n/ Vertex AI] APP[社内AIアプリ] end ENTRA -->|SAML SSO + GCDS| GW ENTRA -->|OIDC トークン| WIF GW --> NLM_WEB WIF --> GCP --> NLM_API --> APP style ENTRA fill:#0078d4,color:#fff style NLM_WEB fill:#fbbc04,color:#000 style NLM_API fill:#ea4335,color:#fff style APP fill:#34a853,color:#fff

ハイブリッド構成のポイント:

  • EntraのグループでパターンA/Bの利用者を分離管理
  • パターンAで作成したNotebookLMのコーパスをパターンBのAPIから参照することは現時点では非対応(別データとして管理)
  • 将来的にGoogle Workspace APIとVertex AI NotebookLM APIの統合が進む見込み

セキュリティ・ガバナンスのまとめ

パターンA のセキュリティ設定チェックリスト

  • Context-Aware Accessで「管理対象デバイスのみ」に制限
  • Workspace DLPで機密情報のNotebookLMへのアップロードをブロック
  • Google Vaultの保持ポリシーでNotebookLMデータを対象に追加
  • Admin Consoleの監査ログでNotebookLM操作を記録・SIEMに転送
  • OUで利用部署を制限(全社展開は段階的に)

パターンB のセキュリティ設定チェックリスト

  • Workforce Identity Poolのattribute-conditionでテナントIDを固定(他テナントの侵入防止)
  • IAMロールは最小権限(roles/aiplatform.userのみ)
  • VPC Service ControlsでAPIアクセスをVPC境界内に制限
  • Cloud Audit LogsのDATA_READ/DATA_WRITEを有効化
  • Organization PolicyでWorkforce Poolの利用プロジェクトを制限
  • シークレット(クライアントシークレット)はSecret Managerで管理

よくある質問

Q: パターンBはGoogleアカウントなしでGCPにアクセスできる?

A: はい。Workforce Identity Federationを使うと、Googleアカウント不要でEntra IDの認証情報だけでGCPにアクセスできます。開発者がGoogleアカウントを持つ必要がないため、Googleへの依存を最小化できます。

Q: NotebookLM APIはいつGA(一般提供)になる?

A: 2026年3月時点でプレビュー段階です。GA前の本番利用はSLAが適用されないためご注意ください。本番環境にはVertex AI Search + Gemini APIでのRAG構築(GA済み)を代替として検討することを推奨します。

Q: パターンAとBでデータは共有できる?

A: 現時点では共有できません。パターンAのNotebookLMデータはGoogle Workspaceに、パターンBのデータはGCPプロジェクトに別々に保存されます。統合APIの提供はGoogleのロードマップ次第です。

Q: コストを抑えるなら?

A: 利用者が少ない(〜20名程度)かつAPIで試験導入したい場合はパターンBが経済的です。20名以上で安定運用するならパターンAのWorkspaceライセンスの方がサポート・SLAの面で安心です。


参考リンク