AWS IoT Core ハンズオン参加メモ

先日、「[知っ得ハンズオン はじめてのIoT AWS IoT Core](https://iotawsiotcore.splashthat.com/)」というAWSのハンズオンに参加してきましたので、そのときのポイントをメモっておきます。

# 座学セッション
AWSのIoTサービスについてのお話がありました。
詳しくは[こちら](https://qiita.com/ground0state/items/51808c1cc9fbf9638d24)の方がレポートしてくれています。

# ハンズオン
資料を見ながらひたすら写経（とは言わないかｗ）をしました。

以下、個人的なポイントだけ抜粋。

## Raspberry Piを使わない
AWS IoT CoreのチュートリアルではRaspberry Piをエッジデバイスとして話が進んでいくそうですが、そこが敷居が高いポイントになっているとのことで、今回はインスタンスを立ち上げて通信することになりました。
（ラズパイだって、ただのLinuxマシンだしね ^^;）

具体的にはAmazon Lightsailを起動し、そこでCloud9を動かし、AWS IoT SDKを呼び出すことで代用します。

ちなみにCloud9をLightsail上で動かす理由は、EC2よりも安い（下りの通信）からだそうです。

### Amazon Lightsailの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/0c254b75-b444-7030-4640-06421f08463b.png)

VPS相当のサービスであるLihgtsailを、Amazon Linux＋Node.jsで起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/b64e24dc-09a2-a7d9-3808-afaac0ecb4a1.png)

### Cloud9の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/fa1ad1d9-c163-57ff-982e-8a36fdee2ebb.png)

外部サーバ（Lightsail）にインストールします。
Lighjtsailで立ち上げたインスタンスのIPアドレスとホスト名を指定して、SSHでアクセスできるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/be312947-37d9-c2e2-0223-eaf91d9a350a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/102835a6-cc2f-74d1-fcde-c456062bfcc9.png)

Cloud9で動作するクライアントアプリはPythonコードなので、Pythonをインストールしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/0e6420e6-24bc-1560-9c78-c81199012bb2.png)

またAWS IoT SDKもインストールしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/3b2ca2b7-10bf-b292-3cb3-9f75725a57e9.png)

### AWS IoT クライアントの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/c6673f31-d204-70b9-a407-dd59fbde77b6.png)

まずAWS IoT Coreと通信を行うためのセキュリティポリシーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/4c7e287c-8395-3a8b-18ca-da539f43df6e.png)

次にモノ（いわゆる「Things」）を登録します。
ここで証明書を発行し、モノ（今回はCloud9）に配置します。このとき、証明書の**<font color="red">有効化</font>**を忘れずに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/50e2231f-42f9-edd3-1c79-11cc3dd16ec0.png)

これらの証明書は、Cloud9からメッセージを送る際に使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/3bbee6c7-cd14-fcc9-4978-d2198036c65f.png)

### メッセージの送信
Cloud9のクライアントアプリを実行し、AWS IoT SDKを介してAWS IoT Coreと通信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/dfe10361-c6c5-240a-09c2-58bcbeafddd8.png)

その際にAWS IoT CoreのエンドポイントのURL（メッセージ送り先）が必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/c39110ee-2194-eacb-ff76-ea8e5711e243.png)

また送られてきたメッセージは、AWS IoT Coreの「テスト」で監視できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/d27eb2c9-fc82-a480-c47f-cd659c538f7a.png)

## エッジ側の設定変更はデバイスシャドウを使う
エッジ側（今回はCloud9）の設定は、AWS IoT Coreから直接エッジ側へ通信を送って制御するのではなく、間にデバイスシャドウというJSONファイルを介して行います。

AWS IoT Coreからはデバイスシャドウ（JSON）を更新し、エッジ側はそのデバイスシャドウ（JSON）を見に行って、現在の設定と違っていれば直すということをします。
つまり、疎結合となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/39145502-2f21-dc27-c567-219a3682ca92.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/05b2c0aa-83a5-061f-e783-90b4e312f661.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/ea184f38-2125-bfc4-6efb-8ddb26a1ad03.png)

## メッセージ受信に対応した動作はひとつ
AWS IoT Coreは、エッジ側からメッセージを受け取ると、ひとつだけアクションを起こすことができます。
そのアクションは、SQLでトリガーを記述し、連携先のサービスに対してメッセージを送ったりします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/a19da9ae-eaf4-49ad-b8ca-f2c33ea2dc53.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/214706f8-85ac-b916-bdc1-9acc9784fa64.png)

S3に送るとこんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/73f6bcde-72cb-3148-ed95-ca3bd487a047.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/da515f60-63d7-51c3-1f1c-7607c803f61c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/908101b5-2114-dda2-05cd-25f4b4161120.png)

# 感想
駆け足で、やっている内容を理解するところまではできていませんが、何度か繰り返したり、あれやこれやをいじったりしていけば、自然と理解できるのではないかと思っています。
次はちゃんとラズパイ等とつなぎたいと思います。

# おまけ
AWSのハンズオンに参加すると、だいたいクーポンコードがもらえます。
$25ぐらいが多いのですが、結構使えてお得です。
（有効期限があります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/ae6b3d7f-2838-95f4-35b4-6294ee622bee.png)