IBM Cloudメモ_Classic InfraのBandwidth summaryをCSVに出力する方法

# はじめに

IBM CloudポータルのClassic Infrastructure画面にある「Network」→「Bandwidth」→「Summary」メニューを開くと、「Bandwidth Summary」というセクションが表示されます。
これは、Classic Infrastructure内のすべてのデバイスが使用した送信（Outgoing）および受信（Incoming）の帯域幅を一覧で確認できる機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/5120bf5a-2990-4c1b-9cb9-2afeaebb3c4b.png)

私の検証環境では、利用しているのは1台のBare Metal Serverのみのため、表示される情報は少なく寂しい印象ですが、多数のBare Metal ServerやVirtual Serverを利用している環境であれば、このページに長いリストが表示されるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/0db3e7f1-5ac5-43b4-8042-645485d12d9d.png)

また、帯域幅の使用量に応じてソートも可能なため、最も多く、または、少ない帯域を使用しているサーバーを簡単に特定することができます。


**制限事項：**
ただし、この画面にはExport機能が用意されていないため、データの取得はポータル上で目視に頼ることになります。
そのため、毎回データを確認するにはIBM Cloudポータルへのログインが必要であり、閲覧者には該当リソースに対するIAM権限が求められます。
また、Cloudポータルの外でデータを共有・活用するには不便な面もあります。

**本日のテーマ：**
今回は、ibmcloud CLIコマンドと簡単なBashスクリプトを組み合わせることで、
この画面に表示される帯域幅の情報を取得し、CSVファイルとして保存する方法をご紹介します。これにより、後続の分析や他システムとの連携が容易になります。
具体的には、今回作成するCSVファイルでは、主に以下の項目を収集対象としています：
- Hostname
- Public NICのOutgoing Bandwidth
- Public NICのAllotment（IncomingとOutgoing Bandwidthの合計）



# 分析

「Bandwidth Summary」のドキュメントがこちらです。
https://cloud.ibm.com/docs/bandwidth-metering?topic=bandwidth-metering-get-started-with-bandwidth-metering&interface=ui
書類によって、特に「Bandwidth Metering」に特化した ibmcloud のコマンドやAPIは存在しないことを確認しました。
そのため、「Summary」画面に表示されている情報は、実際には各Bare Metal Server（BMS）やVirtual Server（VS）ごとのデータを集約して構成されていると推測されます。

そこで次のステップとして、BMSおよびVSそれぞれに対して ibmcloud コマンドを実行し、出力情報を確認します。必要な項目をBashスクリプトで抽出し、CSVファイルとして書き出していきます。

# BMS用のスクリプト

BMSに関しては、以下のコマンドで各サーバーの詳細情報を確認することができ、その出力の中に「Bandwidth」という項目が含まれています。

```ctr:
ibmcloud sl hardware list    # to find the Server ID
ibmcloud sl hardware detail <Server ID>
```

私の検証環境では、以下のような出力が得られます（一部の内容はマスキングしています）。赤枠で囲んだ部分が、Bandwidthに関する情報です。Bashの awk コマンドで見ると、Bandwidthという見出し行の次の行に、以下のようなフィールドが並んでいます：
- 3番目のフィールド：数字「0.542050」、Public Outgoing
- 4番目のフィールド：数字「406」、Public Allotment

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/a3b9caa9-a4cb-403f-8f70-4af2897d1ab7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/02fefb60-e9bb-44ed-9965-4c59b5af8de0.png)

以上を踏まえ、**アカウント内のすべてのBMSについて、Hostname、Outgoing Bandwidth（GB）、AllotmentをCSV形式で保存するスクリプトは以下の通りです。**
```ctr:
for i in $(ibmcloud sl hardware list --column id| awk '(NR>1)'); do ibmcloud sl hardware detail $i | awk '
/^Hostname/ {host=$2}
/^Bandwidth/ {getline; out=$3; allot=$4}
END {print "Hostname,OutGB,Allotment"; print host "," out "," allot}
' > result.csv; done
```

検証環境で実行した結果、以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/d7d953bf-2844-44ae-bb8e-1618d40553cb.png)

そのCSVファイルをExcelで開くと、以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/c5eb85f8-06dc-47dd-b7d9-bcf4135f3b0c.png)



# Virtual Server用のスクリプト

**＜To Do＞**

現在の検証環境ではVSI（Virtual Server Instance）が作成されていないため、BMSのように実際の確認はできず、以下のスクリプトはあくまで推測ベースのものとなっています。
今後、VSIを含む検証環境が整い次第、改めて動作確認およびスクリプトの修正を行う予定です。


```ctr:
for i in $(ibmcloud sl vs list --column id| awk '(NR>1)'); do ibmcloud sl vs detail $i | awk '
/^Hostname/ {host=$2}
/^Bandwidth/ {getline; out=$3; allot=$4}
END {print "Hostname,OutGB,Allotment"; print host "," out "," allot}
' > result.csv; done
```


# スクリプトの実行環境について

このスクリプトを実行するには、ibmcloud CLIがインストールされており、awk コマンドが使用できる環境が必要です。
もしローカルPCでうまく動作しない場合は、IBM Cloud Shellの利用をおすすめします。

IBM Cloud Shellは、IBM Cloudポータルの右上にあるメニューから起動でき、ibmcloud login を再度実行する必要もありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/bef663a0-0a80-4bd1-af95-34f63cd02132.png)



以上、少しでも皆さまの参考になれば幸いです。