IBM Cloudのリソース・リストにAPIを使って作成者情報を付加する

2023/3/30 17:00-18:00に本記事の内容を元にしたウェビナーを行いました｡
資料と録画を公開していますのでぜひこちらもご参照ください｡
https://ibm-developer.connpass.com/event/277609/

# 背景・目的
私たちCustomer Success Manager(CSM)はお客様に製品の価値を知っていただくための活動の一部として､IBM Cloudを使ってウェビナーやハンズオン､PoCなどを行なっています｡
不要になったインスタンスを削除するためにはインスタンスの作成者がわかると特定しやすくなります｡
IBM Cloud Consoleのリソース・リストで個々に作成者を確認することができるのですが､インスタンス数が増えてきたため､APIを使って一括で一覧に出力することにしました｡

# 作成したもの
IBM Cloud APIを利用して以下2つのcsvファイルを出力するPythonプログラムを作成しました｡

作成したPythonプログラムのソースコードはこちらの[GitHubリポジトリ](https://github.com/IBMDeveloperTokyo/dojo-ibmcloudapi-230330)をご参照ください｡

※本記事内でIBM Cloud Consoleの操作の解説を行なっていますが､ユーザインタフェースは変更される可能性があります｡

## 出力ファイル1： リソース・リスト
複数のAPIのレスポンスデータを結合して､リソースの一覧をcsv形式で出力します｡

出力項目は概して以下の通りです｡
* インスタンスのID
* インスタンス名
* サービスの種類
* 作成日時
* 作成者
* タグ
* 作成元サービス

## 出力ファイル2：作成者情報を付与したインスタンス使用量のリスト
IBM Cloud Consoleポータルからダウンロードできるインスタンスごとの使用量のリストを読み込み､作成者情報を付与して出力します｡

# 使用したIBM Cloud API
以下のAPIを使用しました｡API仕様についてはリンク先の各ドキュメントを参照してください｡

* [Authentication API](https://cloud.ibm.com/apidocs/iam-identity-token-api#authentication)
* [List access groups　API](https://cloud.ibm.com/apidocs/iam-access-groups#list-access-groups)
* [List access group members　API](https://cloud.ibm.com/apidocs/iam-access-groups#list-access-group-members)
* [List service IDs　API](https://cloud.ibm.com/apidocs/iam-identity-token-api#list-service-ids)
* [Get a list of all resource instances　API](https://cloud.ibm.com/apidocs/resource-controller/resource-controller#list-resource-instances)
* [Get all tags　API](https://cloud.ibm.com/apidocs/tagging#list-tags)

# その他参考にしたもの

CLIでリソース一覧､ユーザ一覧を取得する手順を参考にしました｡

https://qiita.com/6onoda/items/0dbdb4624ff565102bcf#list-users-%E3%81%A7%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E4%B8%80%E8%A6%A7%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B

# はじめに
プログラムの実装を開始する前に､プログラム内で設定する値と読み込みに使用するファイルをIBM Cloud Consoleから取得します｡

## APIキーの作成
プログラムからIBM Cloud APIを利用するために､IBM Cloud Consoleで処理対象のアカウントに対する､自身のAPIキーを作成します｡
IBM Cloud Console->[管理]->[アクセス(IAM)請求および使用量]->[APIキー]->[作成]
表示されたAPIキー(文字列)をメモします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/85b5ea78-c032-d972-582e-a53ef658679d.png)

## アカウントIDの取得
対象のアカウントのIDを取得します｡
IBM Cloud Console->[管理]->[アカウント]->[アカウント設定]

アカウント名の下部分の､IDの値をメモします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/31078176-df24-65c0-045f-c759188b43af.png)


## リソース使用量csvファイルの取得
IBM Cloud Console->[管理]->[請求および使用量]->[使用量]
[時間フレーム]で出力対象期間を選択します｡
[CSVのエクスポート]->[インスタンス]でcsvファイルをダウンロードします｡
ダウンロードしたファイルを後ほど作成するPythonプログラムと同じフォルダに配置します｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/13a39d29-a01a-a75a-9d8c-a1f599f9cc77.png)

# プログラム解説
以下でプログラムの流れを説明します｡

## 1.設定項目の定義
「はじめに」で取得したAPIキー､アカウントID､ファイル名を設定します｡

## 2.アクセストークンの生成
[Authentication API](https://cloud.ibm.com/apidocs/iam-identity-token-api#authentication)でAPIKEYからアクセストークンを取得し､以降の各種APIで利用するヘッダ情報にセットします｡

## 3.各アクセスグループ内のメンバーリストを取得
[List access groups　API](https://cloud.ibm.com/apidocs/iam-access-groups#list-access-groups)でアカウントID内のアクセスグループのリストを取得します｡
[List access group members　API](https://cloud.ibm.com/apidocs/iam-access-groups#list-access-group-members)で各アクセスグループに対するメンバーリストを取得し､出力ファイル用にkey:ユーザID､value:メールアドレスのペアを生成します｡

## 4.各サービスIDのサービス名と説明を取得
[List service IDs　API](https://cloud.ibm.com/apidocs/iam-identity-token-api#list-service-ids)でサービスIDの一覧を取得し､key:サービスID, value:サービス名と説明のペアを生成します｡
一度に返せるレスポンスデータが最大100件分であるため､nextに格納されたURLから次の100件を取得し繰り返します｡

## 5.リソース一覧を取得し､3.4.の情報を結合してファイル出力
[Get a list of all resource instances　API](https://cloud.ibm.com/apidocs/resource-controller/resource-controller#list-resource-instances)でリソース一覧を取得し､3.4.から対応するメールアドレス､サービス名､説明を結合します｡
また､crn(インスタンスID)をkeyに対応するタグ情報を[Get all tags　API](https://cloud.ibm.com/apidocs/tagging#list-tags)から取得します｡
結合した内容をリソース・リストファイルに出力します｡

## 6.読み込み対象ファイルに作成者ID､メールアドレス､タグ情報の列を付与して出力
5.で作成した情報を再利用し､読み込んだインスタンス使用量のリストに作成者ID､メールアドレス､タグ情報を付加して出力します｡

# まとめ
複数のAPIから取得できる情報を組み合わせて､リソースに関する情報を一覧出力することができました｡
これにより使用量の多いインスタンスや､削除可能なインスタンスを特定することができます｡