どうもこんにちは。ブリスウェルの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&identityprovider=quicksight&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>
結果が来ました。
ローカル環境でダッシュボードが正常に表示されました。
もし何か問題がございましたら、お手数ですがコメント欄にご記入いただければ幸いです。