Briswell Tech Blog

ブリスウェルのテックブログです

ローカル環境で画面にQuickSightを使用するダッシュボードを埋め込んでみる。

どうもこんにちは。ブリスウェルのSonです。
最近、ウェブサイトでダッシュボードを埋め込むために、QuickSightをちょっと調査してました。忘れないように、基本的な手順をメモしておきます。
この記事は技術的な内容なので、QuickSightサービスの料金に関する問題を無視します。

言語: PHP (v 7.4)
必要なライブラリ: AWS SDK for PHP (v 3.x)

準備:CSV内容

tenant city itemtype price
tenant1 city1 item1 100
tenant1 city1 item2 200
tenant1 city2 item1 400
tenant1 city2 item2 500
tenant1 city3 item1 700
tenant1 city3 item2 800
tenant2 city1 item1 100
tenant2 city1 item2 200
tenant2 city2 item1 400
tenant2 city2 item2 500
tenant2 city3 item1 700
tenant2 city3 item2 800

依頼内容は
ダッシュボードを画面に埋めこむ
・特定のユーザーはtenant=tenant2の行のみ閲覧できるように

datasetについて
上のCSVをインポートして、データセットを作成します。
データセットの作成をしたら、RLS モードを設定する必要があります (行レベルのセキュリティ)
特定のユーザーのみを表示するので、列を「tanent」に設定する必要があり、タグ列を「hogetalent」のような値を設定できます。

データセットからダッシュボードの作成してみます。ダッシュボードを作成したら、こんな状態になります。 RLSを設定しましたので、自分のアカウントでも細かいダッシュボードが見えないです。

IAMのroleの設定について
ダッシュボードを表示するには、SDKにある「GenerateEmbedUrlForAnonymousUser」を実装する必要があります。
ただし、「GenerateEmbedUrlForAnonymousUser」が実行できるために、次のようなユーザーにロールを与える必要があります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "quicksight:GenerateEmbedUrlForAnonymousUser"
            ],
            "Resource": [
                "arn:aws:quicksight:{region}:{account_id}:dashboard/*"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "quicksight:AllowedEmbeddingDomains": [
                        "http://localhost"
                    ]
                }
            }
        },
 ]
}

注意: 該当する「AllowedDomains」の値を変更する必要があります。
例: https://abc.com

Coding
まずは下記のようなコマンドでAWS SDK for PHP (v 3.x)導入するする必要があります。

composer require aws/aws-sdk-php

以下のように必要な情報を指定する必要があります。

define('AWS_REGION', 'XXXXXXXX');
define('AWS_ACCESS_KEY', 'XXXXXXXX');
define('AWS_SECRET_ACCESS_KEY', 'XXXXXXXX');
define('AWS_ACCOUNT_ID', 'XXXXXXXX');

次に、次の内容のphpクラスを作成します。

<?php
require __DIR__. '/vendor/autoload.php';

use Aws\QuickSight\QuickSightClient;
use Aws\Exception\AwsException; 

class QuickSight {
     $this->credentials_ = [
           'version' => 'latest',
           'region' => AWS_REGION,
           'credentials' => [
               'key'    => AWS_ACCESS_KEY,
               'secret' => AWS_SECRET_ACCESS_KEY
           ]
    ];
}

次にgetEmbedUrlの関数を作成します。「generateEmbedUrlForAnonymousUser」の関数を実行するために、$dashboardIdのパラメーターを渡す必要があります。

<?php

public function getEmbedUrl($dashboardId) {
   $params = [
      'AllowedDomains' => [
         'http://localhost'
      ],
      'AwsAccountId' => AWS_ACCOUNT_ID,
      'Namespace' => 'default',
      'SessionLifetimeInMinutes' => 600,
      'AuthorizedResourceArns' => 'arn:aws:quicksight:${AWS_REGION}:{AWS_ACCOUNT_ID}:dashboard/$dashboardId',
      'ExperienceConfiguration' => [
         'Dashboard' => [
            'InitialDashboardId'=> $dashboardId
         ]
      ],
      'SessionTags' => [
         [
            'Key' => 'hogetenant',
            'Value' => 'tenant2',
         ]
      ]
   ];

    try {
      $client = new QuickSightClient($this->credentials_);
      $result = $client->generateEmbedUrlForAnonymousUser($params);
      $embedUrl = $result['EmbedUrl'];
      
      return $embedUrl;
    } catch(Exception $e){
      print $e->getMessage();
    }
}

tenant=tenant2の行のみを表示するので、hogetenantのタグ値をtenant2に指定する必要があります。
注意: 該当する「AllowedDomains」の値を変更する必要があります。
例: https://abc.com

ウェブに表示するダッシュボードの埋め込みリンクを取得したい場合は、次の手順を実行します。

<?php
$quickSight = new QuickSight();
$embedUrl = $quickSight->getEmbedUrl($dashboardId);

実行が成功した場合の $embedUrl の値は次のようになります。
https://ap-northeast-1.quicksight.aws.amazon.com/embed/xxxxxx&amp;identityprovider=quicksight&amp;isauthcode=true

次のようにiframe$embedUrlを挿入する必要があります。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Quicksight Demo</title>
</head>
<body>
  <iframe src="<?php echo $embedUrl ?>"></iframe>
</body>
</html>


結果が来ました。

ローカル環境でダッシュボードが正常に表示されました。
もし何か問題がございましたら、お手数ですがコメント欄にご記入いただければ幸いです。