mockmock × AWS IoT Core × Lambda を試してみる

# AWS IoTを使ってみたかった
ちょっとたしなんでみたいと思ったので[AWS IoT Core]を触ってみる。

# 構成案
手近に手軽なIoTのデバイスがなかったので[mockmock](https://mock-mock.com/ja/)を使ってデバイス側についてはダミーとする。
IotCoreからの行先についてはノープラン。
とりあえずLambdaあたりにしておくことにする。
※Lambdaに飛ばせられればあとはどうとでもなるだろうという目算もあった。

# mockmock：初期設定
最初にmockmockのアカウント作成。
SignUpからさくっと登録。簡単である。

# AWS IoT Core
続いてAWS IoT側の設定。

## 証明書を作成する。

<img width="323" alt="01.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/474d10b9-468e-fe70-9daa-4318d1bcca67.png">

1-Click 証明書作成
<img width="741" alt="02.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/e3ec5f59-0686-a57d-2381-5fa7a0beb8bd.png">

作成した各ファイルをDL
<img width="733" alt="03.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/d1c5b318-5980-4308-906d-3d6ca7c4d263.png">
※後々ハマった（※１）のだが、ここで「ルートCAのダウンロード」とあるリンク先にて証明書ファイルをDLしておく必要もある。
「ダウンロード」と書いてあるから、これを押すとDLが始まるのかと思ったが、そうではなかった。

## ポリシー
ポリシーのアタッチを選択する
ポリシーがまだない場合はここから新規作成。
<img width="740" alt="04_policy.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/c895c3a4-482a-cc5a-72c7-ca86a0db1683.png">

<img width="721" alt="05_policy.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/d1f331ae-6a3c-2bff-da0e-621e09a05163.png">
※これまた後々ハマる（※２）が、ここのリソースARNでこれを設定してしまうのはダメっぽい。

作成したポリシーは証明書にアタッチしておく。

## Action？ルール？を設定

<img width="723" alt="06_act.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/bb157606-2920-1e62-7221-ec6de18329c6.png">

<img width="596" alt="07_act.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/c224e9ea-b53d-a511-e469-f8e7426cbd41.png">

予定通りLambdaの関数を呼び出そうとするが、はたと気が付く。
呼び出し先の関数がない。
とりあえず動いていることがわかればいいので、前に作ったSlackへ飛ばすだけの関数を使いまわしてみることにする。

こんなやつ。

    def lambda_handler(event, context):
        get_item_name = event['item']

        # 送信確認用にSlackへ飛ばす
        #送信先URL
        token = "xoxp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        channel = "XXXXXXXXX"
        url = "https://slack.com/api/chat.postMessage?token={}&pretty=1&channel={}&text={}"
        import urllib.parse
        quote_item_name = urllib.parse.quote(get_item_name)
        url = url.format(token, channel, quote_item_name)

        #API実行
        import urllib.request
        urllib.request.urlopen(url)
        return "res:OK"

メッセージの条件はとりあえず適当に。
<img width="652" alt="08_act.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/67ed81fb-0d6a-8a1a-0cab-ca47e8d310ef.png">

これでAWS側の設定はOKなはずなのでmockmockへ戻って各設定を行う。
エンドポイントも忘れずに参照しておく。
<img width="850" alt="09_act.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/1d877cbc-b90f-1912-bd9d-c8c38ffa38d5.png">

# mockmock側の設定
## プロジェクトの作成
簡単かと思ったら認証でエラー。
上記で書いたRootCAのところでハマる（※１）。
どこからDLすりゃいいのかわからなかったが、よくよく読んでみると「ルートCAのダウンロード」の先のページのどれかでよさそうな感じなので、適当にDLして設定してみたところOK。[プロジェクトを作成しました]となった。
<img width="648" alt="10_rootca.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/c382eb85-bd6b-e7ab-3eb8-bd9be998fc42.png">
※ここから[RSA 2048 ビットキー: VeriSign クラス 3 Public Primary G5 ルート CA 証明書]のをDLして設定した。

## データテンプレート、グループの作成

- データ送信先パス：/topics/test/test  
- リクエストメソッド：POST

テンプレートについては「直接編集」すると戸惑うかもしれない。
「直接編集」といっても、送信できるデータを直接作成するということではなさそう。
KeyとValueにそれぞれ以下を設定してとりあえず一回試してみる。
"item": "from mockmock 01"

<img width="540" alt="11_mockmock.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/e352869b-cf93-b044-fe1c-a446a7b5e843.png">
<img width="440" alt="12_mockmock_error.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/db766cf5-d217-dc1e-d405-98a4f19496d3.png">

エラーである。
mockステータスのところでテスト送信ができそうなのでここから送信してみるが、やはりエラー
よくわからない。かなり煮詰まった。

# いろいろと試行錯誤してみた結果
ポリシーのリソースのところを*にしてみたら通った。（ハマった点※２）
要するに外からのアクセスを許容してなかったってことなのか？

## 上手くいった設定を以下に残しておく。
## AWS IoT Core：証明書
### ポリシードキュメント
    {
    "Version": "2012-10-17",
    "Statement": [
        {
        "Effect": "Allow",
        "Action": "iot:*",
        "Resource": "*"
        }
    ]
    }

### モノ
無し

## AWS IoT Core：Act(ルール)
〇ルールクエリステートメント
`SELECT * FROM 'test/test'`

〇アクション
`Lambda関数を呼び出す`


## mockmock
### プロジェクト
〇プロトコル
`HTTPS`

〇送信先ホスト
`AWS IoT Core のエンドポイント`

〇各証明書
`DLしたもの`

### データテンプレート
〇HTTP Request Body / MQTT Payload
<img width="724" alt="13_mockmock.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/fc589930-d050-0894-1337-a822b28954cf.png">

### mockグループ
〇mockステータス：データ送信先パス
`/topics/test/test`


# こんな感じの結果になった
状態遷移を適当にいじると時間経過で次に呼び出されるものが確率で変更されるような感じ。
<img width="228" alt="14_mockmock_result.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/c8a66ba2-96d4-57e6-cafb-6b43e8654bdd.png">

バリュージェネレータを使うとリストの中の値を指定した方法で抽出して設定してくれる。

<img width="315" alt="15_mockmock_rundam.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/285265b7-09da-c919-866a-0e1ee49ad7f3.png">

<img width="177" alt="14_mockmock_rundam.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/924bf0a0-4790-f9b1-276d-2e52c5291d58.png">

# まとめ
ということで、mockmock × AWS IoT Core × Lambdaの試しは終了。
Lambdaの関数そのものは何一ついじらずにAWS IoT Core と連携させてデバイス無しでそれの検証ができたというのは便利なんだろうなと思った。
この後、実際にデバイスを用意してどう送信するといいかまでわかると検証としては良かったのかもしれない。

AWS IoT Coreを試したのか、mockmock を試してみたのかよくわからないが、やってみたかったことはできたので良しとしておこう。