使いたいときに使いたいだけリソースを使用できるのはクラウドの魅力ですが、無駄なく効率的に利用するためには利用状況を把握しておく必要があります。今回はIDCFクラウドの利用状況を把握するために、利用明細とビリングAPIを活用する方法をご紹介します。
利用明細を見てみよう
まずは利用明細を見てみましょう。https://console.idcfcloud.com/billing/からみることができます。 (下図のように右上のアイコンから「ビリング」を選んでも良いです。)
利用明細では下図のように、各月の明細を確認することができます。 今月分については昨日までの値が反映されており、今月どのくらい使っているか確認できます。
各項目をクリックするとスペックや個数など詳細な情報をみることができます。
CSV形式の利用明細を活用する
各仮想マシン毎の明細を確認したい、集計方法を変えたいといった場合はCSV形式の利用明細が便利です。 CSV形式の利用明細は右上のボタンからダウンロードできます。
ExcelやGoogleスプレッドシートへ貼り付ける扱いやすくなります。
CSV形式の利用明細はポータル画面上よりも詳細です。ポータル画面上では表示されないリソースの表示名や作成・削除日の情報も含まれています。
CSVの各列の意味は以下の通りです。
明細画面のエクスポートCSVの各項目の意味を教えて下さい | IDCFクラウド
列名 | 例 | 説明 |
---|---|---|
Region | jp-east | リージョン |
ServiceName | Cloud Computing | サービス名(IDCFクラウド、オブジェクトストレージなど) |
ZoneName | newton | ゾーン名 |
Category | VirtualMachine | リソースのカテゴリー(仮想マシン、ボリューム、IPアドレスなど) |
Menu | light.S1 | 商品名(仮想マシンのスペック、トラフィックの種類など) |
ResourceDisplayName | vm01 | リソースの表示名 |
StartDate | 2016-08-01 | リソース使用量の算出開始日 |
EndDate | 2016-08-01 | リソース使用量の算出終了日 |
Usage | 39.05944442749 | リソースの使用量 |
Allocated | 216 | リソースの確保時間。単位は時間 |
Running | 39.05944442749 | 仮想マシンの起動時間(CategoryがVirtualMachine以外の場合は0) |
Stopped | 176.94055557251 | 仮想マシンの停止時間(CategoryがVirtualMachine以外の場合は0) |
Amount | 15 | 税抜き請求額 |
Tax | 1 | 消費税 |
Net | 16 | 税込み請求額 |
ピボットテーブルなどで集計すると利用状況がよりわかりやすくなります。 下図はGoogleスプレッドシートのピボットテーブルで、ポータル画面と同様の表示になるようリージョン(Region)、サービス(ServiceName)、カテゴリー(Category)ごとに税抜き請求額(Amount)を合計したものです。
ビリングAPI+Googleスプレッドシートで日々のリソース利用の変化を把握する
ビリングAPIで利用明細を取得する
ここまで、利用明細から各月の利用状況を把握できることをみてきました。 本項ではもう一歩踏み込んで月内でのリソース使用量・課金額の変化を調べてみましょう。
利用明細に記載されている値は月初〜月末(今月分は昨日)までの合計使用量・課金額であるため、それだけをみても月内の変化はわかりません。しかし、今月分の利用明細に昨日までの値が反映されていることから、毎日利用明細を取得すれば値の変化からリソース使用量・課金額の変化がわかります。
しかし、毎日利用明細をダウンロードしてExcel等に読み込ませるのは大変です。このように定期的なタスクがある場合はAPIを使って自動化できると便利です。IDCFクラウドには利用明細を取得するためのビリングAPIがあるので、これを使ってみましょう。
ビリングAPIを使うと、次のように指定した月の利用明細をJSON形式で取得することができます(シグネチャの生成方法などの詳細はドキュメント)を参照してください。)。レスポンスのdata
の配列の中にCSV形式の利用明細の行に対応するオブジェクトが入っています。
$ curl -n https://your.idcfcloud.com/api/v1/billings/2016-04 \ -G \ -d format=json \ -H "X-IDCF-APIKEY: SrE5Ceeb1Q9MPl0yM0qbd3D3_CCpLWqnbcruMBj2WyK03Q6r0l6YJhIdCsYUmB7VM8AFttoqsxc3FxQrsAh8VQ" \ -H "X-IDCF-Expires: 1437142261" \ -H "X-IDCF-Signature: EenNFoNxnYEQVGW279XcQ+tBgwFPpMmTkDZQvKryIZg="
{ "meta": { "account_id": 71000090048, "billing_period_start_at": "2016-04-01", "billing_period_end_at": "2016-04-30", "invoice_no": "B7112834501", "taxable_amount": 43608, "tax": 3484, "total": 47092, "updated_at": "2016-04-07T10:03:00+0900" }, "data": [ { "Allocated": 42.0, "Amount": 42, "Category": "example", "Enddate": "2016-02-01", "Menu": "highio.5XL128", "Net": 42, "Region": "jp-east", "ResourceDisplayName": "ROOT-2622", "Running": 42.0, "ServiceName": "Cloud Computing", "StartDate": "2016-02-01", "Stopped": 42.0, "Tax": 42, "Usage": 42.0, "ZoneName": "tesla" } ] }
Google Apps ScriptとビリングAPIで利用明細をスプレッドシートに取り込む
ビリングAPIの実行用に新しく仮想マシンを用意しても良いですが、今回はGoogleが提供しているスクリプト環境であるGoogle Apps Scriptを使って実行しGoogleスプレッドシートに利用明細を取り込んでみます。Google Apps ScriptはGoogleの環境上で動くので新しく仮想マシンを用意することなくビリングAPIを実行することができます。さらに、実行されていることがわかるよう実行時にSlackで請求額を通知するようにしてみます。
Google スプレッドシートでデータ取り込み用に新しくスプレッドシートを作成します。(名前は何でもかまいません。)作成したスプレッドシートを開きID(URL https://docs.google.com/spreadsheets/d/*************/edit#gid=0
のアスタリスクの部分)を控えて下さい。
SlackにはIncoming Webhooksという仕組みを使って通知を行います。Slackにログインしている状態でhttps://my.slack.com/services/new/incoming-webhook/にアクセスしメッセージを投稿するチャンネル等の設定を行って生成されるWebhook URLを控えてください。どこから通知が送信されたのかわかりやすいよう名前やアイコンも変えておくとよいでしょう。
次に、https://script.google.comにアクセスします。
空のプロジェクトが既に作成されているので、元からあるコードを消して以下のコードを貼り付けて下さい。
はじめの3行のAPIKEY
、SECRET
、SPREADSHEET_ID
、SLACK_WEBHOOK_URL
をIDCFクラウドのAPIキー、シークレットキー(https://console.idcfcloud.com/user/apikeyで確認できます)、控えておいたスプレッドシートのID、SlackのWebhook URLに書き換えてください。
var APIKEY = "IDCFクラウドのAPIキーをいれてください"; var SECRET = "IDCFクラウドのSECRETキーをいれてください"; var SPREADSHEET_ID = "GoogleスプレッドシートのIDをいれてください"; var SLACK_WEBHOOK_URL = "SlackのWebhookのURLをいれてください"; function getThisMonth() { var date = new Date(); return date.getFullYear() + "-" + ("0" + (date.getMonth()+1)).slice(-2); } function getToday() { var date = new Date(); var this_month = date.getFullYear() + "-" + ("0" + (date.getMonth()+1)).slice(-2); return this_month + "-" + ("0" + date.getDate()).slice(-2); } // Billing APIで利用明細を取得 function getUsageData(month) { var query_string = "format=json"; var expiration_seconds = 30; var date = new Date(); var endpoint_uri = "/api/v1/billings/" + month; var expiration = (Math.floor(date.getTime()/1000) + expiration_seconds).toString(); var message ="GET" + "\n" + endpoint_uri + "\n" + APIKEY + "\n" + expiration + "\n" + query_string; var signature = Utilities.base64Encode((Utilities.computeHmacSha256Signature(message, SECRET))); var url = "https://your.idcfcloud.com" + endpoint_uri + "?" + query_string; var params = { "headers": { "X-IDCF-APIKEY": APIKEY, "X-IDCF-Expires": expiration, "X-IDCF-Signature": signature } } return JSON.parse(UrlFetchApp.fetch(url, params).getContentText())["data"]; } // 利用明細に本日の日付を表すDate列を付加してGoogleスプレッドシートに書き込む function sendUsageDataToSpreadsheet(ss, sheet, data) { var this_month = getThisMonth(); var today = getToday(); var keys = [ "Region", "ServiceName", "ZoneName", "Category", "Menu", "ResourceDisplayName", "StartDate", "EndDate", "Usage", "Allocated", "Running", "Stopped", "Amount", "Tax", "Net" ]; if (!sheet) { sheet = ss.insertSheet(this_month, 0); } if (sheet.getLastRow() == 0) { sheet.appendRow(["Date"].concat(keys)); } data.forEach(function(resource) { var values = [today].concat(keys.map(function(key) { return resource[key]; })); sheet.appendRow(values); }); } // Slackに現在の請求額を投稿する function postTotalAmountToSlack(webhook_url, data) { var total_amount = 0; data.forEach(function(resource) { total_amount += resource["Amount"]; }); var message = "今月分の請求額は現在" + total_amount + "円です"; var params = { "method": "post", "payload": 'payload=' + JSON.stringify({"text": message}) }; UrlFetchApp.fetch(SLACK_WEBHOOK_URL, params) } function main() { var this_month = getThisMonth(); var ss = SpreadsheetApp.openById(SPREADSHEET_ID); var sheet = ss.getSheetByName(this_month); var data = getUsageData(this_month); sendUsageDataToSpreadsheet(ss, sheet, data); postTotalAmountToSlack(SLACK_WEBHOOK_URL, data); }
貼り付けると下図のようになります。(キー、IDはご自分の環境の値に書き換えて下さい。)
適当な名前をつけて保存し、メニューから「実行 > main」を選択して実行します。スプレッドシートの操作と外部サービスへの接続の許可がもとめられたら許可してください。完了するとスプレッドシートの新しいシートに利用明細の内容が入力され、Slackに請求額が通知されます。
最後にトリガーを設定し1日1回実行されるようにします。メニューから「リソース > 現在のプロジェクトのトリガー」からトリガーを追加し、下図のように「日タイマー」で適当な時間に実行するようにしておけばOKです。
これで自動で毎日今月分の利用明細がスプレッドシートに追記、請求額がSlackで通知されるようになりました!
利用明細がたまってきたらピボットテーブルなどで集計しグラフを描いてみると、日々の利用状況の変化が一目瞭然となります。 例えば、下図では8/10〜8/18まで仮想マシンは停止中で課金されていないのですが、ボリュームが毎日33-35円程度課金されていることがわかります。8/19以降は仮想マシンも毎日30円程度課金されていることから新しく仮想マシンを作成したか既存の仮想マシンを起動したこともわかります。
請求額に占める割合が大きいボリュームについてもう少し詳しく見てみましょう。Menu列とUsage列を使うとRoot Disk、Data Diskごとの使用量を見れます。8/10〜8/17まで1日で使用量がData Diskの値が480GB-Hour、Root Diskの値が360GB-Hour増えていることから、24時間で割るとData DiskとRoot Diskがそれぞれ20GB、15GB存在していたことがわかります。その後、Data Diskが不要であったことから削除するとその後は値が増えなくなり課金も止まっています。このように値の変化から無駄を発見し対応していくことで、より効率的にクラウドを使うことができます。
利用明細をみるときの注意点
最後に利用明細やビリングAPIの結果をみるときに注意点について少し触れておきましょう。
利用明細やビリングAPIはあくまでも課金情報を提供するためのものなので、課金対象外のリソースの使用量が含まれていなかったり、計算方法がサービスにより異なることがあります。
例えば、IDCFサービス間のトラフィックについては課金対象外となるため合計使用量(Usage)には含まれていません。また、多くのリソースでは毎時の使用量を合計した合計使用量を課金に利用していますが、平均使用量を課金に用いるオブジェクトストレージのストレージの料金のような例外もあります。このようなリソースでは合計使用量(Usage)の値も課金に使用される値(オブジェクトストレージの例では平均使用量)になるので注意が必要です。各リソースで使われている単位や請求額の計算方法については各サービスのドキュメントを参照してください。
おわりに
IDCFクラウドの料状況を利用明細とビリングAPIを使って把握する方法をご紹介しました。 コストの削減やリソース管理の効率化にお役にたてば幸いです。