QuickSightからAthenaにつなごうとしてもデータベースがリストに出てこない

# はじめに
データを可視化しようとしてQuickSightからAthenaのテーブルを参照しようとしたときに、
まずはそのデータセットを作成します。
データセットの作成時にデータベースを選択するのですが、
データベースの候補として目的のAthenaデータベースがリストに出てこず、
困ってしまいました。

Athenaのコンソール上にはもちろん存在しているのを確認しました。
AthenaのリージョンとQuickSightのリージョンも一致しているのを確認しました。
QuickSightの管理画面でAthenaを許可しているのも確認しました。
[Amazon QuickSight で Athena を使用するときに発生する問題のトラブルシューティング](https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/troubleshoot-athena.html)を見てもそれっぽいものが見当たりません。

色々調べた結果、目的のデータベースを選択してデータセットを作成できるようになったので、
同じ現象で困った方のために解決方法を残しておきます。

# 原因
**LakeFormationでの権限が与えられていないから** です。

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/lake-formation.html

QuickSightが内部で使うロールと、
QuickSight内で管理されている自分自身のIAMユーザ/グループ
の両方に許可を与える必要があります。

AWSにログインしている状態からQuickSightの画面に行くと
シームレスにつながっているので普段の作業中は意識をしていないですが、
**AWS上でのIAMユーザとQuickSight内で管理されているIAMユーザとは別物**なので、
別途権限を与える必要があります。
（私はこのことが理解できてなくて、しばらくハマってました）

なお、この現象はQuickSightのEnterprise Editionでのみ発生するようです。


# 解決方法
原因のところに書いたようにLake Formationにて権限を与えます。

Lake Formationを開きます。
Data catalog > Databases から目的のデータベースを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436247/a0c59130-34aa-bd5d-7ba4-ac564b09f441.png)

Actions > View permissoins
現在付与されている権限が出てきます。
付与されているべき権限が与えられていない場合はそれぞれ付与していきます。

## QuickSightのロールへの権限付与
QuickSightが内部的に使っているRole
　`aws-quicksight-service-role-v0`
　`aws-quicksight-s3-consumers-role-v0`
に権限を与えます。

### データベースへの付与
目的のデータベースを開いた画面から、
Actions > Grant でGrant data permissions の画面を開きます。

* Principals  
IAM users and roles を選択し、IAM users and rolesから  
`aws-quicksight-service-role-v0`  
`aws-quicksight-s3-consumers-role-v0`  
を選択します。
* LF-Tags or catalog resources  
Named data catalog resourcesを選択します。  
Databases : 目的のデータベースが選択済みなのでそのままにしておきます。
* Database permissions  
QuickSightからは表示させるだけなので、  
Database permissions に `Describe`を与えておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436247/770e23f5-e6e0-71bd-6e8a-f2dd93621942.png)

これらを入力したらGrantボタンを押下します。

### テーブルへの付与
先程と同じくGrant data permissions の画面を開きます。

* Principals  
先程と同じようにIAM users and roles を選択し、IAM users and rolesから  
`aws-quicksight-service-role-v0`  
`aws-quicksight-s3-consumers-role-v0`  
を選択します。
* LF-Tags or catalog resources  
Named data catalog resourcesを選択します。  
Databases : 目的のデータベースが選択済みなのでそのままにしておきます。  
Tables : `All tables` を選択します。
* Table permissions  
Table permission : `Select` `Describe` にチェックをつけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436247/16443712-6086-e626-fbf0-b02c12093b6e.png)

これらを入力したらGrantボタンを押下します。

## QuickSight管理のIAMユーザへの権限付与
### ユーザのarnの調査
付与するにあたりIAMユーザのarnを知っておく必要があります。
画面上では調べることができないのでCLIで調べます。
CloudShellなどで以下のコマンドを発行します。

`aws quicksight list-users --aws-account-id アカウントID --namespace ネームスペース`

発行すると対象となるユーザのarnが得られるのでメモっておきます。

```
[cloudshell-user@ip-999-999-999-999 ~]$ aws quicksight list-users --aws-account-id 999999999999 --namespace default
{
    "Status": 200,
    "UserList": [
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:999999999999:user/default/user1",
            "UserName": "user1",
            "Email": "user1@example.com",
            "Role": "ADMIN",
            "IdentityType": "IAM",
            "Active": true,
            "PrincipalId": "federated/iam/AAAAAAAAAAAAAAAAAAAAA"
        },
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:999999999999:user/default/user2",
            "UserName": "user2",
            "Email": "user2@example.com",
            "Role": "ADMIN",
            "IdentityType": "IAM",
            "Active": true,
            "PrincipalId": "federated/iam/BBBBBBBBBBBBBBBBBBBBB"
        },
～略～
```

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/list-users.html

QuickSightのグループに対して付与することもできます。
グループに付与する場合は
`aws quicksight list-groups --aws-account-id アカウントID --namespace ネームスペース`
でグループのarnをメモっておきましょう。

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/list-groups.html

### データベース、テーブルへの付与
Roleに与えた時と同様にGrant data permissions の画面を開きます。

* Principals  
`SAML users and groups`を選択し、先ほど調べたarnを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436247/25b8d8ee-122d-6548-d076-cafedc3e3bd0.png)

後はRoleに与えた時と同様にデータベース、テーブルそれぞれに設定してGrantします。

# おわりに

もし同じ症状で悩んでいる方のお役に立てれば幸いです。