Wasabi で請求通知を設定する方法

Wasabi には現在、請求アラートや通知機能がありません。このため、このナレッジベースドキュメントでは、この機能をスクリプトで設定し、アカウントの請求サマリーを毎日取得する方法を説明します。

なお、この請求サマリーには、1日に1回 (UTC 午前0時) 実行される直近の請求ジョブまでの間にご利用のアカウントで請求対象となる4項目が表示されます。

  1. アクティブなストレージ
  2. 削除されたストレージ
  3. アクティブなオブジェクト合計
  4. 削除されたオブジェクト合計

スクリプト実行前の確認事項

  • スクリプト実行前に、CLI に AWS SDK for Python (Boto3)   がインストールされており、バケットのバージョニング機能がオフになっていることを確認します。
  • このスクリプトを実行するには Python 3+ バージョンのインストールが必要です。

スクリプトの実行と詳細 (出力画面を添付)

1. スクリプト内にお使いのアカウントの「wasabi_access_key と「wasabi_secret_key を入力します。

2. 送信者のメールアドレスを「gmail_sender」に、送信者のパスワードを「gmail_password」にそれぞれ入力します。

3. 最後に、変数「receiver」に請求通知を毎日送信したい宛先のメールアドレスを入力します。

この情報を入力する必要があるコードスニペット :

wasabi_access_key = 'Wasabi-Access-Key'
wasabi_secret_key = 'Wasabi-Secret-Key'
gmail_sender = 'sender@xyz.com'
receiver = 'receiver@xyz.com'
# If you have 2FA then please enable application passwords for separate instance login.
gmail_password = 'sender-Password'
 
 4. 以下のスクリプトを保存して実行します。
 
"""
NOTE this script assumes that you are using gmail as your smtp server if not please configure it accordingly.
"""

import datetime
from email.message import EmailMessage

import requests
import smtplib


def calculate_size(size, _size_table):
"""
This function dynamically calculates the right base unit symbol for size of the object.
:param size: integer to be dynamically calculated.
:param _size_table: dictionary of size in Bytes.Created in wasabi-automation.
:return: string of converted size.
"""
count = 0
while size // 1024 > 0:
size = size / 1024
count += 1
return str(round(size, 2)) + ' ' + _size_table[count]


if __name__ == '__main__':
# Keys for accessing billing data.
wasabi_access_key = 'access-key'
wasabi_secret_key = 'secret-key'
gmail_sender = 'sender@xyz.com'
receiver = 'receiver@xyz.com'
# If you have 2FA then please enable application passwords for separate instance login.
gmail_password = 'sender-password'

# Generate a table for SI units symbol table.
size_table = {0: 'Bs', 1: 'KBs', 2: 'MBs', 3: 'GBs', 4: 'TBs', 5: 'PBs', 6: 'EBs'}

# request for the billing api
try:
response = requests.get("https://billing.wasabisys.com/utilization/bucket/",
headers={"Authorization": f'{wasabi_access_key}:{wasabi_secret_key}'})
except Exception as e:
raise e

# get json data for billing
json_data = response.json()

# initialize a dict for adding up numbers
result = {'PaddedStorageSizeBytes': 0,
'NumBillableObjects': 0,
'DeletedStorageSizeBytes': 0,
'NumBillableDeletedObjects': 0
}

# get the initial time and check date only for this day.
initial_time = datetime.datetime.strptime(json_data[0]['StartTime'],'%Y-%m-%dT%H:%M:%SZ')

# for each bucket add the the data to the dict
for bucket in json_data:
# check the time from the last day.
time = datetime.datetime.strptime(bucket['StartTime'],'%Y-%m-%dT%H:%M:%SZ')
# summing logic.
if time.date()== initial_time.date():
result['PaddedStorageSizeBytes'] += bucket['PaddedStorageSizeBytes']
result['DeletedStorageSizeBytes'] += bucket['DeletedStorageSizeBytes']
result['NumBillableObjects'] += bucket['NumBillableObjects']
result['NumBillableDeletedObjects'] += bucket['NumBillableDeletedObjects']

body = f"Billing Summary for {initial_time.date()}" + "\n" \
+ 'Active storage: ' + calculate_size(result['PaddedStorageSizeBytes'], size_table) + "\n" \
+ 'Deleted storage: ' + calculate_size(result['DeletedStorageSizeBytes'], size_table) + "\n" \
+ 'Total Active objects: ' + str(result['NumBillableObjects']) + "\n" \
+ 'Total Deleted objects: ' + str(result['NumBillableDeletedObjects'])

try:
server = smtplib.SMTP_SSL('smtp.gmail.com',465)
server.login(gmail_sender,gmail_password)
msg = EmailMessage()
msg.set_content(body)

msg['Subject'] = f'Wasabi Billing for {initial_time.date()}'
msg['From'] = gmail_sender
msg['To'] = receiver

# Send the message via our own SMTP server.
server.send_message(msg)
server.quit()
except Exception as e:
print(e)

 

出力 :

以下のような通知メールが届きます。

Screen_Shot_2021-05-11_at_8.28.19_AM.png

 

これで、このスクリプトを cron/scheduler として実行し、毎日午前9時など、同じ時間に自動実行して Wasabi アカウントの請求統計と通知を取得するように設定できるようになりました。

 

上記のスクリプトと cron/schedular の設定方法はこのナレッジベースドキュメントに添付されています。

 

 

 

 
 
 
 
 
 
 
 
他にご質問がございましたら、リクエストを送信してください