AWS IoT CoreでMQTTのデータをDynamoDBへ受け流す

# やりたいこと
社内研修の一環でIoTサービスを立ち上げています。
**体重計からAWS IoT Coreに重さの情報を送り、それをDynamoDBのテーブルに格納する**ということをしたいです。

先輩[@yuuu](https://qiita.com/Y_uuu)に教えていただいた内容を整理します。

# 実装！

## Dynamo DBを作成する
まず、箱を準備します。
![スクリーンショット 2021-02-16 13.13.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/4d9959c9-7721-d609-b948-75fab4c8f46d.png)
テーブルが作成できたら、IoT Coreのコンソール画面に移動します。

## IoT Coreの証明書を作成する
`安全性 > 証明書`と進みます。

![スクリーンショット 2021-02-16 13.19.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/a4c4a774-3001-0497-757e-0e7923587911.png)
1-click証明書作成を選択します。
有言実行。本当にワンクリックで証明書ができるので、ダウンロードします。
![スクリーンショット 2021-02-16 13.21.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/8ef1c149-da8f-5289-1121-24f5ed864ff3.png)
その下に「AWS IoTのルート CA をダウンロードする必要があります。」と書いてあるので、素直に従います。

### ルート証明書 Root CA
別ページに遷移し、Amazon Root CA 1を開くと、証明書キーがブラウザに表示されるので、全部コピーします。
![iotcore_rootca.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/689171ca-97e5-a0ba-ad70-71a2764f9014.png)

コマンドラインで下記のようにファイルを作成。

```terminal:terminal
nano ~/Desktop/Root1CA1.pem
```
そこでキーをペーストしたら、`ctr + x` => `y` => `Enter`で保存します。

IoT Core画面に戻って有効化を押す。

## ポリシーの作成とアタッチ
証明書を渡したデバイスに対してIoT Coreへのアクセスを許可する。

![スクリーンショット 2021-02-16 17.54.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/25290cd2-25b5-812b-8136-aa1e11e69c98.png)
デフォルトで出てくるARN（Resouce）のままだとうまくいか図。動作確認なので、とりま全部許可する設定の`"*"`としました。


ポリシーが作成できたら、先ほど作った証明書にポリシーをアタッチします。
![スクリーンショット 2021-02-16 17.51.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/94af0e67-21ca-6121-ed4b-450c403540c7.png)

## ACTのルールを書いていく（SQLちっく）
次に。IoT Coreが通信を受け取ったら、なんのアクションをさせるか？のアクション（ACT）を設定していきます。

![スクリーンショット 2021-02-16 17.58.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/92c407f5-e3b7-2514-3893-2fda9acaa33d.png)
DynamoDB向けのアクションは２つありますが、「DynamoDBテーブルの複数列にメッセージを分割する」の方が細かい設定不要でサクッとできるので、こちらを選択。

以上で、AWS側の設定は終了です！


## MQTTBoxで動作確認
それでは、実際にデータをIoT Coreに送って、DynamoDBに転送されるか実験してみます。[mockmock](https://mock-mock.com/ja/)を使う手もありますが、まずは簡単に通信が確認できればいいので、[MQTTBox](http://workswithweb.com/mqttbox.html)というサービスを使います。mockmockは次回。

![スクリーンショット 2021-02-16 17.55.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/1fa6ea26-d6d1-89ec-22ef-4339355a2424.png)
下記のように設定します。

* Topic to publish：`iot/topic`
* Payload Type：JSONの入っているもの
* Payload：IoT Coreに送信したいデータ

右上の歯車マークを押して、詳細設定へ。
![スクリーンショット 2021-02-17 16.11.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/b0b61165-764e-6f22-6ec5-11f2fc6fa3ee.png)
下記のように設定します。

- Protocol：mqtts / tls
- CA file：IoT CoreからDLしたRoot CAファイルを添付。
- Client certificate file：IoT CoreからDLした証明書を添付。
- Client key file：IoT CoreからDLしたプライベートキーを添付。
- Hos：AWS画面、`IoT Core > 設定`にある`カスタムエンドポイント`を入れる。

Saveを押してトップに戻ったら、Publishを押してテスト！

## DynamoDBにデータが入りました！

![inserted_in_dynamodb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/cec61803-4bca-8d8b-5449-119327285f76.png)
地味に楽しい！
今回はとりま通信を確認したかったのでこれでOKですが、実際はIoTデバイス２台からIoT Coreに向けてデータが送信されるため、これでは心許ないです。また定期的にデータを送ったり、ランダムな値を送れるようにしてみたいです。そんな時は[mockmock]()なので次回やってみたいと思います。

# 最後に
これは[@yuuu](https://qiita.com/Y_uuu)さんからの手ほどきをまとめたものです。大感謝！
もし何かご指摘ありましたら、ぜひよろしくお願い申し上げます。