RubyでConoHaオブジェクトストレージの使用率を監視

こんにちは、虎の穴開発室です。

弊社の一部サービスではストレージとして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のコントロールパネルにて確認出来きます。
f:id:toranoana-lab:20180405192114p:plain

トークン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に通知してくれます。
・通常の場合
f:id:toranoana-lab:20180405202344p:plain
・閾値を超えた場合
f:id:toranoana-lab:20180406110448p:plain

あとはこのRubyプログラムをcronに設定すれば、定期自動監視も可能になります。
これで夜も安心して眠れますね。

また、今回のソースコードは以下にて公開していますので、ぜひご参考にして下さい。
github.com


虎の穴では、現在エンジニアの仲間を絶賛募集しています。
Rubyを使ったシステム開発も多数ありますので、
興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。

www.toranoana.jp