こんにちは、虎の穴開発室です。
弊社の一部サービスではストレージとしてConoHaオブジェクトストレージを利用していますが、日々運用しているとログファイルなどが溜まったりして、いつの間にかストレージのディスク容量が枯渇する可能性があります。
ConoHaのコントロールパネルにてディスク容量は確認出来ますが、毎日確認するのも大変です。
そこで、ConoHaが提供しているAPIでディスクの使用率を取得し、Slackに通知する仕組みをRubyにて作ってみました!
ConoHa のAPIドキュメントは、以下にて公開されています
https://www.conoha.jp/docs/
処理の流れ
- Identity APIを使用して、トークンIDを発行する
- ObjectStorage APIを使用してオブジェクトストレージの使用率を割り出す
- Slackに通知する
▪️Identity APIを使用して、トークンIDを発行する
まず、APIにてオブジェクトストレージの情報を取得する為には、
トークンIDの発行が必要ですので、Identity APIを使用して、トークンIDを発行します。
またIdentity APIには、APIユーザー名とAPIユーザパスワードとテナントIDが必要になります。
テナントIDは、ConoHaのコントロールパネルにて確認出来きます。
トークンIDは、APIのレスポンスbodyの access > token > id にて取得出来ます。
またトークンIDは、発行してから24時間が有効期間です。
require 'net/https' require 'uri' require 'json' # ConoHaAPI ユーザー名 CONOHA_API_USER = '*****'.freeze # ConoHaAPI ユーザーパスワード CONOHA_API_KEY = '*****'.freeze # ConoHaAPI テナントID CONOHA_API_TENANT = '*****'.freeze # ConoHaAPI Identity API (トークン発行) CONOHA_API_TOKEN_URL = 'https://identity.tyo1.conoha.io/v2.0/tokens'.freeze # ConoHaAPI ObjectStorage API CONOHA_API_STORAGE_URL = 'https://object-storage.tyo1.conoha.io/v1/nc_'.freeze def conoha_api_token # アクセスするためのURLを生成 uri = URI.parse(CONOHA_API_TOKEN_URL) https = https_config(uri) req = Net::HTTP::Post.new(uri.path) req.body = JSON.generate(api_param) # リクエスト送信 res = https.start do |x| x.request(req) end # 取得したJSON形式のレスポンスをオブジェクトに変換 JSON.parse(res.body)['access']['token']['id'] end def https_config(uri) # HTTPSを使うための設定 https = Net::HTTP.new(uri.host, uri.port) https.use_ssl = true https.verify_mode = OpenSSL::SSL::VERIFY_NONE https end def api_param # 送信するパラメータを設定 { 'auth' => { 'passwordCredentials' => { 'username' => CONOHA_API_USER, 'password' => CONOHA_API_KEY }, 'tenantId' => CONOHA_API_TENANT } } end
▪️ObjectStorage APIを使用してオブジェクトストレージの使用率を割り出す
上記にて取得したトークンIDを使用して、ObjectStorage APIにて
実際にオブジェクトストレージの情報を取得します。
def storage_capacity(api_token) # アクセスするためのURLを生成 uri = URI.parse(CONOHA_API_STORAGE_URL + CONOHA_API_TENANT) https = https_config(uri) req = Net::HTTP::Get.new(uri.path) req['Accept'] = 'application/json' # トークンIDを設定 req['X-Auth-Token'] = api_token # リクエスト送信 res = https.start do |x| x.request(req) end calculate_usage(res) end
APIのレスポンスヘッダの中に
[x-account-meta-quota-bytes] ディスク容量
[x-account-bytes-used] ディスク使用量
が含まれていますので、それを使って使用率を算出します。
def calculate_usage(res) # 使用率を算出 used_storage = res['x-account-bytes-used'].to_i / 1_073_741_824 max_storage = res['x-account-meta-quota-bytes'].to_i / 1_073_741_824 proportion = ((used_storage.to_f / max_storage.to_f) * 100).round # Slackに通知するメッセージを整形 message_header = if proportion >= 80 # ディスク使用率が80%以上に達した時は、メンション付きで、さらに強調して通知 %(<!here>*【現在、ConoHaのディスク容量が少なくなってきています!対応をお願いします!!】*) else %(【現在のConoHaのディスク容量をお知らせします】) end %(#{message_header} 容量: #{max_storage} G / 使用中: #{used_storage} G *使用率: #{proportion} %*) end
▪️Slackに通知する
最後に、ディスク使用率など監視情報をSlackに通知します。
上記にてSlackに投げるメッセージ本文は用意してあるので、
あとはそれをSlackのWebhook URLに投げます。
Webhook URLの取得方法は、以下の記事を参考にして下さい。
toranoana-lab.hatenablog.com
# Webhook URL SLACK_HOOK = 'https://hooks.slack.com/services/*****/*****/*****'.freeze def send_slack(message) uri = URI.parse(SLACK_HOOK) payload = { text: message } Net::HTTP.post_form(uri, payload: payload.to_json) end
上記メソッドを次の通りに呼べば、
オブジェクトストレージの使用率を監視プログラムの完成です。
api_token = conoha_api_token message = storage_capacity(api_token) send_slack(message)
これを実行すると以下の通り、ディスク容量情報をSlackに通知してくれます。
・通常の場合
・閾値を超えた場合
あとはこのRubyプログラムをcronに設定すれば、定期自動監視も可能になります。
これで夜も安心して眠れますね。
また、今回のソースコードは以下にて公開していますので、ぜひご参考にして下さい。
github.com
虎の穴では、現在エンジニアの仲間を絶賛募集しています。
Rubyを使ったシステム開発も多数ありますので、
興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。