Google Home で新しいサーバを瞬時に作る

Google HomeTech

ふと新しいサーバが必要になったとき、声に出すだけでサーバが作れると便利ですよね。
せっかく我が家にも Google Home mini がやってきたので試してみました。

「OK, Google. 新しいサーバを立てて」と言うだけで、瞬時にサーバを構築して、接続用のグローバル IP を教えてくれる機能 です。

使いかた

百聞は一見にしかず。動画を撮ってみました。

私「ねぇ Google. 新しいサーバを立てて
G『新しいサーバを立てました。IP アドレスは 13.230.……です。

Google に話しかけたのに AWS でサーバが構築されるという何とも言えない感じですが、仕組みとしては Azure や GCP でも対応できます。

システム構成

使用しているサービスや言語は下記の通りです。

使用したソースコードは GitHub にあります。

事前準備

  • EC2 を作成する Lambda (+ API Gateway) を準備
  • API Gateway を呼び出す Dialogflow アプリを準備
  • Actions on Google に AWS Contoller の名前でアプリ登録
    • 「AWS Controller につないで」で起動できるようになります。
  • 呼び出しを簡略化するため、ショートカット作成

Google Assistantのショートカット登録

処理詳細(往路)

声で指示を出してから、実際にサーバが構築されるまでの流れです。

Google AssistantからEC2を起動する処理

1. Google Assistant

  • 「新しいサーバを立てて」と指示する
  • ショートカットにより「AWS Controller につないで」と置き換えられる
  • Dialogflow アプリが起動される

2. Dialogflow

  • Webhook で Firebase Functions を呼び出す

3. Firebase Functions

  • API Gateway へリクエスト送信

4. API Gateway

  • AWS Lambda を起動

5. AWS Lambda

  • AWS SDK を利用して runInstances() を実行

6. Amazon EC2

  • Amazon Linux のイメージで t2.micro インスタンスが作成される

処理詳細(復路)

サーバが構築されてから、IP アドレス情報が返却されるまでの流れです。

EC2のIPアドレスをGoogle Assistantに伝える処理

1. Amazon EC2

  • 作成したサーバが起動し始める
  • グローバル IP アドレスが付与される

2. AWS Lambda

  • IP アドレスが付与されるまで、約300ミリ秒待機
  • インスタンス情報を再取得
  • 取得した情報を返却

3. API Gateway

  • Lambda からの情報を json 形式で返却

4. Firebase Functions

  • インスタンス情報を受け取る
  • 必要な IP アドレス情報のみ抜き出す
  • 応答文を作成「新しいサーバを立てました。IP アドレスは、13.230……です。」

5. Dialogflow

  • 応答文を読み上げるように Google Assistant へ指示

6. Google Assistant

  • Dialogflow アプリから受け取った応答文を読み上げる

動画をもう一度貼っておきます。

苦労した点

登場人物が多い

Google Assistant のアプリを初めて作ったため、仕組みの理解に時間がかかりました。今回は AWS も組み合わせたため、登場人物(?)が多すぎますね。

EC2 の IP 付与タイミング

EC2 インスタンスを起動した時にも詳細情報が返却されるのですが、そこにはグローバル IP アドレス情報が含まれていません。まだ付与されていないためです。
そのため、300ミリ秒ほど待ってからもう一度取得する、といった処理になっています。

アプリ名称

アプリを登録しても、Google Home が聞き取れる名称でないと呼び出せません。最初は、サーバ立てるマン という名称にしましたが、何度やっても呼び出せず……
不明な単語は自動補正されるため、そのまま文字通りに認識してくれないのですね。結局はショートカットで回避しましたが、一般公開するなら要注意です。

まとめ

  • Google Home で新しいサーバを立てられるようにしました
  • Dialogflow, Firebase, API Gateway, Lambda などを組み合わせました
  • Lambda を呼び出しているため、他にも応用可能です

こんなことは出来るのだろうか、という思いつきから始まりましたがちゃんと動いてくれたので驚いています。便利な時代になりましたね。

ソースも公開しているため、気になる方はぜひ作ってみてください。
不明点の質問や改善アドバイスなどもお待ちしております。