はじめに
「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 ID | P1以上(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側の設定:
- Azure Portal > エンタープライズアプリケーション > 新規作成
- 「ギャラリーから追加」> “Google Workspace” を検索して追加
- シングルサインオン > SAML を選択
- 以下を設定:
| SAML設定項目 | 値 |
|---|
| 識別子(エンティティID) | google.com/a/your-company.com |
| 応答URL(ACS URL) | https://www.google.com/a/your-company.com/acs |
| サインオンURL | https://www.google.com/a/your-company.com/acs |
| 属性マッピング | user.mail → emailaddress |
Google Admin Console側の設定:
- セキュリティ > 認証 > サードパーティIdP(SSO)
- 「SSO プロファイルを追加」
- Entraの「フェデレーションメタデータXML」をアップロード
- ドメインに対して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操作手順:
- Admin Console > アプリ > Google Workspace > NotebookLM
- 対象OUを選択 > サービスのステータス
- 「オン(一部のユーザー向け)」を選択して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側の設定(アプリ登録):
- Azure Portal > アプリの登録 > 新規登録
- リダイレクトURI: なし(APIアクセス用)
- 証明書とシークレット > クライアントシークレット作成
- APIのアクセス許可 >
openid, email, profile, User.Read を追加 - トークン構成 > オプションクレームで
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との対応:
| Azure | GCP |
|---|
az role assignment create --assignee {group_id} | gcloud projects add-iam-policy-binding --member="principalSet://..." |
| ロール定義(カスタムロール) | IAMカスタムロール |
| マネージドID | Workload 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 SSO | SAML経由でWorkspaceにSSO | OIDCトークンをGCPに交換 |
| ユーザー管理 | GCDSでEntraからGoogle同期 | GCPのWorkforce Poolで直接管理 |
| Google Workspaceが必要か | 必須 | 不要 |
| 設定複雑度 | 中(SAML + GCDS) | 高(Workforce ID + IAM) |
| 監査ログ | Admin Console + Google Vault | Cloud Audit Logs |
| DLP制御 | Workspace DLP | VPC 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 のセキュリティ設定チェックリスト
パターンB のセキュリティ設定チェックリスト
よくある質問
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の面で安心です。
参考リンク