Alexaでネットワーク制御... ついでにクリスマスを彩る

# これは何？
Amazon Echo Dotにお願いして、ネットワークコントローラーのAPI経由で、ネットワーク機器の設定変更を行ってもらうサンプルです。なるべく楽ちんに行う方法を模索してみました。

最初、Vlan変更やスイッチポートの開閉をやってみたのですが、地味過ぎて悲しかったので、スイッチポートの[PoE機能](https://ja.wikipedia.org/wiki/Power_over_Ethernet)をネットワークAPI経由でenable/disableすることで、クリスマスツリーのイルミネーションを点灯・消灯を行ってみました。少しだけ、華やかになりました。

## デモ1：Alexa、「Network close」「Network open」
実際には、Vlanを変更しています。（隔離Vlanと公開Vlanのイメージ）
*クリックするとYoutubeが開きます
[![Ask Alexa to open & close my switch port](http://img.youtube.com/vi/dfHxSDMS82U/0.jpg)](https://youtu.be/dfHxSDMS82U)

## デモ2：Alexa、「Network power on」「Network power off」
スイッチポートはUpのまま、PoEをOn/Offしています。（PoEから給電されたワイヤーライトが点灯・消灯）
*クリックするとYoutubeが開きます
[![Ask Alexa to on & off my switch port power](http://img.youtube.com/vi/N7xOYmCt_ZQ/0.jpg)](https://youtu.be/N7xOYmCt_ZQ)

# 構成

## 物理構成
### デモ1
自宅のネットワーク構成です。普段はラック奥に配置してます。
![SS 2017-12-07 18.04.17.png](https://qiita-image-store.s3.amazonaws.com/0/157325/14d6d3b6-f79a-9a1c-4f6d-b4e6da15e17a.png)

### デモ2
※今回、購入したもの
・[PoEスプリッタ（TP-Link TL-POE10R）](http://www.tp-link.jp/products/details/cat-43_TL-POE10R.html) 
・[LEDワイヤーライト（2.1mmジャック、12V入力）](https://www.amazon.co.jp/gp/product/B01AALVG38/)
・ミニツリー
![SS 2017-12-07 18.04.31.png](https://qiita-image-store.s3.amazonaws.com/0/157325/06516055-0a38-5be0-d0c8-0a67e53c6601.png)

## サービス構成
![SS 2017-12-10 11.54.34.png](https://qiita-image-store.s3.amazonaws.com/0/157325/5f9e5f86-4fb0-ef0c-3f42-8d4935bc51df.png)

## 必要アカウント

1. [Alexa Developerアカウント](https://developer.amazon.com/edw/home.html#/skill/create/) ... IFTTTから連携できるよう、登録しておく
2. [IFTTT](https://ifttt.com/) ... 「My Applet」を作成、Amazon Alexaでトリガー、zapierへWebhookを発行
3. [zapier](https://zapier.com) ... IFTTTからのWebhookを受け、登録したPythonスクリプトを実行
4. Meraki ... zapierのPythonスクリプトから、自宅Merakiの[ダッシュボードAPI]((https://dashboard.meraki.com/api_docs))を操作

# 大まかな手順

## 方針
- 自宅のネットワーク（Meraki）を使います。[Cisco Meraki](https://www.cisco.com/c/ja_jp/solutions/meraki.html)は、クラウド集中管理型で提供される、無線LAN、LANスイッチ、UTM（Unified Threat Management）などから構成されるネットワーク製品です。コントローラーがクラウドにあるので、API接続が楽ちんです。
- Meraki Dashboard APIの[オンラインドキュメント](https://dashboard.meraki.com/api_docs)によると、スイッチポートやSSID、ルーティング設定など色々できそうです。
- [IFTTT](https://ifttt.com/)を使ってAlexaを発行するイベントを用意します。IFTTTとは、「IF This Then That」というコンセプトで、Webサービスを連結するWebサービス[だそうです](https://ja.wikipedia.org/wiki/IFTTT)。
- Alexaのスキル開発には、[Amazon開発者コンソール](https://developer.amazon.com/edw/home.html#/skill/create/)からASK（Alexa Skill Kit）の準備、および、イベントに応答してコードを実行するエンドポイントとして推奨される[AWS Lambda](https://aws.amazon.com/jp/lambda/)（いわゆるサーバレス）か、自分のサーバを用意する必要があります。わかりやすく出来ているといっても、多少の学習コストがかかるので、今回は楽ちんであることを優先してIFTTTを使います。
- IFTTTのアクションとして、Meraki APIへ接続する[Webhookを設定](https://ifttt.com/maker_webhooks)できればと思ったのですが、Meraki APIでは、HTTPヘッダに[X-Cisco-Meraki-API-Keyを認証情報として設定しておく必要があり](https://documentation.meraki.com/zGeneral_Administration/Other_Topics/The_Cisco_Meraki_Dashboard_API#API_Requests)、IFTTTのアクションではこれを満たせません。
- [zapier](https://zapier.com/)では、WebHook受信をトリガーとして、自分で登録したPythonスクリプトを実行できます。逆に、zapierでは、現時点ではAlexaと連携してトリガーさせることはできないようです。
- したがって、AlexaでIFTTTをトリガーしてWebHookをzapierに送信し、zapierはWebHookを受け取るとMeraki APIを操作するPythonスクリプトを実行する、という構成にしました。

## zapierで実行するPythonスクリプトの登録
IFTTTからzapierに送信するWebHookで、カスタムBodyで変数を渡せるので、Vlan番号やEnable/Disableなど、Alexaの呼び出しに応じてzapierで実行するPythonスクリプトの変数を補完しています。

![SS 2017-12-10 12.32.11.png](https://qiita-image-store.s3.amazonaws.com/0/157325/95f6b4ea-38db-b7cf-2271-35224c1213e8.png)

## Meraki ダッシュボードAPI
参考までに、MerakiダッシュボードAPIを操作するサンプルです。めちゃくちゃシンプルです。詳細は、[オンラインドキュメント](https://dashboard.meraki.com/api_docs)を参照ください。

```python3:meraki_sample.py
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)
```

Meraki ダッシュボードAPIを使うには、APIアクセスを有効化して、APIキーを取得しておく必要があります。
![SS 2017-12-10 13.03.16.png](https://qiita-image-store.s3.amazonaws.com/0/157325/29939658-e795-bf2f-0ac9-bd8aaf669e19.png)

# まとめ

- ほとんどコードを書かずに、Alexaから自宅のネットワークを制御することができました。
- Merakiに限らず、今どきの業務用ネットワーク機器やネットワークコントローラーはたいがいオープンAPIを備えているので、Alexa（Echo Dot）などのスマートスピーカーと連携させると楽しいですね。（ネットワーク側にAPIがなくても、Ansibleとか挟めば良いでしょう）
- 音声一発で、ネットワークインベントリレポートを発行するとか、疎通テストを実行して結果を発行するとか、平常時と緊急時のQoSを入れ替えるとか、トラフィックをEast/Westに寄せてみたりとか、、
- [デジタルビルディング](https://www.cisco.com/c/en/us/products/switches/catalyst-digital-building-series-switches/index.html)なるソリューションもあるようですね。
- ネットワークエンジニアの守備範囲も、どんどん広くなるかも...
- （遊んでいるつもりが、意外とお仕事になったりして）
- 機能的な理解はもちろん、想像力も求められるかもしれません。

# 参考
- シスコでは、「プログラミングとか知らないよ！」というネットワークエンジニアや、「ネットワーク製品のAPIとか知らないよ！」というアプリケーションエンジニアが、無料でこっそり自習できる[ラーニングラボ](https://learninglabs.cisco.com/)サイトを提供しています。是非ご活用下さい。
- [Cisco DevNet](https://developer.cisco.com/)サイトでは、APIやSDKをはじめとした技術情報や、イベント情報が公開されています。