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


AWS IoTを使ってみたかった

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

構成案

手近に手軽なIoTのデバイスがなかったのでmockmockを使ってデバイス側についてはダミーとする。
IotCoreからの行先についてはノープラン。
とりあえずLambdaあたりにしておくことにする。
※Lambdaに飛ばせられればあとはどうとでもなるだろうという目算もあった。

mockmock:初期設定

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

AWS IoT Core

続いてAWS IoT側の設定。

証明書を作成する。

1-Click 証明書作成

作成した各ファイルをDL

※後々ハマった(※1)のだが、ここで「ルートCAのダウンロード」とあるリンク先にて証明書ファイルをDLしておく必要もある。
「ダウンロード」と書いてあるから、これを押すとDLが始まるのかと思ったが、そうではなかった。

ポリシー

ポリシーのアタッチを選択する
ポリシーがまだない場合はここから新規作成。


※これまた後々ハマる(※2)が、ここのリソースARNでこれを設定してしまうのはダメっぽい。

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

Action?ルール?を設定

予定通り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"

メッセージの条件はとりあえず適当に。

これでAWS側の設定はOKなはずなのでmockmockへ戻って各設定を行う。
エンドポイントも忘れずに参照しておく。

mockmock側の設定

プロジェクトの作成

簡単かと思ったら認証でエラー。
上記で書いたRootCAのところでハマる(※1)。
どこからDLすりゃいいのかわからなかったが、よくよく読んでみると「ルートCAのダウンロード」の先のページのどれかでよさそうな感じなので、適当にDLして設定してみたところOK。[プロジェクトを作成しました]となった。

※ここから[RSA 2048 ビットキー: VeriSign クラス 3 Public Primary G5 ルート CA 証明書]のをDLして設定した。

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

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

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


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

いろいろと試行錯誤してみた結果

ポリシーのリソースのところを*にしてみたら通った。(ハマった点※2)
要するに外からのアクセスを許容してなかったってことなのか?

上手くいった設定を以下に残しておく。

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

mockグループ

〇mockステータス:データ送信先パス
/topics/test/test

こんな感じの結果になった

状態遷移を適当にいじると時間経過で次に呼び出されるものが確率で変更されるような感じ。

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

まとめ

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

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