EC2インスタンスから自宅のGoogleHomeに発言させる

google-home-notifier - Github を利用すると、
「OK. Google.」のトリガーを不要にし喋らせたい内容をサーバからPUSHできる。
ただ、自宅にサーバ用途にできそうなPCもないのでどうしようかと迷ったので
AWSのEC2インスタンスを使うことにした。
ただ、GoogleHomeのポートをグローバルに公開するのもなかなか危険なので
VPCと自宅のFortigateでサイト間VPN接続を行うことにした。

全体構成

AWS側はVPCを作って、インスタンスを立てただけ。
自宅側はプロバイダの制約により、FortigateでPPPoE接続ができないため、
ホームルータのNAT配下に設置。
ただし、ホームルータの機能にDMZパススルー機能があるため
FortigateのWAN1に接続に利用するIPアドレス 192.168.172.2 をパススルーのIPとして登録しておく。
AWSのVPN接続は、IPSecを2本張るので、BGPによる経路交換も必要となる。
(基本は1本しか使わないと思うんだけど)

GlobalIPが変更になったらIPSec切れちゃうでしょとか思うですが、
契約してからここ5年くらい経つけど、GlobalIPは一度も変わってない。
auひかりの仕様では動的グローバルIPを割りあてるよって書いてあるけど、
ホームルータが認証情報を持っているのか、ハードウェアを交換しない限りはIPアドレスは変わらなさそう。

GoogleHomeは事前にWifiに接続しておいてIPアドレスを確認しておく。

AWS側作成

TerraformでVPCネットワーク部分だけを作成してみた。
書いた後に気づいたけど、ルートテーブルに自宅側のルーティング情報をルートテーブルに書いてなかったので、VPN構築後に手動追加した。
インスタンスも手動追加するので、Terraformでは記載していない。

インスタンス作成

CentOS7のAMIからインスタンスを生成, 作成したVPCネットワークに所属させる。
yarn, node, google-home-notifierのインストールを行う

自宅側

AWSでVPN接続の作成後、画面からサンプルコンフィグを落とせるのでダウンロード。
自宅のFortiOSは5.2系なのだけれどサンプルのままじゃ通らないコンフィグがあるので注意。
VPN接続の作成時に自宅側のグローバルIPアドレスを入力するため、
サンプルコンフィグではlocal-gwにグローバルIPアドレスが記述されているが、
ここはFortigateのWAN1のIPアドレス192.168.172.2に変更する必要がある。
後は、VDOMも今回は使わないので、コンフィグはこんな感じに。

コンフィグを入力してしばらくすると接続が完了する。
接続状況はAWSのVPN接続の詳細画面でアップになっているかを確認する。

実際に喋らせてみる

サーバ側に用意したプログラム(ほぼサンプル)。
下記を実行すると、GoogleHomeが「こんばんは」と喋ってくれる。

const googlehome = require('google-home-notifier')
const language = 'ja';

googlehome.ip('192.168.1.112', language);

googlehome.notify('こんばんは。', function(res) {
  console.log(res);
});

雑感

  • 自宅にサーバ置いてないので、意外と大掛かりな構成になってしまったけど、この構成ならAWSからでも発言させたい内容はPUSHできるので、自宅にサーバを置かないと決めてる方でもいけそう。(Fortiは使うし、グローバルIPは固定だけど)
  • 本当はEC2インスタンス立てずにLambdaでやりたいけど、google-home-notifierってLambdaいけるかは分かってないので、この辺りも動作検証したい
  • 料金見積もりしたらVPN接続とインスタンス台で毎月30ドルくらいかかっちゃうので、思ったよりはコスト高かった…(笑)
  • AWSのVPN接続は作成か終了しかないのだけれど、「停止」も欲しいなって思った(需要あんのかな)

Amazon Echo届いたので、明日からはAlexaスキル作って遊びたいと思います。
おしまい。