話題の記事

Google HomeからEC2インスタンスを停止させてみる #GoogleHome

2017.10.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうも!大阪オフィスの西村祐二です。

とうとう私の家に音声認識デバイスの「Google Home」が来ました! ということでIFTTTとAPI GatewayとLambdaをつかって Google HomeからEC2インスタンスを停止させてみたいと思います。

概要

Google Homeの音声認識部分は「Google Assistant」が担っております。 IFTTTというサービスはその「Google Assistant」をトリガーに設定することができ、 さらに、Webhookも利用できるので、

Google Home ↓ IFTTT ↓ API Gateway ↓ Lambda というようにGoogle HomeからLambda関数を実行することができます。

この仕組みを利用して、Google HomeからEC2インスタンスを停止させてみたいと思います。

構成図

googlehome-instance-stop.001

事前準備

  • EC2インスタンスを1台たてておいてください。
  • IFTTTのアカウントを作成しておいてください。

手順

  • インスタンスを停止するLambda関数の作成
  • API GatewayでAPIの作成
  • IFTTTでAppletの作成

では、さっそくやっていきましょう!

インスタンスを停止するLambda関数の作成

プログラムをのせていますがサンプルとしてのLambda関数なのでご利用は自己責任でお願い致します。

マネージメントコンソールから作成していきます。

▼「関数の作成」をクリックします。

2017-10-21 23.20.43

▼「一から作成」をクリックします。

2017-10-21 23.20.59

▼Lambda関数の設定を行います。

  • 名前:instance-stop
  • ロール:カスタムロールの作成(インスタンス停止の権限付与)
  • ロール名:lambda_instance_stop

今回、ロールは専用のものを作成しました。 既存のものでも構いませんが、EC2インスタンスを停止する権限が必要となります。

2017-10-21 23.21.37

2017-10-21 23.31.03

▼「関数の作成」をクリックします。

2017-10-21 23.34.40

▼関数コードを設定します。

  • ランタイム:Python3.6

下記サンプルプログラムをコピペしてください。 INSTANCE_IDには事前に用意したインスタンスIDを設定してください。 Lambdaに渡ってきたeventの中に「stop」があるときにインスタンスの停止を行うようにしています。

2017-10-22_0_12_07

import boto3

INSTANCE_ID = 'i-xxxxxxxxxxxxxxx'
ec2 = boto3.resource('ec2')
ec2instance = ec2.Instance(INSTANCE_ID)
p
def handler(event, context):
    if event['operation'] == 'stop':
        ec2instance.stop()
        print('Instance Stop!')
    else:
        return('Error End')

▼動作確認をします。

※事前に用意したEC2インスタンスを起動しておいてください。

「保存してテスト」をクリックし、テストイベントを設定します。 テストイベントの設定が完了したら、保存してテストします。 うまくいけば設定したインスタンスが停止するはずです。

  • イベント名:test

2017-10-21 23.43.18

{
"operation": "stop"
}

動作確認で問題なければ、Lambda関数の作成は終わりです。

APIの作成

API GatewayでLambdaをキックするためのAPIを作成します。 マネージメントコンソールから作成していきます。

▼「APIの作成」をクリックします。

2017-10-22_0_35_37

▼作成するAPIの名前を設定し「APIの作成」をクリックします。

  • API名:instance-stop

2017-10-22 0.39.34

▼リソースのアクションから「メソッドの作成」をクリックし、「POST」を設定します。

2017-10-22_0_43_43

▼POSTのセットアップを行い「保存」をクリックします。

  • 統合タイプ:Lambda関数
  • Lambdaリージョン:ap-northeast-1
  • Lambda関数:instace-stop

2017-10-22 0.41.12

▼「APIのデプロイ」をクリックします。

2017-10-22_0_41_35

▼デプロイするステージを設定し、「デプロイ」をクリックします。

  • ステージ名:test

2017-10-22 0.46.24

▼作成したAPIのURLを確認します。

IFTTTにて使用しますので、URLをメモしておいてください。

2017-10-22_0_47_12

IFTTTでAppletの作成

IFTTTにアクセスし、ログインします。

▼「MyApplets」をクリックします。

2017-10-22_1_18_29

2017-10-22_1_19_29

▼トリガーにする「Google Assistant」を検索し、クリックします。

2017-10-22_1_19_49

2017-10-22 1.20.34

▼「Connect」をクリックし、Google Homeに設定しているアカウントと紐付けます。

2017-10-22 1.20.43

▼「Say a simple phrase」をクリックします。

2017-10-22_1_22_38

▼OK、Googleの後のフレーズやGoogle Homeからの返答を設定し、「Create tregger」をクリックします。

2017-10-22 2.10.07

▼トリガー発動時のアクションとして「webhooks」の設定を行います。

2017-10-22_1_29_52

2017-10-22 1.30.21

2017-10-22 1.30.35

▼「Make a web request」をクリックします。

2017-10-22 1.30.51

▼API Gatewayで作成したAPIのURLやLambdaに渡すBodyの設定など行い、「Create action」をクリックします。

  • URL:メモしたURL
  • Method:POST
  • Content Type:application/json
  • Body:{"operation" : "stop"}

2017-10-22_1_33_12

▼「Finsh」をクリックし、Appletを作成します。

2017-10-22_2_11_36

▼作成したAppletを「on」しておきます。

2017-10-22_2_42_57

これですべての設定が完了です!

動作確認

ちゃんと動くかなぁ。。。

設定どおりにインスタンスの停止が行われていますね! 音量小さく聞き取りづらいですが、設定した「まいど!おおきに!」もきちんと言ってくれていますね!

さいごに

いかがだったでしょうか。

IFTTTとAPI GatewayとLambdaをつかって Google HomeからEC2インスタンスを停止させてみました。 API Gateway+Lambdaで何か構築したことがある方は 簡単にできるかと思います。

日本でも音声認識デバイスが流行って欲しいです。

誰かの参考になれば幸いです。