Cloud Automator のジョブ実行結果を Google Home に喋ってもらう

この記事は「Cloud Automator Advent Calendar 2017」の 17 日目の エントリーとなります。

# Cloud Automator とは
Cloud Automator とは、Amazon Web Services（AWS）の運⽤に⽋かせない EC2 インスタンスのバックアップ、RDS インスタンスの起動 / 停⽌など、様々なオペレーションを⾃動化するサービスです。

https://cloudautomator.com/

# やったこと
さて、今月のはじめに Google Home mini が半額になっていたので購入しました。
折角購入したので Google Home で何か作ろうと思い、Cloud Automator のジョブ実行が完了した後に Google Home mini に喋ってもらうようにしました。

# 手順
私は普段の開発環境は全て EC2 インスタンス上に構築しており、毎朝 EC2 インスタンスを起動してから SSH で接続して EC2 上で開発を行っています。

今回は上記の開発環境がある EC2 を Cloud Automator のタイマートリガー ( 指定した時間にジョブを実行する ) で起動して、起動が成功した後に Google Home mini に喋ってお知らせしてもらうようにします。


<img width="761" alt="スクリーンショット 2017-12-16 16.02.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/12391/c43cde7c-3864-352f-f73f-7877bdb4aa8f.png">


### 1. Cloud Automator でタイマートリガーのジョブを作成する
Cloud Automator のタイマートリガーで 月~金 毎朝 9:00 に EC2 インスタンスが起動するジョブを作成します。
タイマートリガーのジョブ作成方法については、Cloud Automator 公式のマニュアルが用意されているので [こちら](https://support.serverworks.co.jp/hc/ja/articles/115008907248-%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BC%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC) をご参照ください。

### 2. Google Home mini が言葉を話せるようにする
[google-home-notifier](https://github.com/noelportugal/google-home-notifier) を利用することで、Google Home mini が言葉を話せるようになります。

まずは、google-home-notifier のセットアップをします。

```sh
$ git clone https://github.com/noelportugal/google-home-notifier
$ cd google-home-notifier
$ npm install
```

以下のファイルを編集します。
`ip` には Google Home のローカルIPが入ります。

```diff
$ git diff

diff --git a/example.js b/example.js
index da14fd3..f095a0d 100644
--- a/example.js
+++ b/example.js
@@ -6,22 +6,22 @@ var app = express();
 const serverPort = 8091; // default port

 var deviceName = 'Google Home';
-var ip = '192.168.1.20'; // default IP
+var ip = '192.168.0.x'; // default IP

 var urlencodedParser = bodyParser.urlencoded({ extended: false });

 app.post('/google-home-notifier', urlencodedParser, function (req, res) {

   if (!req.body) return res.sendStatus(400)
   console.log(req.body);

   var text = req.body.text;

   if (req.query.ip) {
      ip = req.query.ip;
   }

-  var language = 'pl'; // default language code
+  var language = 'ja'; // default language code
   if (req.query.language) {
     language;
   }

diff --git a/google-home-notifier.js b/google-home-notifier.js
index a9631cf..451b9e2 100644
--- a/google-home-notifier.js
+++ b/google-home-notifier.js
@@ -5,13 +5,13 @@ var browser = mdns.createBrowser(mdns.tcp('googlecast'));
 var deviceAddress;
 var language;

-var device = function(name, lang = 'en') {
+var device = function(name, lang = 'ja') {
   device = name;
   language = lang;
   return this;
 };

-var ip = function(ip, lang = 'en') {
+var ip = function(ip, lang = 'ja') {
   deviceAddress = ip;
   language = lang;
   return this;
```

google-home-notifier を起動します。
ngrok を使ったグローバルなエンドポイントが払い出されるので、これをコピーしておきます。

```sh
$ node example.js

Endpoints:
    http://192.168.0.x:8091/google-home-notifier
    https://xxxxxxx.ngrok.io/google-home-notifier
GET example:
curl -X GET https://xxxxxxx.ngrok.io/google-home-notifier?text=Hello+Google+Home
POST example:
curl -X POST -d "text=Hello Google Home" https://xxxxxx.ngrok.io/google-home-notifier
```

ちなみに、この時点で `curl -X POST -d "text=Hello Google Home" https://xxxxxx.ngrok.io/google-home-notifier` を実行すると、Google Home が喋ります。

### 3. IFTTT で Applet を作成
Cloud Automator には　[後処理](https://support.serverworks.co.jp/hc/ja/articles/115002462174-%E5%BE%8C%E5%87%A6%E7%90%86%E3%81%A8%E3%81%AF)　という「運用ジョブの実行」が完了した際に、その結果を通知する機能があります。
この機能を使って ngrok のエンドポイントにリクエストを飛ばすことが出来ればいいのですが、直接飛ばすことは出来ないので、間に IFTTT を噛ませます。

**this** で `Receive a web request` の Trigger を選択して
**then** で `Make a web request` の Action の Applet を作成します。

( Cloud Automator からの後処理を受けて、(2) で払い出された ngrok のエンドポイントにリクエストを飛ばすように設定します )

私はこのような Applet を作成しました。

![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/12391/31dbf79d-da5d-3026-7790-265a5e5aef09.png)


### 4. Cloud Automator で後処理を作成する
Cloud Automator で Webhook 後処理を作成します。
作成方法は [こちら](https://support.serverworks.co.jp/hc/ja/articles/115002386953-Webhook%E5%BE%8C%E5%87%A6%E7%90%86) をご参照ください。

### 5. ( 1 ) で作成したジョブに ( 4 ) で作成した後処理を紐付ける
( 1 ) で作成したジョブの「編集」ボタンをクリックします。

<img width="825" alt="スクリーンショット_2017-12-16_12_22_19.png" src="https://qiita-image-store.s3.amazonaws.com/0/12391/6fcb240c-85f3-1622-5369-df2cd70cc2b0.png">

ステップ6 の「後処理を新たに作成する」ボタンをクリックします。

<img width="922" alt="スクリーンショット_2017-12-16_12_25_17.png" src="https://qiita-image-store.s3.amazonaws.com/0/12391/e7b01711-2c34-e6da-af96-4c99b3a7c842.png">

それぞれの項目を入力します。
Webhook URL は IFTTT で発行されたものを入力します。
「後処理を作成する」ボタンをクリックします。

<img width="658" alt="スクリーンショット_2017-12-16_12_26_11.png" src="https://qiita-image-store.s3.amazonaws.com/0/12391/df2ae8f6-b8f0-b046-a045-12faead6136a.png">

後処理を作成した後に、ジョブに後処理を追加します。

<img width="911" alt="スクリーンショット_2017-12-16_12_28_25.png" src="https://qiita-image-store.s3.amazonaws.com/0/12391/7d90b627-bf30-9502-43d0-dcacce1bdfdc.png">

「更新する」ボタンをクリックします。

<img width="939" alt="スクリーンショット_2017-12-16_12_29_09.png" src="https://qiita-image-store.s3.amazonaws.com/0/12391/582e1899-a67d-2945-657d-b64576d0e120.png">


### 6. タイマートリガーでジョブが実行されるのを待つ
これで準備完了です！
Cloud Automator のタイマートリガーによってジョブが実行された後に、Google Home が完了をお知らせしてくれます :dancers: 

# 終わりに
Cloud Automator と Google Home を連携する方法についてご紹介しました。
Google Home と連携しなくても、この機会に Cloud Automator をぜひ触ってみてください！

https://cloudautomator.com/