usacloudでクーポン残高を監視してSlackへ通知する

さくらのクラウドで待望のクーポン残高取得APIが公開されましたね!!

cloud-news.sakura.ad.jp

これまではいつのまにか使いすぎてた、とか有効期限が切れてる、なんてこともあったかと思いますが、このAPIを利用すれば残高や有効期限を監視できますのでバッチリですね!!

[UPDATE] スクリプトの誤りを修正しました 2018/1/26 17:10

クーポン残高取得APIの使い方

APIドキュメントはこちらにあります。

developer.sakura.ad.jp

今回はcurlコマンドを使う方法とさくらのクラウド CLI usacloudを使う方法を紹介します。

curlコマンドを使う場合

curlコマンドで直接APIを叩く場合は以下のようにします。

$ TOKEN=APIトークン
$ SECRET=APIシークレット
$ ACCOUNT_ID=アカウントID
$ curl --user "$TOKEN":"$SECRET" \
     https://secure.sakura.ad.jp/cloud/zone/is1a/api/system/1.0/coupon/$ACCOUNT_ID

APIキー(トークン/シークレット)はコントロールパネルのAPIキー画面からコピペでOKです。 アカウントIDはアカウント画面のリソースIDというやつです。

f:id:febc_yamamoto:20190126112504p:plain

レスポンスは以下のようになります。

{
  "AllCount": 1,
  "CountPerPage": 1,
  "Coupons": [
    {
      "AppliedAt": "2019-01-10T11:12:13+09:00",
      "ContractID": "111111111111",
      "CouponID": "xxxxxxxxxxxxxxxx",
      "Discount": 999999,  // クーポン残高
      "MemberID": "abc99999",
      "ServiceClassID": 50122,
      "UntilAt": "2019-03-31T23:59:59+09:00" // クーポン有効期限
    }
  ],
  "Page": 1,
  "is_ok": true
}

あとはこれを加工すれば良いですね。

さくらのクラウド CLI usacloudを使う場合

usacloudにおいてもv0.18からクーポンAPIに対応しました。

github.com

usacloudの場合、アカウントIDは実行時にAPIキーに紐付いたアカウントの情報を参照して設定しますので、APIキーだけ用意すればOKです。

ということで早速試してみます。

今回はこちらのUsacloud Sandboxを利用して実行してみます。

sandbox.usacloud.jp

こちらを開いて適当にウィンドウ内(黒い部分)をクリックするとusacloudが使えるようになります。

まずusacloud configコマンドを実行してAPIキーを入力します。

f:id:febc_yamamoto:20190126113635p:plain

デフォルトゾーン/出力タイプも聞かれますが何も入力しなくてOKです。

その後 usacloud couponコマンドを実行するとクーポン一覧が表示されます。

f:id:febc_yamamoto:20190126113900p:plain

(このアカウントには有効なクーポンが適用されてないためDiscount列が表示されてませんが、本来はDiscount列に残高表示されます。)

出力をJSONにする-o jsonオプションやJSONの加工が行える--queryオプションなどもありますので色々と試してみてください。

定期的にクーポン残高を取得してSlackに通知する

APIを直接叩いたりusacloudコマンドを使うことでクーポン残高の取得ができました。
次にこれを応用して定期的にクーポン残高を取得して、閾値を下回っていた場合にはSlackに通知するようにしてみます。

クーポン残高を取得してSlackに通知するスクリプト

ということでこんなスクリプトにしてみました。

#!/bin/bash

# パラメータ
URL=${SLACK_WEBHOOK_URL}
REMAINING=${COUPON_MIN_REMAINING}

# バリデーション
if [[ -z "${URL}" ]]; then
  echo "SLACK_WEBHOOK_URL is empty. exit(2)"
  exit 2
fi

expr "$REMAINING" + 1 > /dev/null 2>&1
RET=$?
if [[ $RET -gt 1 ]]; then
  echo "COUPON_MIN_REMAINING is not a number. exit(2)"
  exit 2
fi

# クーポン残高取得
DISCOUNT=`usacloud coupon --usable -o json --query 'sum([].Discount)' 2>/dev/null`
if [[ -z "$DISCOUNT" ]]; then
  JSON="{ \"text\": \"さくらのクラウドに有効なクーポンが登録されていません。\" }"
  curl -s -X POST -H 'Content-Type: application/json' -d "$JSON" $URL
  exit 0
fi

expr "$DISCOUNT" + 1 > /dev/null 2>&1
RET=$?
if [[ $RET -gt 1 ]]; then
  echo "'usacloud coupon' command returns invalid value: '${DISCOUNT}'"
  exit 2
fi

# 残高が閾値を下回っているか判定
if [[ "$DISCOUNT" -le "$REMAINING" ]]; then
  # SlackのWebHookを叩く
  JSON="{ \"text\": \"さくらのクラウドのクーポン残高が${DISCOUNT}円になりました。\" }"
  curl -s -X POST -H 'Content-Type: application/json' -d "$JSON" $URL
fi

ポイントはusacloudコマンドを実行してる部分です。 以下のように実行しています。

    usacloud coupon --usable -o json --query 'sum([].Discount)' 

まず--usableオプションをつけることで、残高があり有効期限内のクーポン情報のみ取得するようにしています。 その後-o json--queryでクーポン残高を算出しています。 ここでは単純に各クーポン情報のDiscount列を合計するようにJMESPathでsum([].Discount)と指定しています。

これを適当なファイル名で保存/実行権付与して実行してみます。ここではusacloud-coupon-monitor.shとしました。 SlackのWebhookURLは適当に取得しておきます。

$ export SAKURACLOUD_ACCESS_TOKEN=APIトークン
$ export SAKURACLOUD_ACCESS_TOKEN_SECRET=APIシークレット
$ export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/xxxx/xxxx/xxxxxxxx" # SlackのWebhookURL
$ export COUPON_MIN_REMAINING=3000 # クーポン残高の閾値

$  ./usacloud-coupon-monitor.sh

これを実行するとSlackに以下のような通知が届くはずです。 (アイコンなどは適当にSlackのWebhook管理画面で編集してます)

クーポンが登録されていない/有効期限が切れた場合:
f:id:febc_yamamoto:20190126115853p:plain

残額が閾値を下回った場合:
f:id:febc_yamamoto:20190126115315p:plain

これでうっかりクーポンの有効期限切れ/使いすぎを防げますね!

あとはこれをcronなりlaunchdなりに登録して毎日実行するようにすればOKです。

終わりに

今回はクーポンAPIを試してみました。

今回のスクリプトでは期限が切れたら or 残額が閾値を下回ったら通知をしていますが、 少し工夫すれば有効期限が残りn日になったら通知、といったこともできると思います。

usacloudではjson以外にもcsvやtsv、Goテンプレートによるカスタム出力にも対応してますのでお好みの方法で色々試してみてください。

以上です。