IBM Cloud：App IDにおけるユーザー数の確認方法

# はじめに
IBM CloudのApp IDは、IBM CloudポータルのIdPになることが可能であり、かつSAMLのSPになることができます。一方で、App IDはユーザー数の比例した課金項目があるため、SAMLを用いたユーザー数が増加した場合に意図せず課金請求が増額してしまうということが起こりえます。
本記事ではApp IDのユーザー数を取得する方法をGUIとCLIの2種類を記載します。

:::note warn
- 実際に課金されるユーザー数とは異なる可能性があります。正確な課金項目の内容については、IBM Cloudポータル内の[「請求と使用量」](https://cloud.ibm.com/billing)より確認ください
- GUIとCLIではUser Profileの出力が異なります
:::

# IBM Cloudポータルから確認
## Cloud Directoryの場合
左タブより「**Cloud Directory**」→「**Users**」を選択すると、ユーザーリスト上部に「**Total numbers of Cloud Directory users**」が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/dcc006d6-35d9-a42e-baf4-95b59bccbcf5.png)

## 全ユーザーを確認する場合
左タブより「**Profiles and roles**」→「**User Profiles**」を選択すると、ユーザーリスト上部に「**Total numbers of profiles**」が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/4add39b8-b5e5-b7d3-956d-b185116a5d09.png)


# APIを用いたユーザー情報取得

:::note warn
APIの応答結果はjson形式がコマンドラインへ出力されます。
件数が多いと予想される場合は、出力をファイルへリダイレクトしてください。
:::
## Cloud Directoryの場合
以下のdocsに従います。
IBM Cloud docs：[すべてのユーザーのエクスポート](https://cloud.ibm.com/docs/appid?topic=appid-cd-users&locale=ja&interface=ui#cd-export-all)
ibmcloud CLIにてログインします。
```
$ ibmcloud login --sso
API endpoint: https://cloud.ibm.com
Authenticating...
OK

Targeted resource group Common
Targeted region jp-tok

API endpoint:      https://cloud.ibm.com
Region:            jp-tok
User:              xxx.xxx@xxx.com
Account:           IBM
Resource group:    Common
CF API endpoint:
Org:
Space:
```

API実行で使用するAPI Tokenを取得します。
```
$ ibmcloud iam oauth-tokens
IAM token:  Bearer xxxxx...
```

APIにてユーザーリスト作成のリクエストを実行します。
- tenantID
    - サービスのテナント ID はサービス資格情報の中に記載
- encryptionSecret
    - ハッシュ処理されたユーザーのパスワードの暗号化と復号のために使用する文字列。16文字以上で指定。`import/all` API を使用するために必要な暗号化秘密鍵を保持します
- emailAddress
    - エクスポートの準備ができたとき、または要求が失敗した場合にメールが送信されるメール・アドレス

```
$ curl -X POST 'https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/cloud_directory/export/all' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <IAMToken>' \
--data-raw '{"encryptionSecret" : "<encryptionSecret>",  
"emailAddress" : "xxx@example.com"}'
```

必要に応じて、要求の状況を取得します。
```
curl -X GET 'https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/cloud_directory/export/status?id=<id>' --header 'Accept: application/json'    --header 'Content-Type: application/json'    --header 'Authorization: Bearer <IAMToken>'
```

エクスポートの準備ができたら、または要求が失敗すると、指定したメール・アドレスにメールが送信されます。ダウンロードするには、 [export/download](https://us-south.appid.cloud.ibm.com/swagger-ui/#/Management%20API%20-%20Cloud%20Directory%20Users/mgmt.cloudDirectoryDownloadExport) APIを使用します。


```
$ curl -X GET 'https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/cloud_directory/export/download?id=<id>' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <IAMToken>' \
> output.json

$ vim output.json
[{"scimUser":{"originalId":"xxx","userName":"xxx","name":{"givenName":"xxx","familyName":"xxx...
```


## Cloud Directory以外の場合
GUIと異なり、全ユーザーは出力されず、Cloud Directory以外のユーザーが出力されます。

以下のdocsに従います。
IBM Cloud docs：[ユーザー・プロファイルのエクスポート](https://cloud.ibm.com/docs/appid?topic=appid-user-admin&interface=api#exporting-profiles)

以下のAPIでエクスポートを実行します。
```
$ curl -X GET https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/users/export \
--header "Accept: application/json" \
--header "Authorization: Bearer <IAMToken>" \
> output2.json

$ vim output2.json
// 先頭でトータルユーザー数が確認
{'totalResults': 2, 'itemsPerPage': 2, 'requestOptions': {}, 'users': [{'id':...
```