スマートスピーカーとネットワークAPI
去年頃から、様々なスマート スピーカーが発売され、日本でも色々選んで買えるようになりました。最初は時刻や天気を尋ねたり、音楽やニュースを再生してもらったりするところですが、エンジニアにとってスマート スピーカーの楽しいところは、やはり後方で動くロジックを自分でも追加・開発できる部分でしょう。
ネットワーク装置やコントローラーも、最近ではすっかりオープン化が進み、API(Application Programmable Interface)やSDK(Software Development Kit)も比較的身近になりました。いまや、通信事業者やデータセンター向けの大規模な製品はもちろんのこと、企業・組織を対象とした小規模ルータやスイッチでも、本格的にサポートされています。
実は我々ネットワーク エンジニアの方が、技術の変化・進化について行くのが精一杯…というのも現実かもしれませんが、遊び心を忘れてはいけません!新しい発想は、遊び心から生まれる!と信じて疑わない私は、早速スマート スピーカーと自宅のスイッチを連携させて遊んでみました。
時期的に、シスコの有志で Qiita アドベント カレンダーをやってみよう!という企画にも便乗し、スマート スピーカーからシスコ スイッチ経由で、クリスマス ツリーを光らせてみました。(以下は、アドベント カレンダー記事を少し書き直しての転載になります。)
Qiita アドベント カレンダーの記事はこちらです。
https://qiita.com/kikuta1978/items/12f9ef8c5f7a64652b12
スマートスピーカーから自宅スイッチポートの操作
最初、Vlan 変更やスイッチ ポートの開閉をやってみたのですが、地味過ぎて悲しかったので、スイッチポートの PoE 機能をネットワーク API 経由で enable/disable することで、クリスマス ツリーのイルミネーションを点灯・消灯することにしました。少しだけ、華やかになりました。
デモ1:「Network close」「Network open」
スマート スピーカーにお願いして、Vlan を変更しています。(隔離 Vlan と公開Vlanのイメージ)
※以下、クリックするとyoutubeが開きます。
デモ2:「Network power on」「Network power off」
スイッチ ポートは Up のまま、PoE を On/Off しています。(PoE から給電されたワイヤーライトが点灯・消灯)
※以下、クリックするとyoutubeが開きます。
利用したサービスとその構成
- Alexa Developer アカウント : IFTTT から連携できるよう、登録しておく
- IFTTT : 「My Applet」を作成、Amazon Alexa でトリガー、zapier へ Webhook を発行
- zapier : IFTTT からの Webhook を受け、登録した Python スクリプトを実行
- Meraki : zapier の Python スクリプトから、自宅 Meraki のダッシュボード API を操作
方針
- 自宅のネットワーク(Meraki)を使います。Cisco Meraki は、クラウド集中管理型で提供される、無線 LAN、LAN スイッチ、UTM(Unified Threat Management)などから構成されるネットワーク製品です。コントローラーがクラウドにあるので、API 接続が楽ちんです。Meraki Dashboard API のオンラインドキュメントによると、スイッチ ポートや SSID、ルーティング設定など色々できそうです。
- IFTTT を使って Alexa を発行するイベントを用意します。IFTTT とは、「IF This Then That」というコンセプトで、Web サービスを連結する Web サービスだそうです。Alexa のスキル開発には、Amazon 開発者コンソールから ASK(Alexa Skill Kit)の準備、およびイベントに応答してコードを実行するエンドポイントとして推奨される AWS Lambda(いわゆるサーバレス)か、自分のサーバを用意する必要があります。わかりやすくできているといっても、多少の学習コストがかかるので、今回は楽ちんであることを優先してIFTTT を使います。
- IFTTT のアクションを決めます。当初、Meraki API へ接続する Webhook を設定できればと思ったのですが、Meraki API では、HTTP ヘッダに X-Cisco-Meraki-API-Key を認証情報として設定しておく必要があり、IFTTT のアクションではこれを満たせません。zapier では、WebHook 受信をトリガーとして自分で登録した Python スクリプトを実行できます。逆に zapier では、現時点では Alexa と連携してトリガーさせることはできないようです。そのため、Alexa で IFTTT をトリガーして WebHook を zapier に送信し、zapier は WebHook を受け取ると Meraki API を操作する Python スクリプトを実行する、という構成にしました。
Pythonスクリプトの登録
IFTTT から zapier に送信する WebHook では、カスタム Body で変数を渡せるので、Vlan 番号や Enable/Disable など、Alexa の呼び出しに応じて zapier で実行する Python スクリプトの変数を補完しています。
Meraki ダッシュボード API
Meraki ダッシュボード API を使うには、API アクセスを有効化して、API キーを取得しておく必要があります。
Meraki ダッシュボード API を操作するサンプルです。Vlan 番号の変更とスイッチポートを Enable する Python スクリプトになっています。めちゃくちゃシンプルです。詳細は、オンラインドキュメントを参照ください。
import requests
url = "https://dashboard.meraki.com/api/v0/devices/スイッチシリアル番号/switchPorts/スイッチポート番号"
#ポートをenable、Vlanを10に変更
querystring = {"enabled":"true","vlan":"10"}
#ヘッダーのx-cisco-meraki-api-keyで認証
headers = {
'content-type': "application/x-www-form-urlencoded",
'x-cisco-meraki-api-key': "MerakiAPIキー",
}
response = requests.request("PUT", url, headers=headers, params=querystring)
print(response.text)
まとめ
ほとんどコードを書かずに、Alexa から自宅のネットワークを制御することができました。Meraki に限らず、今どきの業務用ネットワーク機器やネットワークコントローラーはたいがいオープン API を備えているので、Alexa(Echo Dot)などのスマート スピーカーと連携させると楽しいですね。(ネットワーク側に API がなくても、Ansible とか挟めば良いでしょう。)
音声一発で、ネットワークインベントリレポートを発行するとか、無線LANの電波をOff/Onするとか、疎通テストを実行して結果を発行するとか、平常時と緊急時の QoS ポリシーを入れ替えるとか、トラフィックを East/West に寄せてみたりとか…。いろいろと妄想が膨らみます。
今は、デジタルビルディングなるソリューションもあるようです。今は遊んでいるつもりですが、将来の仕事に役立つことになるかもしれません。ネットワーク エンジニアの守備範囲も、どんどん広っていくようです。機能を理解するだけではなく、それを使って何ができるか、想像力も求められるようになっている気がします。
参考
- Cisco DevNet ラーニングラボ :「プログラミングとか知らないよ!」というネットワーク エンジニアや、「ネットワーク製品の API とか知らないよ!」というアプリケーション エンジニアの皆さん、シスコには無料でこっそり自習できるラーニングラボ サイトがあります。ぜひ、ご活用ください。まだまだ英語コンテンツが中心ですが、日本語化したコンテンツも増えていく予定です。
- Cisco DevNetサイト:API や SDK をはじめとした技術情報や、イベント情報を公開している、開発者のためのサイトです。