QuickSight ネームスペース(マルチテナンシー)

# QuickSightのネームスペースとは

ネームスペースを複数作ることでQuickSight上の最上位の空間を分割することができます。
例えばSaaS事業者の方がお客様である会社A、会社Bごとにネームスペース(空間)を分けて様々な干渉を無くすことができます。いわゆるマルチテナンシーの機能になります。わかりやすくスッキリしてマルチテナンシーできますね。

### aws cli v2を最新にする

まずは新しい機能が使えるようにaws cliをアップデートしておく。今回はaws cli v2を使っています。
Macにインストールの場合、手順は公式通り以下を実施します。これによって20200724段階での最新(?)のv2.0.34となりました。

```bash
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg ./AWSCLIV2.pkg -target /
```

バージョンの確認

```bash
aws --version
aws-cli/2.0.34 Python/3.7.4 Darwin/18.7.0 botocore/2.0.0dev38
```

# ネームスペース確認

ここからが本題です。QuickSightには実は元々DefaultのみでしたがNameSpaceという表記(概念)がされていました。手元の環境で新しいAPIのlist-namespacesをしてみます。以下のように既存の環境にはnamespace/defaultとなっているように、defaultという名前のネームスペースになっています。

```bash
aws quicksight list-namespaces --aws-account-id xxxxxxxxxxxx
{
    "Status": 200,
    "Namespaces": [
        {
            "Name": "default",
            "Arn": "arn:aws:quicksight:us-east-1:xxxxxxxxxxxx:namespace/default",
            "CapacityRegion": "us-east-1",
            "CreationStatus": "CREATED",
            "IdentityStore": "QUICKSIGHT"
        }
    ],
    "RequestId": "9b2a27f8-0515-4a0f-93db-275beea8731b"
}
```

describe-namespaceで確認

```bash
aws quicksight describe-namespace --aws-account-id xxxxxxxxxxxx --namespace default
{
    "Status": 200,
    "Namespace": {
        "Name": "default",
        "Arn": "arn:aws:quicksight:us-east-1:xxxxxxxxxxxx:namespace/default",
        "CapacityRegion": "us-east-1",
        "CreationStatus": "CREATED",
        "IdentityStore": "QUICKSIGHT"
    },
    "RequestId": "6f4ace7d-4465-410d-b8ad-5da6552cebc5"
}
```

## 新しいネームスペース作成

新しくcompany-aという名前のネームスペースを作成します。SaaS事業者からしてお客様となる会社(company-a)様と思ってください。お客さんが増えていけばこの単位で増やしていけばしっかりアイソレーションできます。

```bash
aws quicksight create-namespace  --aws-account-id xxxxxxxxxxxx --namespace company-a --identity-store QUICKSIGHT
{
    "Status": 202,
    "Name": "company-a",
    "CapacityRegion": "us-east-1",
    "CreationStatus": "CREATING",
    "IdentityStore": "QUICKSIGHT",
    "RequestId": "1b23f19f-d7f6-4626-ab13-ddba7db43ceb"
}
```

## 新しいネームスペースの確認(list, describe)

company-aのネームスペースが出来ていることが確認できます。

```bash
aws quicksight list-namespaces --aws-account-id xxxxxxxxxxxx
{
    "Status": 200,
    "Namespaces": [
        {
            "Name": "company-a",
            "Arn": "arn:aws:quicksight:us-east-1:xxxxxxxxxxxx:namespace/company-a",
            "CapacityRegion": "us-east-1",
            "CreationStatus": "CREATED",
            "IdentityStore": "QUICKSIGHT"
        },
        {
            "Name": "default",
            "Arn": "arn:aws:quicksight:us-east-1:xxxxxxxxxxxx:namespace/default",
            "CapacityRegion": "us-east-1",
            "CreationStatus": "CREATED",
            "IdentityStore": "QUICKSIGHT"
        }
    ],
    "RequestId": "99536eb6-8ea8-46e6-abc1-ad241fd57f53"
}
```

```bash
aws quicksight describe-namespace --aws-account-id xxxxxxxxxxxx --namespace company-a
{
    "Status": 200,
    "Namespace": {
        "Name": "company-a",
        "Arn": "arn:aws:quicksight:us-east-1:xxxxxxxxxxxx:namespace/company-a",
        "CapacityRegion": "us-east-1",
        "CreationStatus": "CREATED",
        "IdentityStore": "QUICKSIGHT"
    },
    "RequestId": "6928b871-5c8c-4a1d-8ff2-c318d63c2919"
}
```

## company-aのネームスペースにユーザー追加

以下のファイル作成します。これを読み込みregister-userでユーザーを作成します。
ここでネームスペースにcompany-aを指定しています。comnpany-aのネームスペースにユーザーが作成され、既存のdefaultのネームスペースにはなんら操作は出来ないユーザーです。company-aの会社にも管理者(ADMIN)、グラフを作る人(AUTHOR)、グラフを見る人(READER)がいると思うのでそれぞれ作れます。今回はまず管理者(ADMIN)を作ります。

```bash
vim register-reader1.json 
```

```json
{
   "IdentityType": "QUICKSIGHT",
   "Email": "xxxx@gmail.com",
   "UserRole": "ADMIN",
   "AwsAccountId": "xxxxxxxxxxxx",
   "Namespace":"company-a",
   "UserName": "kimura"
}
```

register-userで実際にユーザー作成
ここではkimuraというユーザーを作成しています。company-aの会社の管理者となるkimuraさんと思ってもらえたらと。

```bash
aws quicksight register-user --cli-input-json file://register-reader1.json
{
    "Status": 201,
    "User": {
        "Arn": "arn:aws:quicksight:us-east-1:xxxxxxxxxxxx:user/company-a/kimura",
        "UserName": "kimura",
        "Email": "xxxx@gmail.com",
        "Role": "ADMIN",
        "Active": false,
        "PrincipalId": "user/d-90677c1ab6/d17bed3d-e17e-4474-b9b3-0994713217c6"
    },
    "UserInvitationUrl": "https://signin.aws.amazon.com/inviteuser?token=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
    "RequestId": "f1606c12-1cfb-4d87-8177-6b26c516d813"
}
```

セキュリティ上、kimuraさんはこの登録を自身で承認しパスワード登録しなければいけません。
このUserInvitationURLをブラウザで開くとサインアップ画面です。パスワードを設定し登録します。

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/bc0ba888-ffb3-1035-834d-1d3f2ce62619.png)

登録したkimuraでサインインします。

![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/05744df6-f099-17db-a42b-fb211c70e47d.png)

サインインし、QuickSightの初期画面が表示されます。画面キャプチャを取り忘れましたが普通に分析(グラフやダッシュボード)を作れました。

![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/aa608e31-0e58-b46a-381e-e47dda601a09.png)

右上のユーザー名のアイコンをクリックし、"QuickSightの管理"をクリックするとQuickSightの管理画面になります。この画面の左上のアカウント名が"compay-a"となっています。これがネームスペースっぽいですね。

![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/ac568c4b-1477-92ab-9180-6720ed99b1ab.png)

ちなみにdefault(元からあるネームスペース)のQuickSightの画面を確認すると、company-aで作成した分析やデータセットは見えていません。company-aで作った画面をキャプチャ取り忘れて確認をお見せできてないですが、しっかりアイソレーションされてます。

<img width="1266" alt="スクリーンショット 0002-07-24 20.34.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/9ca575d4-a827-e670-c21e-affc16c51e0d.png">

GUIで出来たらいいよねこれ

## 参考資料

Supporting Multitenancy with Isolated Namespaces

https://docs.aws.amazon.com/quicksight/latest/user/namespaces.html?icmpid=docs_quicksight_console_rssdochistory

QuickSight API create namespace

https://docs.aws.amazon.com/quicksight/latest/APIReference/API_CreateNamespace.html

AWS CLI QuickSight

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/quicksight/index.html#cli-aws-quicksight