IBM Cloud のリソースインスタンスを誰がいつ作ったか一覧にする

IBM Cloud をみんなで使っていると、特にテスト環境では誰がいつ作ったのかわからない状態になったりします。
ポータルのリソース一覧では簡単には判断できません。
ルールやタグ付けで対応したりするのですが限界があります、

今回、誰がいつ作ったか知りたい、自分のリソースの削除漏れが無いか知りたいという状況になったので、その取得方法を考えます。
なお、対象は IAM の対象になっているリソースで、クラッシック・インフラには対応できていません。

## API キーの作成

API のアクセストークンを生成するために API キーを作成します。
これは、ポータルから作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/374eeaf6-6e35-9806-ebab-d29357e99f71.png)

また。IBM Cloud CLI で作成することもできます。

```
ibmcloud iam api-key-create myapikey -d "API key for Test"
```

作成した API キーを変数「API_KEY」にセットします。

```
API_KEY=XXXXXXXXXXXXXXXXXXXXXXX
```

## アクセストークンの生成

API 利用の認証にはアクセストークンを利用します。
API キーからアクセストークンを生成します。

手順は「[API キーを使用した IBM Cloud IAM トークンの生成](https://cloud.ibm.com/docs/account?topic=account-iamtoken_from_apikey&interface=api)」に記載されています。

アクセストークンを変数「TOKEN」にセットします。

```
TOKEN=`curl -X POST 'https://iam.cloud.ibm.com/identity/token' -H 'Content-Type: application/x-www-form-urlencoded' -d "grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=$API_KEY" | jq .access_token | tr -d '"'`
```

## Get a list of all resource instances でリソース一覧を取得する

「[Get a list of all resource instances](https://cloud.ibm.com/apidocs/resource-controller/resource-controller#list-resource-instances)」 を利用してリソースの一覧を取得します。


資源の一覧は、.resources[] で取得できます。

```
curl -X GET https://resource-controller.cloud.ibm.com/v2/resource_instances \ 
 -H "Authorization: Bearer $TOKEN" | jq .resources[]
```

今回は、その中から下記を取得しましょう。

| 属性 | 説明 |
|:-:|:-:|
| type       | The type of the instance, for example, service_instance. |
| name       | The human-readable name of the instance.  |
| region_id  | The deployment location where the instance was provisioned.  |
| created_by | The subject who created the instance.  |
| created_at | The date when the instance was created. |


項目を選択し、resouces.csv にリダイレクトします。

```
curl -X GET https://resource-controller.cloud.ibm.com/v2/resource_instances \
 -H "Authorization: Bearer $TOKEN" | \
 jq  -r '.resources[] | .type  + " , " + .name + " , " +  .region_id + " , " + .created_by + " , " + .created_at ' \
 > resouces.csv
```

resouces.csv は。このような内容が記録されます。

```
resource_instance , onoda-pub-key , jp-tok , IBMid-XXXXXXXXXX , 2022-01-05T08:58:31Z
service_instance , Onoda-PowerVS-TOK04 , tok04 , IBMid-XXXXXXXX , 2022-06-01T08:52:40.631732188Z
```


ここで、注意が必要なのが「[Get a list of all resource instances](https://cloud.ibm.com/apidocs/resource-controller/resource-controller#list-resource-instances)」が返す next_url です。

| 属性 | 説明 |
|:-:|:-:|
| next_url  | The URL for requesting the next page of results. |


「[Get a list of all resource instances](https://cloud.ibm.com/apidocs/resource-controller/resource-controller#list-resource-instances)」は、データを全件返すわけではありません。
パラメータ limit で何件データを取得するか指定します。デフォルトは 上限の 100 件です。それ以上指定しても、意味がありません。
(100 が設定されていても実際に返ってくるのは 94件でした。実際にに返された件数は「rows_count」で確認できます。一定以上の件数を指定すると「limit - 6」件になるようです)

| パラメータ | 説明 |
|:-:|:-|
| limit | The number of results to be returned. <br> Possible values: value ≤ 100 <br> Default: 100 |

未取得のデータがある場合、next_url に URL が返されます。
ここにに対してリクエストすると、次のデータが取得できます。

next_url を変数「NEXT_URL」にセットします。

```
NEXT_URL=`curl -X GET https://resource-controller.cloud.ibm.com/v2/resource_instances  -H "Authorization: Bearer $TOKEN" | jq .next_url | tr -d '"'`
```

宛先 URL に NEXT_URL を追加し、resouces.csv に追加リダイレクトします。

```
curl -X GET https://resource-controller.cloud.ibm.com$NEXT_URL \
 -H "Authorization: Bearer $TOKEN" | \
 jq  -r '.resources[] | .type  + " , " + .name + " , " +  .region_id + " , " + .created_by + " , " + .created_at ' \
 >> resouces.csv
```

さらに、次の next_url を変数「NEXT_URL」にセットします。
現在の「NEXT_URL」を指定し、次の next_url を取得します。

```
NEXT_URL=`curl -X GET https://resource-controller.cloud.ibm.com$NEXT_URL  -H "Authorization: Bearer $TOKEN" | jq .next_url | tr -d '"'`
```

データの取得を繰り返します。

```
url -X GET https://resource-controller.cloud.ibm.com$NEXT_URL \
 -H "Authorization: Bearer $TOKEN" | \
 jq  -r '.resources[] | .type  + " , " + .name + " , " +  .region_id + " , " + .created_by + " , " + .created_at ' \
 >> resouces.csv
```

次の next_url を変数「NEXT_URL」にセットします。

```
NEXT_URL=`curl -X GET https://resource-controller.cloud.ibm.com$NEXT_URL  -H "Authorization: Bearer $TOKEN" | jq .next_url | tr -d '"'`
```

最後まで取得できれば、「NEXT_URL」に「null」がセットされます。

```
root@u2004:~# echo $NEXT_URL
null
```

この流れをスクリプトにしてみましょう。このような感じで全件取得できます。

```
#!/bin/bash

API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
NEXT_URL=/v2/resource_instances
TOKEN=`curl -X POST 'https://iam.cloud.ibm.com/identity/token' -H 'Content-Type: application/x-www-form-urlencoded' -d "grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=$API_KEY" | jq .access_token | tr -d '"'`

echo "type , name ,region_id , created_by , created_at" > resouces.csv

while [ "$NEXT_URL" != "null" ]
do
   curl -X GET https://resource-controller.cloud.ibm.com$NEXT_URL \
    -H "Authorization: Bearer $TOKEN" | \
    jq  -r '.resources[] | .type  + " , " + .name + " , " +  .region_id + " , " + .created_by + " , " + .created_at ' \
    | tr -d '"' >> resouces.csv

   NEXT_URL=`curl -X GET https://resource-controller.cloud.ibm.com$NEXT_URL  -H "Authorization: Bearer $TOKEN" | jq .next_url | tr -d '"'`
done
```

## List users でユーザー一覧を取得する

「[Get a list of all resource instances](https://cloud.ibm.com/apidocs/resource-controller/resource-controller#list-resource-instances)」の返す created_by は IBMid-XXXXXXXX のような形式でした。

これでは、不便なのでユーザー名を取得したいと思います。

利用するのは「[List users](https://cloud.ibm.com/apidocs/user-management#list-users)」です。

基本的なリクエスト形式はこちらです。


```
curl -X GET https://user-management.cloud.ibm.com/v2/accounts/<account_id>/users \ 
-H 'Authorization: Bearer <IAM_TOKEN>'
```

「[Get a list of all resource instances](https://cloud.ibm.com/apidocs/resource-controller/resource-controller#list-resource-instances)」と違うのは「account_id」の指定が必要なところだけです。

limit の上限が 100 でありデフォルトにセットされている事、継続がある場合 next_url を返すことも同じです。

先ほどと同様にスクリプトにします。

```
#!/bin/bash

API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ACCT_ID=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
NEXT_URL=/v2/accounts/$ACCT_ID/users
TOKEN=`curl -X POST 'https://iam.cloud.ibm.com/identity/token' -H 'Content-Type: application/x-www-form-urlencoded' -d "grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=$API_KEY" | jq .access_token | tr -d '"'`

echo "iam_id , user_id , name" > users.csv

while [ "$NEXT_URL" != "null" ]
do
   curl -X GET https://user-management.cloud.ibm.com$NEXT_URL \
    -H "Authorization: Bearer $TOKEN" | \
    jq '.resources[] | .iam_id  + " , " +.user_id  + " , " + .firstname + " " + .lastname' \
    | tr -d '"' >> users.csv

   NEXT_URL=`curl -X GET https://user-management.cloud.ibm.com$NEXT_URL -H "Authorization: Bearer $TOKEN" | jq .next_url | tr -d '"'`
done
```

このような感じで csv になります。

```
iam_id , user_id , name
IBMid-ZZZZZZZZ , onoda@example.com , Yasuhiro Onoda
```

あとは、users.csv と先ほどの resouces.csv をマージすれば、誰が作ったリソースなのかもっとよくわかりますね。