IBM Cloud File Storage 大掃除－許可ホストのないものをリスト・削除する/課金方法を確認する

Classic の File Storage の話です。はやりの VPC 環境の話ではありません。

12月は大掃除の季節です。
昨年「[IBM Cloud Block Storage 大掃除－許可ホストのないものをリスト・削除する](https://qiita.com/6onoda/items/55c9cdf125017c43e9d5)」という記事を書きました。

今回、File Storage も同様に処理して欲しいと頼まれたでの、簡単に引き受けました。

単純にできると思っていました。Block Storage を対象にしていたところを、File Storage に単純に変更すればよいと考えていました。
しかし、いろいろはまったので経験の共有として記録しておきます。
結局、きれいなソリューションにはなりませんでした。

# 実行環境とコード

今回の実行環境は Windows 11 上の wsl の Ubuntu 20.04 です。
環境の準備やコードの内容については、[前回の記事](https://qiita.com/6onoda/items/55c9cdf125017c43e9d5)をご覧ください。
昨年を Block Storage を対象にしていたところを、File Storage に単純に変更しているだけです。

実行前に Username と API Key を環境変数にセットします。

```
export SL_USERNAME=YOUR_USERNAME
export SL_API_KEY=YOUR_API_KEY
```

前回、Block Storage を対象にしていた部分を File Storage 用に書き換えます。

```
import SoftLayer
client = SoftLayer.create_client_from_env()
fsm = SoftLayer.managers.FileStorageManager(client)
fs_list=fsm.list_file_volumes(datacenter=None, username=None, storage_type=None, order=None)
for fs in fs_list:
  allowed = fsm.get_volume_access_list(fs['id'])
  details = fsm.get_file_volume_details(fs['id'])
  if ((allowed['allowedHardware'] == []) and
      (allowed['allowedIpAddresses'] == []) and
      (allowed['allowedSubnets'] == []) and
      (allowed['allowedVirtualGuests'] == []) and
      (details['activeTransactionCount'] ==0) ) :
    print(str(fs['id']) + ':' + str(fs['username']))
#    print(str(allowed) + ' : ' + str(details['activeTransactionCount']))
#    fsm.cancel_volume(fs['id'], reason='No longer needed', immediate=False)
```
# キャンセルをリクエストしたが、実行対象から消えないものがある

そのまま実行すると、許可ホスト/サブネットのない File Storage をリストします。
最終行のコメントを外して実行すると、対象が猶予付きでキャンセルされます。

念のため、最終行をコメントに戻して実行してたところ、キャンセルをリクエストした File Storage の内のいくつかがリスト表示されてしまいました。

[前回](https://qiita.com/6onoda/items/55c9cdf125017c43e9d5)も書いた通り、キャンセルをリクエスト済みの Storage に、もう一度、キャンセルをリクエストするとエラーになります。
そこで、アクティブなトランザクション数 (activeTransactionCount) を確認して 0 であれば、リクエスト中ではないと判断しています。
しかし、キャンセルをリクエストしたにも関わらず、アクティブなトランザクション数が 0 のままのものがありました。

ポータルで確認すると、状況がキャンセル待ち/Cancellation Pending なのに、行頭にトランザクション中のアイコンがあるものとないものがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/cd759a0c-6088-1aea-350e-8f04d3f9b8ec.png)

アイコンが付いている方は、activeTransactionCount が期待通り 1 になっていました。
アイコンが付いていないものは、キャンセルをリクエストしたにも関わらず、activeTransactionCount が 0 のままでした。


# 違いは課金方法
サポートに問い合わせて判明したのは表示や動き方の違いは、課金方法によるものでした。
Classic 環境の Storage には他のリソースと同様に時間課金と月次課金が選択できます。 

時間課金の場合、利用した時間だけに課金されます。キャンセルが完了すれば、それ以降の費用は請求されません。
そのため、キャンセル猶予のトランザクションは即時に開始されます。
activeTransactionCount でトランザクション中であることが確認できます。

一方、月次課金の場合は、前払いで月末(正確にはアニバーサリービリングデート:ABD)までの支払いが確定しています。
月中にキャンセルしても、支払いが確定した月末までも利用料金は請求されます。
この場合、キャンセル猶予のトランザクションは、US時間で月末の 24 時間前にならないと開始されないのだそうです。

# Cancellation Pending を API や CLI では取得できない
大事なのは Cancellation Pending かどうか判断できることです。
他に良い方法があれば activeTransactionCount にこだわる必要はありません。
いろいろテストしたのですが、見つかりませんでした。
ポータルで確認できるのですから何か方法があるはずなのですが、サポートから有効な回答は得られませんでした。

# 代替方法の検討
いろいろ方法を考えてみます。
ただ、今回の大掃除は修了しているので、可能性を検討しただけで検証まではしていません。

## キャンセルのリクエスト状況はポータルで確認
キャンセルのリクエスト状況はポータルで確認し、API で対象リストが空になった事を単純にやめます。
ただし、同月の中で、同じことを頼まれれば困りますね。

## キャンセルをリクエストした Storage 名を記録
activeTransactionCount に頼るのではなく、キャンセルをリクエストした Storage 名を記録しておき、スキップする方法です。
一番間違いがないでしょう。

## 即時削除
即時削除すれば、月次課金であっても即時にトランザクションが開始されるかもしれません。
トランザクションが開始されれば、activeTransactionCount で確認可能です。

## ポータル上の情報取得の自動化
だんだん、強引になってきました。

File Storage の詳細は下記のURLで確認できます。
ID は、API の中で取得済みです。

```
https://cloud.ibm.com/cloud-storage/file/[ID]
```

取得したい場所は分かっているので、ポータルの UI が変更されない限り Selenium などで、必要な情報を取得できます。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/a41ef35a-5634-27af-0fd8-e00ecaf8f4c8.png)

# 課金方法を取得する方法
そもそも、File Storage の詳細画面に月次課金か時間課金かが表示されません。
(BMS や VSI は表示されますが)
もちろん、API や CLIで取得できません。

調査したところ、かなり強引ですが、送り状/Invoice で確認できるのが分かりました。

下記に移動します。

```
https://cloud.ibm.com/billing/invoices
```

「繰り返し」タイプのものを「PDF詳細」か「Excel請求書」でダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/6c7e3463-db8f-a4a3-690a-6c059b92873d.png)

Storage 名で検索します。

時間課金の場合「時間×単価」が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/f68d1e4a-2b1f-3287-795c-4e0cd616576b.png)

一方、月額課金の場合は、時間に関する表示がありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/a3a562db-7e80-43fe-d60d-46133e1c325e.png)

Excel請求書で確認する場合は「Detailed Billing」タブで確認します。
通常、Storage 名は改行されていてセルには表示されないので、ご注意ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/14f4c168-7938-504e-049a-ad6efcdadf48.png)