Edited at

Amazon Echo (Alexa) で自宅のネットワークを覗いてみる

More than 1 year has passed since last update.

この記事はシスコの同志による Cisco Systems Japan Advent Calendar 2017 の 17 日目です。


TL;DR


  • Cisco Meraki はクラウドでネットワーク全体を一元管理します



    • ネットワークの状況を Web インターフェイス / API で提供します



  • 今流行りの Amazon Echo (Alexa) を使って Meraki な自宅の状況を聴けるようにしてみました

  • ネットワークエンジニアなら朝のニュースで自宅のネットワークを確認しよう!!!


デモ

こればっかりは見るより聞いたほうがはやいです。


構成


方針



  • Cisco Meraki が提供する Dashboard API を使って、ネットワークの情報を取得します


    • Cisco Meraki のダッシュボードはネットワーク機器の状態だけではなく、高い通信の可視性を提供します
      ここをクリックしてダッシュボードのサンプルを表示






  • Amazon Echo (Alexa) を使って、ユーザインターフェイスを全て音声にします


    • Alexa Skills Kit の開発環境を使うことで、自分の Alexa だけで使えるオリジナルのフラッシュニュースを作ります


      • 会話例:「Alexa, 今日のニュースは?」「今日のニュースは....」





  • 1 時間おきに AWS Lambda で実行する Python スクリプトがニュース記事を作成して Amazon S3 に保存し、Alexa は 1 時間以内に作成されたニュース記事を読み上げます




具体的な構築手順

この記事ではスクリーンショット多めに、この環境の構築手順を細かく説明しています。時間がなければまとめに進んでください!


ニュース記事を作る


前提

AWS にアカウントがあり、AWS コンソールにログインできる必要があります。


1. KMS 暗号化キーの作成

今回の記事では Lambda 関数で実行する Python スクリプトが Cisco Meraki Dashboard API から情報を取得します。そのため、Python スクリプトは Meraki API の認証情報を必要とします。Amazon は機密情報を暗号化して保存することを強く推奨しているため、今回の記事では Meraki API の認証情報を暗号化して取り扱います。この節では認証情報の暗号化・復号化で使われる暗号化キーを簡単に作成および管理できるマネージド型サービス KMS の初期設定を行います。


1.1. KMS 暗号化キーの作成

AWS コンソールから IAM → 暗号化キー を開き、キーの作成 をクリックします。

適当な名前をつけて進めます。

キー管理アクセス許可の定義 及び キーの使用アクセス許可の定義 では自分のアカウントを選択し、ウィザードに従って暗号化キーを作成します。


1.2. 作成した暗号化キーの ARN を確認

この後の作業で必要になるので暗号化キーの ARN をメモします。


2. S3 バケットの作成

今回の記事では Lambda 関数で実行する Python スクリプトが定期的にニュース記事を作成します。この節では作成されたニュース記事を保存する受け皿(ストレージ ≒ バケット)を Amazon S3 に作り、このニュース記事を外部に HTTPS で公開するための設定を行います。


2.1. S3 バケットの作成

AWS コンソールから S3 を開き、バケットを作成する をクリックします。適当なバケット名をつけて 作成 をクリックします。


2.2. 外部公開のためのポリシー設定

作成したバケットの アクセス権 → パケットポリシー に外部公開のためのポリシーを設定します。

ここをクリックするとコピペ用の文字列が表示されます

<s3-bucketname> の部分は実際のバケット名に置き換えてください。

{

"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<s3-bucketname>/*"
}
]
}





3. IAM ロールの作成

今回の記事では Lambda 関数で実行する Python スクリプトが KMS 暗号化キーを使ったり、S3 バケットにファイルを保存したりします。この節ではまず、Lambda 関数が必要とする権限の定義(ポリシー)を作成します。最後に、ポリシーを使ってアクセス権の委任(IAM ロール)を行います。


3.1. IAM ポリシーの作成

AWS コンソールから IAM → ポリシー → ポリシーの作成 を開きます。S3 でポリシーを設定したときと同様に、ここでも ポリシーを json 形式で表現します。

ここをクリックするとコピペ用の文字列が表示されます

<s3-bucketname> <ARN-KMS> の部分は実際のバケット名及び KMS の ARN に置き換えてください。

{

"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::<s3-bucketname>/*"
},
{
"Effect": "Allow",
"Action": ["kms:Decrypt"],
"Resource": [
"<ARN-KMS>"
]
}
]
}



3.2. IAM ロールの作成

AWS コンソールから IAM → ロール → ロールの作成 → Lambda と進みます。ポリシーの一覧が表示されるので、先ほど作成したポリシーを選択します。

適当な名前をつけて IAM ロールの作成は完了です。


4. Lambda 関数の作成

AWS Lambda はサーバーを構築することなしにプログラムを実行することができるプラットフォームです。実行したいプログラムやその条件を設定するだけで、必要に応じてプログラムをサーバ(コンテナ)に展開してくれます。この節では Lamnda 関数を作成し、1 時間おきに自動実行されるように設定します。


4.1. 設計図を使って Lambda 関数を作成

AWS コンソールから Lambda を開き、関数の作成 を行います。

ここでは手順を簡単にするために、Lamba であらかじめ用意された設計図(テンプレート)lambda-canary-python3 を使います。これは定期的に Web サイトを確認して、エラーを検出するための Lambda 関数の設計図です。定期的に Meraki API を使ってニュースを作成する、という今回の記事に似ていますね :)

設計図に沿って設定を行います。基本的にデフォルトのままで問題はありませんが、IAM ロールとトリガーは設定が必要です。ここでいうトリガーとは Lambda 関数を実行する「きっかけ」「条件」のようなものです。今回は 1 時間おきのタイマーをトリガーとして設定します。入力例は以下の通りです。

Lambda 関数が作成されます。1 時間おきに自動的に実行するためのトリガー(CloudWatch Events)と、IAM ロールに基づいて KMS 暗号化キーS3 バケットへの関連付けが行われていることがわかります。


4.2. 関数コードのアップロード

次に Lambda 関数として実行する Python スクリプトを設定します。関数コード の欄から .zip ファイルをアップロード を選んで、Python スクリプト一式をアップロードします。今回の記事で使ったプログラムは upload.zip として公開しています。エラー処理などは不十分ですが、プログラミングすることなく、誰でも使い回せるように設計されています。


4.3. 環境変数の設定

ユーザごとに異なる変数は環境変数として Python スクリプトに入力します。このスクリプトでは以下の環境変数を使います。



  • enc_apikey: 暗号化済みの Cisco Meraki API キー (取得方法はこちら)


  • organization_name: Cisco Meraki 上の組織名


  • network_name: Cisco Meraki 上のネットワーク名


  • bucket_name: ニュース記事を保存するために先ほど作成した S3 バケット の名前

Meraki API の認証情報は暗号化するので、API キーを入力した後に 暗号化 ボタンを押してください。自動的に暗号化されます。


4.4. トリガーの有効化

画面上部の CloudWatch Events をクリックしてトリガーを有効にします。


4.5. 動作確認

画面右上の テスト をクリックして適当なイベント名を入力し、保存します。

テスト をクリックすればタイマーを待つことなく Lambda 関数を実行することができます。

以下のように表示されれば成功です。

AWS コンソールから S3 を開き、先程作成したバケットを開いてください。Lambda 関数によって作成されたニュース記事 news.json が見えます。このファイルへのリンク (https://.....) をメモしておきます。


ここまでのまとめ

ここまでで以下のことが出来るようになりました。


  • 1 時間に 1 回自動的に Lambda 関数が実行される

  • 環境変数で定義した情報を使って Lambda 関数は Cisco Meraki から情報を取得する

  • Cisco Meraki から取得した情報をもとにニュース記事を作成して Amazon S3 に保存する

以上の流れによって、インターネットからアクセスできる news.json にネットワークの状況がニュース記事として保存され、1 時間に 1 回更新されることになります。


Alexa でニュース記事を読み上げる


前提

Alexa を使うために Amazon Echo があると便利ですが、EchosimAlexa Voice Service を利用することもできます。それぞれの使い方についてはこの記事では触れません。

Amazon Echo のログインに使っている Amazon アカウントを使って アマゾン アプリ 開発者ポータル にログインできる必要があります。


1. Alexa スキルの作成

アマゾン アプリ 開発者ポータルから Alexa → Alexa Skills Kit → 新しいスキルを追加する を開いてウィザードに従ってスキルを作成します。

フィード(ニュース記事の情報源)を追加する画面では Lambda 関数の動作確認でメモしておいた news.json の URL を入力します。


2. Alexa スキルの有効化

スマートフォンで Alexa アプリを開くか、Web ページ を開いて、自分の Alexa で有効になっているスキルを確認します。

先ほど作成したスキルが勝手に登録されているので、スキルを開いて有効にします。

以上ですべての準備は終了です!


まとめ


  • ネットワークは問題が起こってから何かをアクションを取ることが多いですが、朝のニュース感覚でネットワークの状況を知ることができます


    • Meraki はネットワークの状況を表示する Public Status Page 機能がありますが、手軽さが段違いです



  • 今回は Alexa が一方的に喋るだけですが、会話によってネットワークを操作できると便利かもしれないですね


    • 声を使ってネットワークを操作する例は Cisco Systems Japan Advent Calendar 2017 の 11 日目 にあります

    • 「Alexa, 〜会議室のネットワークをゲスト用に設定して」「Alexa, 今から〜の端末で重要なビデオ会議を始めるよ」




参考