QuickSight Dashboard のワンクリック埋め込み(1-click embedding)をやってみた : ユーザー認証あり

# はじめに

QuickSight で作成したダッシュボードを、好きな Web アプリケーションに埋め込むことが出来ます。自分たちで実装する時と比べて、工数が削減でき、他の大事なお仕事に時間を費やすことが出来ます。

QuickSight でワンクリック埋め込み (1-click embedding) 機能が追加されました。今までの埋込機能は、埋め込み用 URL をアクセスのたびに動的に生成する仕組みが必要で、生成するための Lambda や EC2 などのコンピューティングリソースが必須でした。新たに作成されたワンクリック埋め込み (1-click embedding) では、Lambda や  EC2 のバックエンドサーバーを準備しなくても埋め込みが出来るようになりました。



詳細は次の Blog で紹介されています。
https://aws.amazon.com/jp/blogs/news/embed-interactive-dashboards-in-your-apps-and-portals-in-minutes-with-amazon-quicksights-new-1-click-embedding-feature/

また、1-click embedding に関する AWS Document です。
https://docs.aws.amazon.com/quicksight/latest/user/embedded-analytics-1-click.html



今回の記事は、このワンクリック埋め込みを検証してみた内容になっています。



# わかったこと

この検証を通じてわかったことを冒頭に記載します。ここは読み飛ばしてもらって大丈夫です。

- ワンクリック埋め込みについて
  - 事前に説明しているとおり、バックエンドサーバーが不要で埋め込みが出来るので、より簡単に埋め込みができるようになりました。
- Edition について
  - QuickSight の Enterprise Edition で利用できます。Standard Edition では利用できません。
- 新規ユーザー登録について
  - ユーザーやグループの権限を事前に設定するのが、基本的な考え方になっているはずです。権限設定周りを自動化していきたい場合、従来の埋込方法を利用してバックエンドサーバーを用意して自動化していく方法があります。
- SaaS 的な複数 IdP について
  - ワンクリック埋め込みに限った話ではないですが、QuickSight で SP Initiated SSO をする場合は、1個の IdP しか登録できません。SaaS のように複数の会社に提供するサービスでは、複数の IdP を使う場合があります。この場合、IdP Initiated SSO を使えば利用出来そうな気がしますが未調査です。時間があれば見ていきたいと思います。



# 前提条件

QuickSight と、Azure AD (SAML を使った Identity Provider) 間で連携済みの環境で行います。もちろん、SAML を使わずに QuickSight のローカルユーザーを使ってワンクリック埋め込みも可能です。



また、QucikSight 側で SP initiated SSO の設定を入れている状態です。この設定をONにすることで、ワンクリック埋め込みでログインする際に、IdP に飛ばされるようになります。

![image-20220103162755691.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/bb118af0-ee4f-fd66-6987-81463bb440a6.png)



# ワンクリック埋め込み用の Code を生成

まず、ワンクリック埋め込み用の Code を生成していきます。埋め込みたい Dashboard を選択します。

![image-20220103122539794.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d3c380d7-757f-0a19-87ff-67400ce1284b.png)



右上の Share から Share dashboard を選択します。

![image-20220103122644844.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/1b32ca05-b85c-ec39-9310-848b6d7ae9c4.png)



この Dashboard の権限設定を行う画面に変わります。この Dashboard は、既に `admin-group01` というグループにアクセス権限が付与されている環境です。今回の記事で利用するユーザーは、この `admin-group01` に参加しており、適切な権限が付与されています。

画面上にある `Copy embed code` をクリックします。

![image-20220103122754829.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/cb04b48e-6a29-2a55-4d93-600754249444.png)



すると、自動的にクリップボードに埋め込み用のコードがコピーされます。

- iframe 用のコード
- width や height が指定されている
- src が埋め込み用のダッシュボードが指定されている

```
    <iframe
        width="960"
        height="720"
        src="https://ap-northeast-1.quicksight.aws.amazon.com/sn/embed/share/accounts/xxxxxxxxxxxx/dashboards/97acc558-1bfc-4e39-93cd-5aca9153fab0">
    </iframe>
```



# HTML を準備して S3 + CloudFront で WebSite Hosting

適当に埋め込み用の Web サイトを準備します。HTML ファイルを準備して、S3 と CloudFront で WebSite Hosting をしていきます。

用意する HTML ファイルはこんな感じです。body に iframe を埋め込んだだけの単純な Web ページです。

```html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head>
    <title>QS 1 click 埋込</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>

<body>
    <h1>QuickSight 1 click 埋込</h1>
    <iframe width="960" height="720"
        src="https://ap-northeast-1.quicksight.aws.amazon.com/sn/embed/share/accounts/xxxxxxxxxxxx/dashboards/97acc558-1bfc-4e39-93cd-5aca9153fab0">
    </iframe>
</body>

</html>
```



適当に S3 Bucket 作成します。

![image-20220103123417514.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/cfcdf7ac-29a0-552e-1ec6-19ec58d4fd88.png)



HTML ファイルをアップロードします。

![image-20220103123454586.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/afe2189a-7a2a-b19d-aa6d-1bdeffce91fb.png)



この S3 を Origin にする CloudFront Distribution を作成します。

![image-20220103123537160.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b13ba994-5455-4bf4-b07b-41b2f858dd14.png)



Origin に 作成した S3 を指定します。

![image-20220103123750523.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4fa1e3b6-90b8-8530-3ab7-222eb180212a.png)



Default root object として、格納した HTML ファイル名を指定して Create を押します。

![image-20220103123855352.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/27a903cc-ca60-e8b5-f7cd-ae0f011acf33.png)



CloudFront Distribution が Deploy 開始されます。

![image-20220103123928815.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e96e12a3-85f8-d1e6-4f3a-ad1a17a0e20d.png)



# CloudFront の動作確認

Deploy 完了後、正常に HTML を確認できるか表示してみます。
https://d3hpwbtr9654lk.cloudfront.net/

![image-20220103133041492.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8e3e407c-c305-932f-8474-1b926e76f2a0.png)



はい、画像の通り HTML は表示できました。QuickSight の部分は表示されていないので、ここの設定を進めていきます。



# QuickSight でドメイン許可設定

QuickSight の設定の中で、どのドメインからの埋込を許可するか指定できます。今回は、CloudFront のドメインになるので、次の設定をしていきます。

- 末尾のスラッシュがあるとエラーになるので、**<u>末尾にスラッシュは入れない</u>**

```
https://d3hpwbtr9654lk.cloudfront.net
```

![image-20220103133254642.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/692af021-c370-feab-fb8b-42484d7abc0d.png)



追加された状態です。

![image-20220103133353544.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/cd21b997-b2f8-2019-4c50-86dde1ed38f7.png)



# ワンクリック埋め込みの動作確認

再び、CloudFront のページを表示します。
https://d3hpwbtr9654lk.cloudfront.net/

ポップアップがブロックされた旨が表示されるので、許可します。

![image-20220103133506256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4c1e8cf5-11f4-95cd-8740-d874ca81a3d4.png)



もう一度アクセスすると、ポップアップが表示されます。ここで、アクセスしたい QuickSight のアカウント名を入力します。

![image-20220103133604397.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2169761e-0e5d-e1da-1458-c89b9824d179.png)



Azure AD と連携しているため、自動的に Azure AD によるログイン画面に切り替わります。Azure AD 上のユーザー名を入力します。

![image-20220103133921421.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3de93c20-1a46-a8b7-c9c7-6cac284c8be5.png)



パスワードを入力します。

![image-20220103134036679.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/74be6a2f-4bfb-534c-b394-4537f8fd8727.png)



表示されました！

![image-20220103134112527.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a049eec6-ca09-67ca-2ca6-727d4fb4626b.png)



# その他検証

## 既に Azure AD ログイン済みの場合

既に Azure AD にログイン済みの場合、ユーザーID/パスワードの入力がスキップされ、自動的に埋め込みが表示されます。便利ですね。

![image-20220103163027888.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3162f79e-1360-b85d-6ab0-c435c788c99f.png)



## ユーザーに権限がない場合

Azure AD でログインしたユーザーに、該当のダッシュボードを表示する権限がない場合、表示されません。事前に適切な権限設定が必要です。

![image-20220103134651970.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/11083ec8-ace2-9364-6a90-f2dc30d41e1a.png)



## 全ユーザーにアクセス許可

Dashboard を Share する際に、左下の `Everyone in this account` を ON にすると、全ユーザーにアクセス権を付与できます。

![image-20220103163318141.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c1dad375-78b5-fa37-0563-36e00cabaadd.png)



## 自己プロビジョニング

QuickSight では、IAM を使った自己プロビジョニングが出来ます。今回の検証した環境だと、ワンクリック埋め込みでは自己プロビジョニングが正常に動作しませんでした。このあたりはまた時間があるときに見ていきます。

![image-20220103135754350.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b63f8a0c-fc92-b5ba-6471-9e67b868a7a6.png)



## SSO を OFF

QuickSight の設定で、SSO に関する設定を OFF にしてみると

![image-20220103140705890.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0ebfe2f7-e694-0300-443f-91ab5f4b3a58.png)





ポップアップが表示されますが

![image-20220103133604397.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/813ee77f-7ace-2ccb-5ba6-a6e631599d07.png)



ローカルユーザーの認証に切り替わります。

![image-20220103140846697.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/034c52ce-c9a9-7e5c-3702-1756c170f5c3.png)







# 参考URL

https://docs.aws.amazon.com/quicksight/latest/user/embedded-analytics-1-click.html

https://aws.amazon.com/jp/blogs/news/embed-interactive-dashboards-in-your-apps-and-portals-in-minutes-with-amazon-quicksights-new-1-click-embedding-feature/