S3 Tablesを利用するAWSアーキテクチャ構築：QuickSight


# はじめに
本記事は、以下記事の続きです。

https://qiita.com/tamabe/items/1c35ced1fee7bad9dc6e

今回は、S3テーブルバケット内のテーブルのデータを、
QuickSightのデータセットとして利用するまでの設定を行っていきます。

以下AWS公式記事の手順を参考にしています。

https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-quicksight.html


# 構成図
最終的な構成図は以下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/098c84ae-c28d-f79d-3915-34f3715b51b4.png)

本記事では **QuickSightから(Athena経由で)S3 Tablesにデータセット接続する** 部分を実装します。



# 実装手順
以下ステップで実装していきます。
ステップ3～5では、権限管理でLake Formationも出てきます。
本記事では **5. QuickSightからデータセット接続** のステップを行っていきます。

1. [S3テーブルバケットを作成](https://qiita.com/tamabe/items/8c459d2434f20191ac3e)
1. [EMRからスキーマ作成](https://qiita.com/tamabe/items/533d1b812de4adf4ec89)
2. [Firehoseからデータ送信](https://qiita.com/tamabe/items/d590444037e6d29f836e)
2. [Athenaからクエリ実行](https://qiita.com/tamabe/items/1c35ced1fee7bad9dc6e)
2. [QuickSightからデータセット接続](https://qiita.com/tamabe/items/1c7e299c13e92a3a61d8)




# QuickSightからデータセット接続てじゅｎ
以下ステップで行います。

1. [QuickSightにサインアップ](#quicksightにサインアップ)
1. [QuickSightIAMロール ポリシー設定](#quicksight用iamロール-ポリシー設定)
1. [Lake Formationから権限設定](#lake-formationから権限設定)
1. [QuickSightデータセット作成](#quicksightデータセット作成)
2. [QuickSightダッシュボード作成](#quicksightデータセット作成)
2. [QuickSightアカウントのクリーンアップ](#quicksightアカウントのクリーンアップ)

# QuickSightにサインアップ
まず、QuickSightへのサインアップを行います[^14]。

コンソール操作：
AWSコンソール検索画面から「QuickSight」をクリック → 「QuickSightにサインアップ」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/d03118db-bc74-79d6-cc17-39286690d2e2.png)

以下の通り設定し、「完了」をクリック。
※赤枠以外はデフォルトのままです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/a784bbfd-841f-d5be-0f49-da3d75619ba7.png)

アカウント作成が完了すると、以下画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/4d2e047a-a399-bf6e-9261-dbb83b79c857.png)



# QuickSightIAMロール ポリシー設定
次に、QuickSight用のAWSデフォルトロール(`aws-quicksight-service-role-v0`)に、ポリシーを追加します。

コンソール操作：
「IAMコンソール」 → 「ロール」 → 「aws-quicksight-service-role-v0 」詳細画面
「許可を追加」→ 「インラインポリシーを作成」 → 「ポリシーエディタ: JSON」

以下JSONを貼り付けます。
```json:QuickSight用ロールにインラインポリシー追加
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": "glue:GetCatalog",
      "Resource": "*"
    }
  ]
} 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/3626c9c3-66b0-36af-36c4-8612971ee74b.png)


任意のポリシー名を設定し、ポリシーを作成(ロールを更新)します。





# Lake Formationから権限設定
Lake Formationで、S3テーブルバケット内のテーブルへの権限を付与します。


## QuickSight管理者ユーザーを確認
続いて、設定されているQuickSight管理者ユーザーを確認します。
以下AWS CLIコマンド実行結果から確認します。

```cli:QuickSight管理者ユーザー確認コマンド
aws quicksight list-users --aws-account-id <アカウントID> --namespace default --region ap-northeast-1
```

以下のような出力が出てくるので、
QuickSight管理者ユーザー(`"Role": "ADMIN"`)の`Arn`の値をメモしておきます。
※この後Lake Formationにて、そのユーザーへの権限を付与していきます。

```json:出力結果
{
    "UserList": [
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:<アカウントID>:user/default/<IAMユーザー名>",
            "UserName": "<IAMユーザー名>",
            "Email": "<設定したQuickSight用メールアドレス>",
            "Role": "ADMIN",
            "IdentityType": "IAM",
            "Active": true,
            "PrincipalId": "federated/iam/<ID情報>"
        }
    ],
    "Status": 200,
    "RequestId": "<リクエストID>"
}
```


## Lake Formationからテーブル権限付与
確認した`Arn`に対して、Lake Formation経由でS3テーブルバケット内のテーブルへの権限を付与します。

以下の通り設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/5c72c7f2-24b2-d937-864e-d04938db1139.png)





# QuickSightデータセット作成
QuickSight アカウントにサインインします。

QuickSightダッシュボード操作：
「新しい分析」 → 「新しいデータセット」 → 「Athena」を選択

以下の通り、任意のデータセット名を設定し、「データソースを作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/65cf1290-6f28-f414-bbfa-d913f7ceabbd.png)


「カスタム SQL の使用」をクリックし、
以下の通り、カスタムSQLを設定します。
```sql:カスタムSQL
SELECT * FROM "s3tablescatalog/<S3テーブルバケット名>".<S3テーブルバケットの名前空間>.<S3テーブルバケットのテーブル>
```

データセット作成が完了したら、以下画面が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/e644311e-5f1b-1741-e8ab-a7895444e90e.png)


# QuickSightダッシュボード作成
データセット作成が完了したら、続けてダッシュボードを作成してみます。
今回はシンプルなテーブルを表示してみます。

以下の通り、
「データクエリを直接実行」を選択し、「Visualize」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/36d56c31-23ac-bd17-d9f9-cab302311754.png)


 - ビジュアルタイプ: テーブル
 - ディメンションフィールド: id, name, value 
※[EMR実装記事](https://qiita.com/tamabe/items/533d1b812de4adf4ec89)にて定義したフィールド

以下のように、S3テーブルバケットのテーブル内の値が確認できました。
※[DataFirehose実装記事](https://qiita.com/tamabe/items/d590444037e6d29f836e)にて格納したデータ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/73767683-a734-6d65-0717-558f708890a0.png)


# QuickSightアカウントのクリーンアップ
QuickSightアカウントは、ユーザーあたりの課金が発生する[^15]ので、
不要な場合はサブスクリプション削除/アカウント閉鎖[^16]を行います。

QuickSightダッシュボード操作：
右上ユーザーアイコン → QuickSightを管理 → アカウント設定 → アカウントの終了 管理

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/24b7a772-3f8b-e813-4a23-163f3c7835fd.png)


アカウントの終了保護: off → 「確認」と入力 → 「アカウントを削除」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/3902bfb8-4131-f166-2321-3b3cce2059b3.png)


サブスクライブ解除成功すると、以下が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/b9c03926-6f14-532e-12e7-66a3abd6f1db.png)




# 最後に
S3テーブルバケット内テーブルのデータを、
QuickSightダッシュボードで表示するところまでを確認しました。
お疲れさまでした。




# 参考URL
この記事で参考にしたURLです。
[^16]:AWS記事：Amazon QuickSight サブスクリプションの削除とアカウントの閉鎖
https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/closing-account.html

[^15]:AWS記事：Amazon クイックサイトの価格
https://aws.amazon.com/jp/quicksight/pricing/

[^14]:AWS記事：Signing up for an Amazon QuickSight subscription
https://docs.aws.amazon.com/quicksight/latest/user/signing-up.html

[^13]:AWS記事：Route incoming records to a single Iceberg table
https://docs.aws.amazon.com/firehose/latest/dev/apache-iceberg-format-input-record.html

[^12]:AWS記事：Grant Lake Formation permissions on your table resources
https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html#grant-permissions-tables

[^1]:AWS記事：Amazon S3 table bucket, table, and namespace naming rules
https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets-naming.html

[^2]:AWS CLI Command Reference：s3tables
https://docs.aws.amazon.com/cli/latest/reference/s3tables/

[^3]:AWS記事：Accessing Amazon S3 tables with Amazon EMR
https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-emr.html

[^4]:AWS記事：Querying Amazon S3 tables with Apache Spark
https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-open-source-spark.html

[^5]:AWS記事：Streaming data to tables with Amazon Data Firehose
https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-firehose.html

[^6]:AWS記事：Register S3 table bucket catalogs in Athena
https://docs.aws.amazon.com/athena/latest/ug/gdc-register-s3-table-bucket-cat.html

[^7]:AWS記事：Visualizing table data with Amazon QuickSight
https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-quicksight.html

[^8]:AWS記事：Using Amazon S3 Tables with AWS analytics services #Grant Lake Formation permissions on your table resources
https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html#grant-permissions-tables

[^9]:AWS記事：Using Amazon S3 Tables with AWS analytics services
https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html

[^10]:AWS記事：Use an Iceberg cluster with Spark
https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-iceberg-use-spark-cluster.html#emr-iceberg-create-cluster

[^11]:AWS記事：Connect to the Amazon EMR cluster primary node using SSH
https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html