【アップデート】QuickSight でデータソースにIAMロールを紐づけてアクセス制御する

# はじめに
こんにちは。株式会社ジールの[@yakisobapan](https://qiita.com/yakisobapan)です。

Amazon QuickSightにて、IAMを使用したアクセス制御に関するアップデートがありましたので、試してみました。

# 目次
 - アップデート内容
 - アーキテクチャ
 - やってみた（S3）
 - 所感


# アップデート内容

QuickSight内の個々のS3データソースに対して、IAMロールをアタッチできるようになり、データソースごとに緻密なアクセス制御が可能となりました。

>Amazon QuickSight を使用すると、Amazon S3 と Athena に接続するデータソースへのロールベースのアクセスコントロールが可能になります
（2023/02/23 What's New with AWS?より）

https://aws.amazon.com/jp/about-aws/whats-new/2023/02/amazon-quicksight-role-based-access-control-data-sources-s3-athena/


# アーキテクチャ
簡単に、以下のような構成です。
オレンジのルートが今回のアップデート箇所です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/8761d88c-73e3-7c65-d51e-603c69beb2a5.png)

# やってみた（S3）

凡例）・サービス名｜やること


**①QuickSightからS3へのアクセスを制限**

- IAM｜IAMポリシーの作成
下記ポリシーを設定して、全面的なS3へのアクションを拒否します。

```.tsx:S3_access_deny
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Deny",
            "Action": "s3:*",
            "Resource": "*"
        }
    ]
}
```

- QuickSight｜作成したポリシーを適用
作成した拒否ポリシー（S3_access_deny）をQuickSightへアタッチします。

　QuickSightの管理>
　セキュリティとアクセス権限>
　個々のユーザーとグループのリソースへのアクセス>
　IAM ポリシーの割り当て - 新しい割り当ての追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/67717bd5-753d-9eaf-c11f-84855006f6b1.png)

- QuickSight｜ポリシーが働いていることを確認
S3をソースとしたデータソースの作成が、IAMポリシーで拒否されていることが確認できます。[^1]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/b88705a1-2cbd-13c9-4758-e8728be3091e.png)

先ほど設定したIAMポリシーは、QuickSightアカウント全体へ有効ですので
QuickSight→S3へのアクションは全ユーザーNGとなります。
<br/>
<br/>
**②S3へアクセス許可されたIAMロールの作成**

- IAM｜IAMポリシーの作成
下記ポリシーを設定して、S3へのアクションを許可します。

```.tsx:S3_access_allow
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::BUCKETNAME"
        },
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::BUCKETNAME/FOLDERNAME/manifest.json"
        },
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::BUCKETNAME/FOLDERNAME/test_data.csv"
        }
    ]
}
```

| アクション | 説明                                            |
| :------: | :----------------------------------------------------- |
| GetObject | Amazon S3 からオブジェクトを取得するためのアクセス許可を付与|
| ListBucket | 	Amazon S3 バケット内のオブジェクトの一部またはすべてを一覧表示するアクセス許可を付与      |

下記を許可しています。
・QuickSightへインポートしたいcsvファイルの取得
・データソースを作成するためのマニュフェストファイルの取得
・ファイルが配置されているバケットの参照


- IAM｜IAMロールの作成
作成した許可ポリシーをIAMロールに割り当てます。

IAMロール作成時に、”カスタム信頼ポリシー”を選択し、
QuickSightでアクションが行えるように設定します。

次ページの許可ポリシーの設定で、前段で作成したポリシー（S3_access_allow）を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/81b10ab5-0d01-f054-10fd-1c9794c31201.png)


```.tsx:カスタム信頼ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "quicksight.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```
<br/>
<br/>

**③データソースを作成**

- CLI｜データソースを作成
②で作成したIAMロールを使用して、CLIを使ってデータソースを作成します。

```.tsx:create-data-source
[cloudshell-user@ip-11-22-33-44 ~]$ aws quicksight create-data-source --aws-account-id ACCOUNTID --region ap-northeast-1 \
>     --endpoint https://quicksight.ap-northeast-1.amazonaws.com \
>     --data-source-id "datasource_s3_with_role" \
>     --cli-input-json '{
>         "Name": "S3 with a custom Role",
>         "Type": "S3",
>         "DataSourceParameters": {
>             "S3Parameters": {
>                 "RoleArn": "arn:aws:iam::ACCOUNTID:role/S3_Access_Allow_Role_v2",
>                 "ManifestFileLocation": {
>                     "Bucket": "BUCKETNAME", 
>                     "Key": "FOLDERNAME/manifest.json"
>                 }
>             }
>         }
>     }'
{
    "Status": 202,
    "Arn": "arn:aws:quicksight:ap-northeast-1:ACCOUNTID:datasource/datasource_s3_with_role",
    "DataSourceId": "datasource_s3_with_role",
    "CreationStatus": "CREATION_IN_PROGRESS",
    "RequestId": "abcdefg-1111-2222-3333-hijklmnop"
}
```


- CLI｜作成したデータソースに適切な権限を付与

データソースを作成しただけですと、コンソール上で表示されない[^2]ので、
CLIを使用して、対象QuickSightユーザーに対して、適切な権限を与えます。

＜付与権限＞
| アクション | 説明                                            |
| :------: | :----------------------------------------------------- |
| UpdateDataSourcePermissions | データソースのリソースポリシーを更新するアクセス許可を付与|
| DescribeDataSource | 	データソースを記述するアクセス許可を付与      |
DescribeDataSourcePermissions| データソースのリソースポリシーを記述するアクセス許可を付与 |
PassDataSource| データセットのデータソースを使用するアクセス許可を付与   |
UpdateDataSource| データソースを更新するアクセス許可を付与             |
DeleteDataSource| データソースを削除するアクセス許可を付与             |

```.tsx:update-data-source-permissions
[cloudshell-user@ip-11-22-33-44 ~]$ aws quicksight update-data-source-permissions --aws-account-id ACCOUNTID \
>       --data-source-id datasource_s3_with_role \
>       --grant-permissions '{
>           "Principal": "arn:aws:quicksight:ap-northeast-1:ACCOUNTID:user/default/QS_USERNAME",
>           "Actions": [
>             "quicksight:UpdateDataSourcePermissions",
>             "quicksight:DescribeDataSource",
>             "quicksight:DescribeDataSourcePermissions",
>             "quicksight:PassDataSource",
>             "quicksight:UpdateDataSource",
>             "quicksight:DeleteDataSource"
>           ]
>         }'
{
    "Status": 200,
    "DataSourceArn": "arn:aws:quicksight:ap-northeast-1:ACCOUNTID:datasource/datasource_s3_with_role",
    "DataSourceId": "datasource_s3_with_role",
    "RequestId": "abcdefg-4444-5555-6666-hijklmnop"
}
```

- QuickSight｜データソースの確認
CLIで作成したデータソース"S3 with a custom Role"が存在することを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/db1b5bae-2872-07e2-6981-15ed8b9afc50.png)

データソースの編集を確認すると、ロールが紐づいていることがわかります。
このIAMロールでS3のアクション許可がされているため、データソース作成が行えています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/e35390bb-ac14-15dd-d6b6-51115d10304e.png)

S3に格納されているファイルがインポートされ、表示できています。
*QuickSightで表示しているデータはテストデータです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/8c167c2d-abad-1615-63f9-9b59386510f0.png)

# 所感

下記の条件に該当する場合に、使えそうだなと感じました。
・QuickSightアカウント全体として、S3リソースへのアクセスが制限されている
・特定のユーザーにのみ、S3データソースの作成が実行できるようにしたい

今後、他のデータソースに対しても同様のアップデートを心待ちにしています。

# 参考

https://docs.aws.amazon.com/quicksight/latest/user/datasource-run-as-role.html#datasource-run-as-role-s3

https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazons3.html

https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazonquicksight.html


[^1]: S3への接続について
QuickSightの管理>セキュリティとアクセス権限>QuickSight の AWS のサービスへのアクセスより
S3リソースのアクセス許可（バケット単位）を事前に行う必要があります。
上記を実施しないと、ポリシーで制限をかける前からS3の参照はNGとなります。

[^2]: CLIを用いたデータソースの作成
内部的には作成されています。
***
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area