実践で学ぶクラウド監視:SwitchBotのデータをNew Relicで監視を自動化してみた

記事タイトルとURLをコピーする

こんにちわ!サーバーワークス日本最南端社員の久保玉井(くぼたまい)です。

最近弊社ではNew Relic社と販売パートナー契約を結んだニュースリリースが発表されました。

www.serverworks.co.jp

また直近では、沖縄で2/23にNew Relic User Groupの勉強会も開催されます。

「これは一度も触った事無いNew Relicを触るチャンスだな!」

そう考え、今回実践的に使ってみようということで手元にあるSwitchBotのセンサーデータを収集し、それをNew Relicで監視するって内容を試してみました。

  • SwitchBot温度計を持っている
  • New Relicでその温度計のデータを記録してみたい

そんな方の為にステップバイステップで解説します。どなたかの参考になれば幸いです。

New Relicって何?

そもそも「New Relic」とは何か?

New Relicは、リアルタイムでアプリケーションやシステムのパフォーマンスを監視し、問題解決を支援するクラウドベースの監視プラットフォームです。

newrelic.com

ZabbixやDatadog、Mackerelなどのようなシステムを監視計測するSaaSですね。

日本ですと朝日新聞様、ぐるなび様など様々なお客様が利用されているご様子です。

newrelic.com

検証したいがデータどうしよう・・

監視プラットフォームであるNew Relic、勉強するためにも検証したい。

しかし、何を監視すればいいのか?具体的なデータが必要になります。手元にIoT関係の機器とかあってそれの計測できたら面白いなぁ~と考えたら。。ありました!

SwitchBot温度計は、温度や湿度などの環境データを簡単に収集できるスマートデバイスです。

今回はこのデータを取得してNew Relicに送信することに決めました。

事前調査

やりたいことが決まったのでそれが実現できるか事前に確認が必要ですね。

今回はSwitchBot側とNew Relic側それぞれで事前確認をしました。

SwitchBot側でAPIが公開されているか?

まず、SwitchBotのデータを取得したいので、SwitchBot側でAPIが公開されてないか調べてみたらありました。。

github.com

SwitchBot API v1.1 として公開されており、サンプルのコードも各言語毎に公開されていました。

import json
import time
import hashlib
import hmac
import base64
import uuid

# Declare empty header dictionary
apiHeader = {}
# open token
token = '' # copy and paste from the SwitchBot app V6.14 or later
# secret key
secret = '' # copy and paste from the SwitchBot app V6.14 or later
nonce = uuid.uuid4()
t = int(round(time.time() * 1000))
string_to_sign = '{}{}{}'.format(token, t, nonce)

string_to_sign = bytes(string_to_sign, 'utf-8')
secret = bytes(secret, 'utf-8')

sign = base64.b64encode(hmac.new(secret, msg=string_to_sign, digestmod=hashlib.sha256).digest())
print ('Authorization: {}'.format(token))
print ('t: {}'.format(t))
print ('sign: {}'.format(str(sign, 'utf-8')))
print ('nonce: {}'.format(nonce))

#Build api header JSON
apiHeader['Authorization']=token
apiHeader['Content-Type']='application/json'
apiHeader['charset']='utf8'
apiHeader['t']=str(t)
apiHeader['sign']=str(sign, 'utf-8')
apiHeader['nonce']=str(nonce)

トークンやシークレットキーを取得し準備すれば、SwitchBot側のデータ取得できそうな事がわかったので早速スマートフォンアプリから取得しました。

ちなみに上記のトークンやシークレットキーの取得方法ですが、GitHubでは以下の様に説明がありました。

Generate an Open Token within the app a) Go to Profile > Preference b) Tap App Version 10 times. Developer Options will show up c) Tap Developer Options d) Tap Get Token

アプリの「プロフィール」から「設定」を開き、「アプリバージョン」の項目を10回タップすると、「開発者向けオプション」が表示されます。

その中にトークンやシークレットキーが表示されますので、取得できます。

New Relic側でAPIが公開されているか?

SwitchBotAPIで取得したデータを今度はNew Relicへ送信しちゃえばOKですよね。

New RelicでもAPI公開されているか確認してみるとありました。

docs.newrelic.com

説明内容にて「ライセンスキー」なるものがあって有料なのか?と思っていたら、同僚の大城さんがX(旧Twitter)で教えてくれました。

なるほどー!キーも複数種類あるって事なんですね。

New Relic側の設定を見てみるとたしかにあるある。

じゃぁどちらもAPIで処理すればデータ取得→データ送信が出来るってことがわかりました。

実装してみる

Switchbot → API叩いて取得 → 必要なデータだけを抜粋 → New Relicへ送る

この流れになるのが解ったので、APIを呼び出す環境が必要になります。とりあえずコード書く必要になったのでCloud9環境を立ち上げて準備してみました。

環境変数設定する

APIを呼び出すコードを書いていくのですが、コード内にアクセスキーやらシークレットキーやら直に書くのは危険です。何より他の人がつかいづらいです。

よって環境変数設定することにしました。

export SWITCHBOT_TOKEN=1234567891234567 #アプリから取得したトークンを記載
export SWITCHBOT_SECRET=123456789 #アプリから取得したシークレットを記載

あとは上記の環境変数をプログラム言語側から使えばOKですね。

Pythonコードを書いて実装していく

SwitchBotのデータを取得するサンプルコードがGitHubでも公開されていますので、それを参考にしながらコードを書いていきます。

ただ書いていて読みづらい部分もありましたので、ChatGPTやGoogle Bardなど生成AIの力を借りてコード作成の効率化を図っていきました。

具体的にはこんな感じで都度都度聞いてました。

Google Bardちゃんからも提案が返ってきます。

コード内容そのまま利用するのも危険ですし、より良い方法があるかもしれません。

いったん内容を精査し、ChatGPT、Google Bardどちらの提案内容が良いのか判断してPythonコードを書いていきました。

コード出来たのでGitHubに公開しました。

一応コードを書いていき準備が出来ましたので今回は以下リポジトリで公開しました。

github.com

今回わかりやすくするために、段階を踏んでコードを別ファイルに書いていきました。

1.getdevice-switchbot.py
Switchbot へ登録しているデバイスの情報を一覧で取得します

2.getstatus-switchbot.py
上記で取得したデバイス情報を指定し、デバイスで管理している各種情報を取得します Switchbot 温度計で管理している温度・湿度を取得するのが目的です

3.status-to-newleric.py
Switchbot 温度計で管理している温度・湿度の情報をNew Relic へ送信します。

4.status-to-newleric-lambda.py
最終的にLambdaで動作させるコードになります。

先に設定した環境変数が正しければ、ちゃんとAPI経由でデータ取得できるのが確認できました。

あとは同様に取得したデータをNew Relic側へAPI利用して送信すればOKです。

Lambda関数を作る

Cloud9側で準備ができましたので、Lambda関数化していきます。

まずは環境変数を設定しちゃいます。

SwitchBotで利用するトークンやシークレット、またNew Relicで利用するライセンスキー、最後にデータを送信したいSwitch BotのデバイスIDを指定します。

Lambdaレイヤーの設定

今回Pythonでコードを記載しましたが、そのなかでPythonモジュールのrequestsを使う指定をしています。しかしLambdaで準備されているPythonではそのモジュールは準備されていません。

よって最初はエラーが出ました。

じゃぁどうすればよいのか?

Lambdaレイヤー側でPythonのrequestsモジュールを利用するように追加設定すればよいのですが、自分で準備するのが面倒だなと・・

業務利用じゃないし、個人検証用なんでGitHubで公開されているLambdaレイヤーを使う事にしました。

github.com

Pythonバージョン、モジュール毎にARNで公開されていますので、それを指定し利用することにしました。

Lambdaレイヤー追加してテストしてみると。。うん!動いてる!

EventBridge Scheduler で10分間隔でLambda関数を実行する

Lambda関数でSwitchBotのデータをNew Relicへ送信することが出来ました。あとはこれを定期的に実行すればOKです。

今回はEventBridge Scheduler を用いて定期間隔で作ったLambda関数を動作させることにしました。

docs.aws.amazon.com

温度と湿度の計測データをNew Relicで10分間隔で記録したかったので10分毎にLambda関数を動かします。

New Relic側でデータを見てみる。

Lambda関数でデータを送りましたが、いよいよNew Relicでデータを見ていきます。

ナビゲーションペインのQuery Your Dataに送られたデータが蓄えられてるのでそこから探します。

Data explorerからMetric名を指定してデータを探していきます。今回はtemperature(温度)とhumidity(湿度)が対象データなので部分入力して探します。

計測した値がグラフにプロットされ表示されました!

NRQLで集計内容を指定していく

New RelicですがSQLライクな言語が準備されており、そこで様々な計測データを集計表現することが出来ます。

SQLっぽく書いた後にRUNすると・・

グラフが生成されますー!!(ここでテンション爆上げ)

作成された内容はダッシュボードに追加することが出来ます。

ダッシュボード作ってニヤニヤする

あとは送ったデータ複数を1つのダッシュボードにまとめたりしてニヤニヤする時間です。

ちなみにこのダッシュボードってNew Relicアカウント外から閲覧できたりする方法ないのかな?と思って未だに探しきれてない状況です。

まとめ

New RelicですがGoogleアカウントがあればサクッと使えて、しかも一定範囲であれば無料でした。

更に今回はNew Relic側のAPIも無料で利用が出来たので、さくっとSwitchBotのセンサーデータを監視することが出来るようになりました。実際にグラフ生成することも出来てかなり面白かったですね。

来る2/23に沖縄で開催されるイベント前にNew Relicの体験が出来たので、当日はより一層楽しめそうです。

nrug-okinawa.connpass.com

なお、本記事に関してご質問やフィードバックがあれば、X(Twitter)などのソーシャルメディアでお知らせください。一緒に学び、成長していきましょう!

以上、最後までお読み頂きありがとうございました。

久保玉井純(執筆記事の一覧)

アプリケーションサービス部

サーバーワークス日本最南端社員。
最近、AWS Authorized Instructor Award 2022で表彰いただきました。引き続きわかりやすいトレーニング提供できるように頑張ります!