2023/12/15
この記事ではキャンセルをリクエストしたが保留中の Storage の確認方法として、activeTransactionCount を利用しています。
月額課金の場合、月末(正確にはアニバーサリービリングデート:ABD)の24時間前にならないとトランザクションが開始しないため、この方法では判断できないことが分かりました。
詳しくは「IBM Cloud File Storage 大掃除-許可ホストのないものをリスト・削除する/課金方法を確認する」をご覧ください。
もう12月です。2022年も終わりですね。
師走といえは大掃除の季節です。今回は、許可ホストのない IBM Cloud Block Storage を利用していないとみなし、大掃除をしたいと思います。
操作には SoftLayer API Python Client を利用します。
使用した環境は、Windows 10 上の wsl の Ubuntu 20.04 です。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04 LTS
Release: 20.04
Codename: focal
Username および API Key の作成・確認
事前にClassic InfrastructureのUsernameおよびAPI Keyを確認しておきます。
これは、Classic 環境用のもので IAM 環境のものは使えません。
Docs での手順の記載はこちらです。
IBM Cloud コンソールで、「管理」>「アクセス (IAM)」>**「API キー」に移動し、「クラシック・インフラストラクチャー API キー」**を選択します。
**「クラシック・インフラストラクチャー・キーの作成 (Create a classic infrastructure key)」**をクリックします。
Username は「アカウントID-メールアドレス」の形式です。
こちらも参考にしてください。
IBM Cloud: Classic InfrastructureのslcliコマンドをCentOS7でセットアップする - 4. slcliの設定
SoftLayer API Python Client を導入する
導入方法はこちらです。
今回は pip で導入します。
sudo apt-get update
sudo apt install python3-pip
sudo pip install softlayer
「slcli --version」でバージョンが表示されれば導入は完了です。
$ slcli --version
Current: slcli (SoftLayer Command-line) v6.1.2
Latest: slcli (SoftLayer Command-line) v6.1.2
SoftLayer API Python Client の使用
client instance の作成
まず、client instance を作成します。
Python コードのパラメーターに直接指定することもできます。
import SoftLayer
client = SoftLayer.create_client_from_env(username='YOUR_USERNAME', api_key='YOUR_API_KEY')
また、環境変数にセットしてコードに含まないことも可能です。今回は、こちらのパターンを利用しましょう。
$ export SL_USERNAME=YOUR_USERNAME
$ export SL_API_KEY=YOUR_API_KEY
$ python3
>>> import SoftLayer
>>> client = SoftLayer.create_client_from_env()
Manager の取得
SoftLayer API Python Client では操作対象ごとに Manager が用意されています。
Block Storage の Manager は「SoftLayer.managers.block.BlockStorageManager(client)」になります。
これ使用する Block Storage Manager のメソッドの情報も、このページにあります。
下記のように Block Storage Manager を取得します。
>>> bsm = SoftLayer.managers.block.BlockStorageManager(client)
Block Storage 一覧の取得
「list_block_volumes」でBlock Storage 一覧の取得が可能です。
下記のように一覧を取得します。
>>> bs_list=bsm.list_block_volumes(datacenter=None, username=None, storage_type=None, order=None)
一つ目の要素から、内容を pprint で確認します。
要素は辞書型で「id」に volume id が入っています。
>>> import pprint
>>> pprint.pprint(bs_list[0])
{'activeTransactionCount': 0,
'capacityGb': 20,
'id': 123456789,
'lunId': '7',
'replicationPartnerCount': 0,
'serviceResource': {'backendIpAddress': 'fsf-tok0401e-fz.service.softlayer.com',
'datacenter': {'name': 'tok04'},
'id': 41504,
'name': 'Storage Type 02 Aggregate stxf-tok0401e',
'type': {'type': 'NETAPP_STOR_AGGR'}},
'serviceResourceBackendIpAddress': '10.201.XXX.XXX',
'username': 'IBM02SEL1234567-18'}
許可ホストの取得
許可ホストの取得には「get_volume_access_list」を利用します。
リスト内のひとつの要素の許可ホストを確認しましょう。
許可ホストは、'allowedHardware'、'allowedIpAddresses'、'allowedSubnets'、['allowedVirtualGuests' の4つの部分に分かれています。
許可ホストが無い場合、各々に空の辞書が返ります。下記のように 4 つとも空であれば、どのホストからもアクセスされる可能性の無い、使われていないホストです。
>>> pprint.pprint(bsm.get_volume_access_list(bs_list[60]['id']))
{'allowedHardware': [],
'allowedIpAddresses': [],
'allowedSubnets': [],
'allowedVirtualGuests': [],
'id': 123456789}
ボリュームのキャンセル
ボリュームのキャンセルは「cancel_volume」で行います。
>>> bsm.cancel_volume(bs_list[XXX]['id'], reason='No longer needed', immediate=False)
「cancel_block_volume」もありますが、内部で「cancel_volume」を呼び出しているだけです。
def cancel_block_volume(self, volume_id, reason='No longer needed', immediate=False):
"""Cancels the given block storage volume.
:param integer volume_id: The volume ID
:param string reason: The reason for cancellation
:param boolean immediate_flag: Cancel immediately or on anniversary date
"""
return self.cancel_volume(volume_id, reason, immediate)
即時キャンセルをしない場合、24時間は「キャンセル待ち」の状態になりキャンセルを取り消すことができます。
しかし、この状態では、再度のキャンセルはできません。
Cloud コンソールのキャンセル・アクションが使用できないため、Block Storage ボリュームをキャンセルできません。 どうなっているのでしょうか?
このストレージ・デバイスに関する取り消しプロセスが進行中なので、取り消しアクションを使用できなくなっています。 ボリュームは再利用処理が施されるまで少なくとも 24 時間引き続き表示されます。 デバイス名の隣に砂時計か時計のアイコンが表示されて、待機期間内であることが示されます。 少なくとも 24 時間待機期間があるので、必要に応じて取り消し要求を無効にすることができます。
実際にキャンセルを要求すると、exception が発生します。
>>> bsm.cancel_volume(123456789, reason='No longer needed', immediate=False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.8/dist-packages/SoftLayer/managers/storage.py", line 547, in cancel_volume
raise exceptions.SoftLayerError(
SoftLayer.exceptions.SoftLayerError: Storage Volume was already cancelled
「get_block_volume_details」で確認すると、キャンセル済み・削除待ちのものは、activeTransactionCount が 1 にセットされ、activeTransactions に削除待ちであると記載があります。
>>> pprint.pprint(bsm.get_block_volume_details(277949934)
... )
{'activeTransactionCount': 1,
'activeTransactions': [{'createDate': '2022-12-01T19:03:09-06:00',
'elapsedSeconds': 1959,
'guestId': '',
'hardwareId': '',
'id': 302550242,
'modifyDate': '2022-12-01T19:03:10-06:00',
'statusChangeDate': '2022-12-01T19:03:09-06:00',
'transactionStatus': {'friendlyName': 'This is a '
'buffer time in '
'which the '
'customer may '
'cancel the '
'server'}}],
以下略
今回は、activeTransactionCount が 0 のものだけを削除対象にします。
完成したスクリプト
下記が完成したスクリプトです。
念のため 「cancel_volume」はコメントアウトしてあります。
確認後、コメントアウトを外して実行すると、一括削除されます。
対象の一覧表だけが欲しい場合、下から 2 行目の print 文もコメントアウトしてください。
import SoftLayer
client = SoftLayer.create_client_from_env()
bsm = SoftLayer.managers.block.BlockStorageManager(client)
bs_list=bsm.list_block_volumes(datacenter=None, username=None, storage_type=None, order=None)
for bs in bs_list:
allowed = bsm.get_volume_access_list(bs['id'])
details = bsm.get_block_volume_details(bs['id'])
if ((allowed['allowedHardware'] == []) and
(allowed['allowedIpAddresses'] == []) and
(allowed['allowedSubnets'] == []) and
(allowed['allowedVirtualGuests'] == []) and
(details['activeTransactionCount'] ==0) ) :
print(str(bs['id']) + ':' + str(bs['username']))
print(str(allowed) + ' : ' + str(details['activeTransactionCount']))
# bsm.cancel_volume(bs['id'], reason='No longer needed', immediate=False)
利用には、実行前に Username と API Key を環境変数にセットする必要があります。
export SL_USERNAME=YOUR_USERNAME
export SL_API_KEY=YOUR_API_KEY