サーバーレスでIoTを始めよう

記事タイトルとURLをコピーする

こんにちは、技術4課の多田です。

先日JAWS FESTA 東海道2016にてLTでIoTの発表をしました!
発表資料とかは、こちらのレポートにまとめておりますので、合わせてご覧ください。

今回、IoTの事始めとして、Raspberry PiとAWS IoTを組み合わせて、自作受付システムを作ってみたいと思い、
Raspberry Piとこの人感センサーを買ってみました。

発表した時にデバイスとAWSへの連携部分について解説ができていなかったので、
改めて技術ブログでもLTで発表した内容をどう実現したかをまとめていきます。

今回の構成

今回の構成としては、以下の通りです。
処理は、Rasberry Piに取り付けた人感センサーからAWS IoTにデータを送って、AWS IoTがそのデータをSNSへ送り、
LambdaからSlackへメッセージを送っています。

image

実現方法

それではこの構成をどのように実現したかについてですが、以下の3ステップで書いていきます。

  1. AWS IoT側のセットアップ
  2. Raspberry Pi側の設定
  3. Lambdaの設定

1. AWS IoT側のセットアップ

AWSマネジメントコンソールからAWS IoTを選択し、まずは、デバイスとAWSを繋ぐゲートウェイを作ります。
これが、「Thing」と呼ばれるAWS IoTにおける仮想デバイスで、AWS IoTアカウントに接続されたデバイスについてデータを保持できます。
ここでは、Thing名をつけて、[Create]を押します。

iot-with-serverless-1

次に、AWS IoTに送られたデータに対してどうアクションをつけるかを定義します。
これが、「ルールエンジン」です。
今回は、AWS IoTとSNSを連携するので、その設定を行います。
尚、SNSのトピック作成は完了しているという前提で設定内容は割愛します。
まず、ルールエンジンに任意の名前をつけます。

iot-with-serverless-2

次に、[Atturibute]に「*」を設定しました。これで全てのMQTTメッセージ全体を送信できます。
また、[Topic filter]に「raspi/sns」を設定しました。ルールエンジンは[Topic filter]を使ってMQTTメッセージを受信した時のトリガーするルールを決定します。

iot-with-serverless-3

そして、ルールエンジンのアクションを定義しますが、ここでは、「SNS」を選択します。
また、予め作成したSNSトピックと適宜IAMロールの作成も行い、[Add action]を押します。

iot-with-serverless-4

すると、以下のような状態になるので、そのまま[Create]を押します。

iot-with-serverless-5

次に、AWS IoTポリシーを作ります。
これは、MQTTトピックのサブスクライブや発行等のAWS IoT操作の実行をデバイス側に許可するために必要です。

[Create a policy]を選択します。
ポリシー名と、AWS IoTのアクションとリソースを定義します。
今回は、[Action]に「iot:」を、[Resource]に「」を入力し、Allowを有効化しました。
これで、AWS IoTのすべての操作に対して許可を行うことになりました。
問題なければ、[Add statement]と[Create]を押します。

iot-with-serverless-9

iot-with-serverless-10

次に、デバイスとAWS IoT間の通信をセキュアに行うための証明書を作成します。
尚、AWS IoTでは、X.509証明書を使用して通信を行います。

証明書の作成は簡単です。
[Create a certificate]を選択後、[1-Click certificate create]を押します。
すると、以下のような証明書ダウンロード画面へ遷移します。

iot-with-serverless-6

秘密鍵と証明書をダウンロードし、こちらからRoot証明書もダウンロードします。

その後、証明書のアクティベートを行います。
以下のようにアクティベートさせたい証明書を選択し、[Actions]から[Activate]を選択します。

iot-with-serverless-7

iot-with-serverless-8

最後に、ポリシーと証明書を関連付けます。
作成した証明書をチェックして、[Actions]より[Attach a policy]を選択します。

iot-with-serverless-11

関連づけるポリシーを入力するよう求められるので、入力後、[Attach]します。

iot-with-serverless-12

以上でAWS IoT側の設定が完了です。

2. Raspberry Pi側の設定

AWS IoTで作った証明書とRoot証明書をRaspberry Piに配置します。
今回は、/home配下にcertificateディレクトリを作り、Root証明書、秘密鍵、証明書を配置しました。

また、MQTTでAWSと通信するので、Mosquittoクライアントを導入しました。

$ sudo apt-get install -y mosquitto-clients

インストール完了後、試しにAWS IoTに送信してみます。
尚、この時点ではSNSトピックは、私のメールアドレスを通知先に指定しています。

$ mosquitto_pub --cafile certificate/Root証明書 \
--cert certificate/AWS IoTで生成した証明書 \
--key certificate/AWS IoTで生成した秘密鍵 \
-h xxxxxx.iot.ap-northeast-1.amazonaws.com(Thingのエンドポイント) \
-p 8883 -q 1 -d \
-t raspi/sns \
-m '{"message":"周りに人を感知したぞ!"}'

お、通知が来ましたね。

iot-with-serverless-13

あとは、人感センサーが反応した時に、Mosquittoクライアントのコマンドを実行するコーディングも行い、
Raspberry Pi側の設定も完了です。

3.Lambdaの設定

LambdaからSlackへの投稿の設定は、CS課坂本のブログで紹介した設定と同様の作業を行っているため、
割愛します。
併せて上記のブログにて確認いただけますと幸いです。

LambdaとSlack連携設定とSNSからの通知をLambdaで処理するコードが完了し、
人感センサーに近づいたり、離れたりしていると。。。

raspi-result

SlackにRasberry Piからのメッセージが投稿されました!

まとめ

デバイスとAWS連携について簡単な紹介となりましたが、いかがでしたでしょうか?
自分自身やってみるまでいろいろ難しいと思っていたところがありましたが、やってみたら意外と簡単でした!
今度は、SORACOMさんの機能とも連携してみたり、他のセンサーを組み合わせてみた結果をレポートしたいと思っています。

それでは!