top of page
検索

WebアプリケーションにQuickSightダッシュボードを埋め込むことについて考える

  • 執筆者の写真: mon
    mon
  • 12 時間前
  • 読了時間: 5分

Amazon QuickSight では、ダッシュボードを外部のWebページやアプリケーションに埋め込む機能が提供されています。

本記事では、埋め込み方式の比較と、実際に「認証付き埋め込み」を用いた検証手順を紹介します。(実装は次の記事)


QuickSightの埋め込み方式とは?

QuickSight には、以下の2つの埋め込み方式があります:

方式

特徴

適用例

匿名埋め込み

誰でもアクセス可能(認証不要)

公開ダッシュボード、社外KPI表示

認証付き埋め込み

QuickSight登録ユーザーのみアクセス可能

社内BI、顧客ごとのデータ表示

本記事では認証付き埋め込みに絞って、具体的な設定と表示方法を検証します。


認証付き埋め込みの仕組み

認証付き埋め込みは、QuickSight に登録されているユーザーごとに埋め込み表示を制御できる仕組みです。埋め込みURLは API を通じて発行され、iframe に埋め込むことでWebアプリに統合可能です。


  • 必須条件:QuickSight Enterprise Edition

  • 利用API:GenerateEmbedUrlForRegisteredUser

  • ライセンス:Reader または Author ライセンスのユーザー


実装の概要


1. QuickSight ユーザーとダッシュボードを準備

  • QuickSight にログインし、対象のダッシュボードを作成または共有します。

  • 表示対象のユーザー(Readerライセンス)を QuickSight に追加します。


2. IAMロールとポリシーの設定

埋め込みURLを生成するアプリケーションには、以下のようなIAMポリシーを付与します:

{
  "Effect": "Allow",
  "Action": [
    "quicksight:GenerateEmbedUrlForRegisteredUser"
  ],
  "Resource": "*"
}

IAMロールの信頼ポリシーでは、APIを実行するLambdaやアプリケーションが AssumeRole できるように設定します。


  1. 埋め込みURLの生成(Pythonスクリプト)

boto3 を使って埋め込みURLを生成するPythonコード例:

import boto3

client = boto3.client('quicksight')
response = client.generate_embed_url_for_registered_user(
    AwsAccountId='123456789012',
    SessionLifetimeInMinutes=60,
    UserArn='arn:aws:quicksight:ap-northeast-1:123456789012:user/default/alice',
    ExperienceConfiguration={
        'Dashboard': {
            'InitialDashboardId': 'your-dashboard-id'
        }
    }
)
print(response['EmbedUrl'])

  1. HTMLページへの埋め込み

取得したURLをiframeに差し込むだけで表示が可能です。


<iframe
  width="100%"
  height="600"
  src="https://quicksight.aws.amazon.com/sn/embed/..."
  frameborder="0"
  allowfullscreen>
</iframe>

ブラウザで表示すると、QuickSight にログイン済みのユーザーとしてダッシュボードが表示されます。


埋め込みURLを生成するIAMとQuickSightユーザーの関係

ここで一つ重要な疑問が生じます:


「GenerateEmbedUrlForRegisteredUser を呼び出す IAM ユーザーの権限で QuickSight のアクセスも制御されるのか?」


答え:いいえ。QuickSight のアクセス制御は、埋め込み対象の QuickSight ユーザーの権限によって行われます。


API を実行する IAM ユーザー/ロールは、あくまで「埋め込みURLを発行する役割」です。

実際にダッシュボードを表示するユーザーのアクセス制御(共有設定やRLSなど)は、UserArn で指定した QuickSight ユーザーの権限に基づいて評価されます。


UserArn = arn:aws:quicksight:ap-northeast-1:123456789012:user/default/alice

この場合:

  • IAM は「alice のためのURL」を生成するだけ

  • 表示時に適用されるアクセス制御やフィルタは、QuickSight 内の alice さんのロール・設定によって決定されます


QuickSight の埋め込みURLと S3 の Pre-signed URL の類似性

QuickSight の GenerateEmbedUrlForRegisteredUser は、アクセス対象の QuickSight ユーザーのセッションを代理で生成する仕組みです。この構造は、S3 の Pre-signed URL(署名付きURL) によく似ています。


比較項目

QuickSight Embed URL

S3 Pre-signed URL

発行者

IAMユーザー/IAMロール

IAMユーザー/IAMロール

対象

QuickSight ユーザー(UserArn)

S3 オブジェクト(バケット+キー)

有効期限

最大 600 分(SessionLifetimeInMinutes)

最大 7 日(Expires)

アクセス権の適用先

QuickSight ユーザーの共有設定やRLS

URLに署名が含まれている

アクセスの実行者

ブラウザ埋め込み先で動作するQuickSightセッション

URLにアクセスするクライアント

主な用途

ダッシュボード埋め込み

ファイルの一時公開や一時アップロード

類似のポイント

  • IAM がアクセス主体の代わりに「限定されたセッション」を発行

  • URL 自体にアクセス資格情報が埋め込まれている

  • 有効期限つきで安全にアクセス制御できる


相違点(補足)

  • QuickSight はビューアーを含んだUI付きの表示が主目的

  • S3 は純粋なリソース(バイナリやJSONなど)の一時公開


Webアプリケーションのユーザーと QuickSight ユーザーの突き合わせはどうする?

ここで重要なセキュリティ上の観点として、次の疑問が生まれます:


「Webアプリにログインしているユーザーが、埋め込み対象の QuickSight ユーザーと一致しているかどうかは、どう検証するのか?」


結論:

GenerateEmbedUrlForRegisteredUser は、指定された UserArn に対してセッションを発行するだけで、

「そのセッションを発行してよいユーザーなのか」の検証はアプリケーション側の責任です。


Webアプリ側で実装すべきこと

  1. Webアプリでユーザー認証を行い、「これは QuickSight ユーザー alice である」と確定する

    • 例:Cognito / IAM Identity Center / JWT トークンなど

  2. 確定したユーザーに対応する UserArn を特定する

  3. その UserArn を使って GenerateEmbedUrlForRegisteredUser を呼び出す


このステップを飛ばして、ユーザーの入力値などをそのまま使うと、他人の QuickSight セッションを取得できる脆弱な実装になってしまいます。


QuickSight埋め込みにおける「ユーザーと権限の結びつけ」の課題と、S3 Pre-signed URLとの比較

前セクションの課題を踏まえて、再びS3 の Pre-signed URLと比較してみます。


観点

S3 Pre-signed URL

QuickSight 認証付き埋め込み

認証ユーザーと権限の結合

IAM Role を Assume した認証済ユーザーが署名URLを使う

Webアプリ側で QuickSight ユーザーへのマッピングが必要

アクセス主体

実行中の IAM ロール(例:Cognito 連携ロール)

UserArn で指定された QuickSight ユーザー

URL発行に必要なもの

IAM Role + 対象オブジェクト情報

IAM Role + QuickSight UserArn + DashboardId 等

信頼性の担保

IAM Policy / TrustPolicy により制御

アプリケーション側のマッピングロジックに依存

Webアプリとアクセス権の一体性

高い(認証がそのまま権限に)

低い(マッピングが必要)


結論

QuickSight 埋め込みでは、CognitoユーザーにIAM RoleをAssumeさせてQuickSightアクセスを自動的に制御することはできません。

アプリケーションが「ログインユーザー ↔ QuickSightユーザー」の関係を正しく持ち、責任を持って UserArn を決定する必要があります。


この設計の違いを理解したうえで、安全かつ柔軟な埋め込みアーキテクチャを構築することが重要です。


まとめ

  • GenerateEmbedUrlForRegisteredUser 自体にはユーザー認証機能はありません

  • 誰が誰のセッションを使うかを判定・制御するのは、アプリケーションの責任

  • 安全に運用するには、アプリ側でログインユーザー情報と QuickSight ユーザーのマッピングを厳格に管理する必要があります


以上を踏まえて、次の記事では簡単なアプリケーションを作って確認してみたいと思います。










Comentarios


  • Facebook

©Optarc,llc.

bottom of page