Slide 1

Slide 1 text

Lookerで実現するセキュアな 外部データ提供 2025/12/17 Jagu'e'r データ利活用分科会 Looker User Meetup Part 5 株式会社ZOZO
 データ・AIシステム本部 データシステム部 データ基盤ブロック
 
 栁澤 仁子 Copyright © ZOZO, Inc. 1

Slide 2

Slide 2 text

© ZOZO, Inc. 株式会社ZOZO データ・AIシステム本部 データシステム部 データ基盤ブロック 栁澤 仁子 (@i_125) 2023年3月中途入社 データマート整備やLooker周辺の整備・サポートに取 り組んでいます。社内では「とこさん」と呼ばれていま す。 2

Slide 3

Slide 3 text

© ZOZO, Inc. https://zozo.jp/ 3 ● ファッションEC ● 1,600以上のショップ、9,000以上のブランドの取り扱い ● 常時107万点以上の商品アイテム数と毎日平均2,700点以上の新着 商品を掲載(2025年9月末時点) ● ブランド古着のファッションゾーン「ZOZOUSED」や コスメ専門モール「ZOZOCOSME」、シューズ専門ゾーン 「ZOZOSHOES」、ラグジュアリー&デザイナーズゾーン 「ZOZOVILLA」を展開 ● 即日配送サービス ● ギフトラッピングサービス ● ツケ払い など

Slide 4

Slide 4 text

© ZOZO, Inc. 4 アジェンダ 1. 背景 2. Looker Embedによる外部提供の設計 3. マルチテナント環境のセキュリティ対策 4. Gemini in Lookerの導入と実装 5. まとめ

Slide 5

Slide 5 text

© ZOZO, Inc. 5 アジェンダ 1. 背景 2. Looker Embedによる外部提供の設計 3. マルチテナント環境のセキュリティ対策 4. Gemini in Lookerの導入と実装 5. まとめ

Slide 6

Slide 6 text

© ZOZO, Inc. 6 なぜ外部向けダッシュボードが必要になったか 前提 ● 元々「ZOZOTOWNに出店いただいているテナント企業向け」と「社内向け」それぞれのWebアプ リ上で分析ダッシュボードを提供していた ● エンジニアが都度要望を聞いて開発 課題 「分析ダッシュボードについてはビジネス部門が直接提供できるようにしたい」 → Lookerを選定 ● アクセス制御機能(User Attribute + Access Filter)が充実 ● 同じダッシュボードをテナント企業向け・社内向け両方に埋め込み可能

Slide 7

Slide 7 text

© ZOZO, Inc. 7 マルチテナント構成 ただし設計には注意が必要! → 今回はこの課題をどう解決したかを紹介 別テナントのデータが見 えてしまうと重大な問題

Slide 8

Slide 8 text

© ZOZO, Inc. 8 アジェンダ 1. 背景 2. Looker Embedによる外部提供の設計 3. マルチテナント環境のセキュリティ対策 4. Gemini in Lookerの導入と実装 5. まとめ

Slide 9

Slide 9 text

© ZOZO, Inc. 9 Looker Embedとは Lookerのダッシュボードを外部アプリケーションに埋め込む機能 埋め込みの種類 ● ユーザーはLookerへの追加ログイン不要(シームレスなUX) ● 暗号署名によりURLの改ざんを防止 ● User Attributeを埋め込み時に設定可能 タイプ 認証 特徴 Public 不要 誰でも閲覧可能 Private Lookerログイン必須 社内向け、外部ユーザー不向き Signed (SSO) 親アプリ認証のみ 外部ユーザー向け 今回はこちらを採用

Slide 10

Slide 10 text

© ZOZO, Inc. 10 User Attributeの引き渡し SSO Embed認証時にUser Attributeを設定 実装の流れ ● 1. 外部アプリがLookerのSSO Embed APIを呼び出し ● 2. User Attributeとして `app_user_id` (アプリ側のユーザーID)を設定 ● 3. Embed Userを作成してダッシュボードを表示

Slide 11

Slide 11 text

© ZOZO, Inc. 11 アジェンダ 1. 背景 2. Looker Embedによる外部提供の設計 3. マルチテナント環境のセキュリティ対策 4. Gemini in Lookerの導入と実装 5. まとめ

Slide 12

Slide 12 text

© ZOZO, Inc. 12 User AttributeとAccess Filterによる権限制御 テナント単位でのアクセス制御を実現 仕組み 1. Exploreに `app_user_id` が渡される 2. ユーザー管理ビューを参照し、権限のある `tenant_id` を取得 3. `access_filter` で自動的にWHERE句を付与 全テナントで同じダッシュボードを参照しても、 ユーザーに紐づくテナントIDで自動フィルタリングがされる!

Slide 13

Slide 13 text

© ZOZO, Inc. 13 access_filterの実装例 設定内容 ● Explore: order_items(注文データ) ● User Attribute: app_user_id(アプリ側ユーザーID) ● フィルタ対象: tenant_id(テナント識別子) LookMLでの設定例 explore: order_items { access_filter: { field: order_items.tenant_id user_attribute: app_user_id } } Explore `order_items` に対するクエリには 常にWHERE句が自動付与される 例:WHERE tenant_id IN ('T001', 'T002')

Slide 14

Slide 14 text

© ZOZO, Inc. 14 アジェンダ 1. 背景 2. Looker Embedによる外部提供の設計 3. マルチテナント環境のセキュリティ対策 4. Gemini in Lookerの導入と実装 5. まとめ

Slide 15

Slide 15 text

© ZOZO, Inc. 15 Gemini in Looker導入の背景 ビジネス側からの要望 ● ダッシュボードの情報量が増加 ● 「全体を要約して理解しやすくできないか」 Dashboard Summarizationを採用 ● OSSとして公開(カスタマイズ可能) ● プロンプト調整やUI変更が柔軟

Slide 16

Slide 16 text

© ZOZO, Inc. 16 デモ画面 ※数字はZOZOTOWNの実際の売上データとは無関係(公開データセット使用)

Slide 17

Slide 17 text

© ZOZO, Inc. 17 アーキテクチャ概要 構成図 ● Cloud Load Balancing + Cloud Armorを追加 ● LookerインスタンスからのIPアドレスのみを許可

Slide 18

Slide 18 text

© ZOZO, Inc. 18 セキュリティ上の重要な設計判断 ● →実装を確認したところ、実際には異なる設計だった 公式アーキテクチャ図を 見ると、Cloud Runが Looker API経由でデータ 取得するように見えなく もない...? 引用:https://github.com/looker-open-source/dashboard-summarization?tab=readme-ov-file#setup より

Slide 19

Slide 19 text

© ZOZO, Inc. 19 もしCloud Run側から呼び出していたら 他ショップデータ漏洩の危険性 User Attributeとaccess_filterが正しく 適用されない フロントエンド側でパラメータ 改ざん攻撃リスク

Slide 20

Slide 20 text

© ZOZO, Inc. 20 実際のデータフロー ●

Slide 21

Slide 21 text

© ZOZO, Inc. 21 実際のデータフロー ● クエリ実行はLooker内で完結され、 アクセス制御が確実に適用 Cloud Runにはフィルタ済みデータのみ送信

Slide 22

Slide 22 text

© ZOZO, Inc. 22 実装の工夫 1. プロンプトの外部ファイル化 ● guideline.txt にZOZOTOWN特性・施策例を記載 ● コード変更なしでビジネス情報を更新可能 2. プロンプトの固定化 ● ユーザー自由入力を制限し、事前定義のプロンプトのみ使用 ● プロンプトインジェクション対策 3. 統合要約の実現 ● デフォルトはタイル単位の個別要約のみ ● `generateQuerySummary` → `generateSummary` の2段階処理で全体俯瞰

Slide 23

Slide 23 text

© ZOZO, Inc. 23 本番適用時の対応(1) フィルタ同期 フィルタ同期がされない ● 課題:フィルタ変更後も初期状態のデータで要約 → 画面表示と要約内容が乖離 ● 対応:`tileHostData.dashboardFilters` から現在のフィルタ状態を取得し、その条件 でデータ再取得してからサマリAPIへ送信 // 最新のフィルタ状態でメタデータを再取得 const latestMetadata = await fetchDashboardDetails( dashboardId, core40SDK, extensionSDK, tileHostData.dashboardFilters || {} ); // 最新のクエリ結果を取得 const latestResults = await fetchQueryData(latestMetadata.queries, core40SDK);

Slide 24

Slide 24 text

© ZOZO, Inc. 24 本番適用時の対応(2) PDF対応 PDFダウンロードができない ● 課題:Extension Tileを含むダッシュボードのPDFダウンロード時、Lookerのレンダ ラが応答を停止 ● 対応:`extensionSDK.rendered()` でレンダリング完了を通知 ● 現状の制約:サマリ内容自体はPDFに含まれない(非同期生成のため) 参考:https://cloud.google.com/looker/docs/extension-framework-building-tile-extensions#rendering_considerations

Slide 25

Slide 25 text

© ZOZO, Inc. 25 アジェンダ 1. 背景:なぜ外部向けダッシュボードが必要になったか 2. Looker Embedによる外部提供の設計 3. マルチテナント環境のセキュリティ対策 4. Gemini in Lookerの導入と実装 5. まとめ

Slide 26

Slide 26 text

© ZOZO, Inc. 26 まとめ Looker Embedでの外部向けダッシュボード提供 ● User Attribute + Access Filterでクエリレベルの強制フィルタリング ● マルチテナント環境でも同一ダッシュボードを安全に共有可能 Gemini in Looker(Dashboard Summarization)導入時 ● Lookerなら生成AI機能も外部ユーザーに安全に提供可能 ● Looker内でアクセス制御が完結 → バックエンドにはフィルタ済みデータのみ送信 ● OSSカスタマイズで要件に合わせた拡張も柔軟に対応

Slide 27

Slide 27 text

© ZOZO, Inc. 27 参考情報 Dashboard Summarizationについてもう少し詳しく知りたい方は、 こちらのテックブログ記事もご覧ください ● https://techblog.zozo.com/entry/gemini-in-looker

Slide 28

Slide 28 text

No content