SORACOMでAWSIoTにメッセージをBeamする

# はじめに

AWSIoTにMQTTでメッセージのやり取りをするためには、デバイス側に証明書や鍵を持たせてあげないといけませんよね？

「デバイスに不正アクセスされた時に証明書や鍵が流出するのが怖い…でもMQTTでメッセージをやり取りしたい…」

そんな方おられませんか？
~~(すんごい今更ですけど)~~ そんなときに **SORACOM Beam** です！！
今回はSORACOMBeam経由でAWSIoTとMQTTでPub/Subする方法を紹介します。

## 前提条件

* AWSのアカウントを持っている
* SORACOMのアカウント/SIMを持っている
* mosquitto/mosquitto-clientsがインストール済みでSORACOMを使った通信ができるRaspberryPi
(MQTTが使えるデバイスだったらRaspberryPiじゃなくても大丈夫です。デモでは上記のRaspberryPiを利用しています)

## AWSIoT

AWSIoTではモノ(Thing)に対して、それぞれ証明書と秘密鍵を作成し、その情報を持って認証を行なっています。
では、その準備をしていきましょう

<img width="1646" alt="AWSIoT-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/aa115164-d9d9-24d8-07a4-d48bcf0fe131.png">

<img width="965" alt="AWSIoT-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/6779037d-9e27-ba91-d356-346e05035e06.png">

<img width="925" alt="AWSIoT-3.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/3addec07-dc6a-232a-8638-aa9cdd989e01.png">

<img width="947" alt="AWSIoT-4.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/94bc27a6-2552-0c8e-90e6-fc97891aa413.png">

<img width="1301" alt="AWSIoT-5.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/11f82e71-e895-8f65-ac16-bcb8e7379935.png">


これで `モノ` に紐づく証明書と秘密鍵が発行されました。

## SORACOM

AWSIoTにMQTTを転送するためのSIMグループを作成し、今回利用するSIMに紐付けます。
まずSIMグループを作成しましょう

<img width="756" alt="soracom-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/df70ef80-d8a9-a4e2-2899-9b7296712bb1.png">

<img width="626" alt="soracom-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/ecaa15e1-a54b-94cc-7a67-701dfc72605e.png">

<img width="587" alt="soracom-3.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/1f75f188-570c-4622-9720-112852fa6416.png">

<img width="797" alt="soracom-4.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/fd7552cb-1531-40b4-d4c8-f9e18a26321c.png">

<img width="858" alt="soracom-5.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/c4a36056-ec3b-d44c-f130-c601e9dfcc76.png">

<img width="768" alt="soracom-6.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/070b1d12-2076-367e-75fc-c6b6d26dbd75.png">

これでAWSIoTに転送するためのSIMグループが作成されました。
あとは使用してるSIMにこのグループを紐づけてください。

## さぁやってみよう

### AWSIoT側の準備

AWSIoTへのSubとラズパイへのPubをするための準備をします

<img width="1612" alt="soracom-7.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/8cb487b8-8377-6ac1-5847-54cca76c1587.png">

こんな画面になります

<img width="1399" alt="AWSIoT-6.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/45fc356e-d49b-7a96-b424-62d5da839fe8.png">

### ラズパイからAWSIoTへメッセージをPublish

`mosquitto_pub` コマンドでメッセージを `beam.soracom.io` にPublishします。

```console

$ mosquitto_pub -d -h beam.soracom.io -t beamdemo -m "{\"meg\": \"test\"}"
Client mosqpub|2094-raspberryp sending CONNECT
Client mosqpub|2094-raspberryp received CONNACK
Client mosqpub|2094-raspberryp sending PUBLISH (d0, q0, r0, m1, 'beamdemo', ... (15 bytes))
Client mosqpub|2094-raspberryp sending DISCONNECT

```

成功するとこんなメッセージが表示されます。 `beamdemo/{IMSI}` というトピックでメッセージがPublishされてきました

<img width="1191" alt="AWSIoT-7.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/4491b94a-9ad8-3805-a0ed-850eeb10a309.png">

### AWSIoTからラズパイへメッセージをPublish

ラズパイ側では `mosquitto_sub` コマンドを使ってトピックをSubscribeします。

```console

$ mosquitto_sub -h beam.soracom.io -t beamdemo

```

AWSIoTからメッセージをPublish

<img width="1104" alt="AWSIoT-8.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/452cd392-2a2a-18ff-fa3f-abe649720f9d.png">

成功すればラズパイのコンソール側にメッセージが届きます

```console

$ mosquitto_sub -h beam.soracom.io -t beamdemo
{
  "message": "Hello from AWS IoT console"
}

```

# さいごに

今までSORACOMFunnelを利用して、デバイス側にクレデンシャルを持たせることなくKinesisDataStreamsなどにデータを送信していましたが、改めてAWSIoTにPub/Subするための証明書や鍵の情報も持たせたくないな…という場面に出くわしたので、今回試してみました。
とても簡単なことではありましたが、デバイス側に重要な情報を持たせる必要がなくなりますので、セキュリティ面でも心配事がひとつ減るので、ぜひ使うべきサービスだと思います。

あ、私SORACOM社の人間ではございませんので。
ではまた！