mockmockでAWS IoT Coreにデータを送るプロジェクトを作成する

こんにちは、mockmockチームエンジニアの岡嵜です。

本記事は [mockmockアドベントカレンダー](https://qiita.com/advent-calendar/2019/mockmock) 3日目の記事です。
昨日は「[mockmockでサーバー(Nginx)にデータを送るプロジェクトを作成する](https://qiita.com/withelmo/items/7e78359965d0809f2120)」でした。

今回は、**mockmock** から **AWS IoT Core** にデータを送るプロジェクトを作成する方法をまとめます。

## 今回やること

AWS IoT Coreにmockmockからデータを送るプロジェクトを作成します。

構成としては以下の通りです。

<img width="970" alt="Untitled_New_Diagram_-_Cacoo.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/456d24ea-baed-362e-95ba-107e9b330e3a.png">


送信するデータはJSON形式で以下の内容とします。

```json
{
  "hello": "world"
}
```

## AWSの準備

### S3のバケットを作成する

mockmockが送信したJSONをファイルとして保存するためのS3バケットを作成します。
[S3のコンソール画面](https://s3.console.aws.amazon.com/s3/home?region=ap-northeast-1#)へアクセスし、「バケットを作成する」をクリックしてください。

![S3_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/15987627-9177-0928-b252-489d17dad249.png)

「バケット名」を入力します。既にAWS上に存在しているバケット名は使用できないので、ご注意ください。
入力したら「次へ」をクリックしてください。

![S3_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/dcfbe8f5-e897-ca6f-c2fe-8423c0da467f.png)

特に入力・変更する項目がないので、そのまま「次へ」をクリックしてください。

![S3_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/91ca467b-197f-6f53-8073-9caf332dbf80.png)

「パブリックアクセスをすべてブロック」にチェックが入っていることを確認して、「次へ」をクリックしてください。

![S3_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/543ac46f-8a49-7fd2-74fb-2a7cb7dc25be.png)

「バケットを作成」をクリックしてください。以上でS3バケットの作成は完了です。

![S3_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/3a494af0-3d74-82e8-ce00-6dab39193035.png)


### IoT Coreで使用するIAM Roleを作成する

IoT Coreで使用するIAM Roleを作成します。このIAM RoleにはS3へファイル(オブジェクト)をPUTするためのポリシーもアタッチします。

まずは[IAMのコンソール画面](https://console.aws.amazon.com/iam/home#/home)へアクセスし「ロール」→「ロールの作成」の順にクリックしてください。

![IAM_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/7fc17160-aed3-f529-a044-a3ee11d86bb2.png)

表示された画面で「AWSサービス」→「IoT」の順でクリックしてください。

![IAM_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/ecc317ce-777b-50f2-f596-db04ef1e02a4.png)

同じ画面の下部に「ユースケースの選択」が表示されるので、「IoT」を選択して「次のステップ: アクセス権限」をクリックしてください。

![IAM_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/24a5decf-d158-3824-e989-9165bafa4988.png)

特に入力・変更する項目がないので、そのまま「次のステップ: タグ」をクリックしてください。

![IAM_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/fbc148c2-89e1-9a3c-7186-7222eccf6a9c.png)

この画面も、特に入力・変更する項目がないので、そのまま「次のステップ: タグ」をクリックしてください。

![IAM_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/a09704d3-aaba-bb73-ad7c-6a331e61952e.png)

「ロール名」を入力して「ロールの作成」をクリックしてください。以上でIAM Roleの作成は完了です。

![IAM_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/c0d518ab-48e2-111b-95f7-1e316eeeef57.png)

### IoT Coreの証明書を作成する

[IoTのコンソール](https://ap-northeast-1.console.aws.amazon.com/iot/home?region=ap-northeast-1#/home)へアクセスし、「安全性」→「証明書」→「作成」の順にクリックしてください。

![AWS_IoT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/af110a9e-e703-245f-4895-1495a93944e4.png)

「証明書の作成」をクリックしてください。

![AWS_IoT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/89cff175-4c2b-878a-2c0f-75ad23233a46.png)

「このモノの証明書」「パブリックキー」「プライベートキー」をダウンロードしてください。
「有効化」をクリックして、「ポリシーのアタッチ」をクリックしてください。以上でIoT Coreの証明書の作成は完了です。

![AWS_IoT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/3431f39e-8df0-73b3-b7e1-f0fe49e30ec9.png)

### IoT Coreの証明書にポリシーをアタッチする

「新規ポリシーの作成」をクリックしてください。

![AWS_IoT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/050366e3-21cc-04ee-f594-2ed37f9f5c79.png)

以下の通り入力して、「作成」をクリックしてください。

|項目  |入力値  |
|---|---|
|名前  |任意のポリシー名  |
|アクション  |iot:Connect,iot:Publish  |
|リソースARN  |*  |
|効果  |許可  |

![AWS_IoT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/1f36b8ff-736b-b6ce-cb61-2a774aa82cf7.png)

再度、[IoTのコンソール](https://ap-northeast-1.console.aws.amazon.com/iot/home?region=ap-northeast-1#/home)へアクセスし、「安全性」→「証明書」の順にクリックしてください。
次に、先ほどダウンロードしたファイル名と同じプレフィックスが付いている証明書を探し、「・・・」→「ポリシーのアタッチ」をクリックしてください。

![AWS_IoT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/9ee6e333-8c89-9596-c8d4-e687f53480fa.png)

先ほど作成したポリシーを選択し、「アタッチ」をクリックします。以上でポリシーのアタッチは完了です。

![AWS_IoT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/41f2926d-71aa-e4f2-c6b7-8d6f67b05504.png)

### IoT Coreのルールを作成する

mockmockからデータが送られてきたときの挙動を定義するため、ルールを作成します。

[IoTのコンソール](https://ap-northeast-1.console.aws.amazon.com/iot/home?region=ap-northeast-1#/home)へアクセスし、「ACT」→「ルール」→「作成」の順にクリックしてください。

![AWS_IoT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/71fd449f-6ded-f111-1028-a57edafb5314.png)

「名前」に任意の名前を、「ルールクエリステートメント」に「`SELECT * FROM 'message'`」を入力します。

![AWS_IoT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/0e27e1b1-1f03-2be9-f217-d6ad325956d7.png)

続けて画面中程の「アクションの追加」をクリックします。

![AWS_IoT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/c0f500ca-3ca0-30b0-0664-ca545c63d171.png)

「Amazon S3バケットにメッセージを格納する」を選択肢て「アクションの設定」をクリックしてください。

![AWS_IoT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/a77ce885-4828-95c9-e67a-38bc10f9df77.png)

以下の通り入力して、「アクションの追加」をクリックしてください。

|項目  |入力値  |
|---|---|
|S3バケット  |先の手順で作成したS3のバケット名  |
|キー  |data-${timestamp()}  |
|このアクションを実行するためのAWS IoTアクセス権限を付与するロールを選択または作成します  |先の手順で作成したIAM Role名  |

![AWS_IoT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/8745e87f-c515-ffcb-e857-db13eec9cf59.png)

アクションが設定されたことを確認して、「ルールの作成」をクリックしてください。以上でルールの作成は完了です。

![AWS_IoT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/46abd3da-d642-b5aa-d308-fa927b6fc9c6.png)

### AWS IoT Coreのエンドポイントの確認

mockmockのデータの送信先となるエンドポイントを確認します。

[IoTのコンソール](https://ap-northeast-1.console.aws.amazon.com/iot/home?region=ap-northeast-1#/home)へアクセスし、「設定」をクリックしてください。

「エンドポイント」が表示されます。(後ほど必要となります)

![AWS_IoT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/4a561e0e-3e23-1a3c-0f0b-58d495bebacc.png)

### Root証明書ファイルのダウンロード

[AmazonルートCA1](https://www.amazontrust.com/repository/AmazonRootCA1.pem)へアクセスして、ブラウザのツールバーにて「ファイル」→「保存」を実行してください。(後ほど必要となります)


## mockmockの準備

### プロジェクトを作成する

[プロジェクト新規作成画面](https://console.mock-mock.com/projects/new)へアクセスし、以下の通り入力後、「登録」をクリックしてください。

![IoT開発を加速する仮想デバイス作成サービス___mockmock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/02cf836a-e8fa-c441-5504-d9b26d7a4c26.png)


|項目  |入力値  |
|---|---|
|プロジェクト名  |任意のプロジェクト名  |
|サーバタイプ  |[AWS]AWS IoT Core  |
|キャパシティ  |cn1  |
|プロトコル  |MQTTS  |
|送信先ホスト  |先の手順で確認したAWS IoT Coreのエンドポイント  |
|証明書ファイル  |先の手順でダウンロードした「このモノの証明書」  |
|秘密鍵ファイル  |先の手順でダウンロードした「プライベートキー」  |
|Root証明書ファイル  |先の手順で保存したRoot証明書ファイル  |
|SSL/TLS  |TLSv1.2  |

### データテンプレートを作成する

送信するデータのテンプレートを作成します。

[データテンプレート新規作成画面](https://console.mock-mock.com/projects/pj-78d6dc59/data_templates/new)へアクセスし、「テンプレート名」に任意の名前を入力後、「登録」をクリックしてください。

![IoT開発を加速する仮想デバイス作成サービス___mockmock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/b7637eaa-a636-6644-376f-9aa60902af51.png)


### mockグループを作成する

[mockグループ新規作成画面](https://console.mock-mock.com/projects/pj-78d6dc59/mock_groups/new)へアクセスし、以下の通り入力後、「登録」をクリックしてください。

![IoT開発を加速する仮想デバイス作成サービス___mockmock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/020901f3-5ff1-5894-201c-324f821f8db9.png)

|項目  |入力値  |
|---|---|
|mockグループ名  |任意のmockグループ名  |
|最大稼働時間[sec]  |600  |

### mockステータスを作成する

次に「mockステータス」を作成します。
「作成したmockグループ名」→「mockステータス」→「mockステータス作成」の順でクリックしてください。

![IoT開発を加速する仮想デバイス作成サービス___mockmock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/1b423472-46b4-b2be-0f8e-ffdc67954204.png)

以下の通り入力後、「登録」をクリックしてください。

![IoT開発を加速する仮想デバイス作成サービス___mockmock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/4e81b533-dc16-146f-ad4e-5598b13ba693.png)

|項目  |入力値  |
|---|---|
|状態名  |default  |
|初期状態  |チェック  |
|Topic  |message  |
|QoS  |1  |
|Retain  |無効  |
|最小送信間隔[sec]  |10  |
|最大送信間隔[sec]  |10  |
|データテンプレート  |作成したデータテンプレート名  |

### mockを作成する

いよいよmockを作成します。「mockステータスタブ」で「mock新規作成」をクリックしてください。

![IoT開発を加速する仮想デバイス作成サービス___mockmock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/bf50438a-c122-4706-e736-946c2a2afb27.png)

そのまま「登録」をクリックしてください。

![IoT開発を加速する仮想デバイス作成サービス___mockmock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/974c51a8-3519-42cf-d506-4c7953d32a0f.png)


### テスト送信する

設定に齟齬が無いかテスト送信をして確認します。「mockステータスタブ」で「送信」をクリックしてください。

![IoT開発を加速する仮想デバイス作成サービス___mockmock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/2a0aaf03-a5a5-e38f-0dd9-d67412ca76ca.png)

このように「成否」に「true」が表示されれば成功です。

![IoT開発を加速する仮想デバイス作成サービス___mockmock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/49230804-fd58-fb4a-2c8c-29dd577252c4.png)

## mockmockからデータを送信する

いよいよデータを送信します。

### mockを起動する

「作成したmockグループ名」→「mock作成」の順でクリックしてください。

<img width="1440" alt="IoT開発を加速する仮想デバイス作成サービス___mockmock.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/b9842bac-6ba2-ba1b-f324-f0fcf812a017.png">

そのまま「登録」をクリックしてください。

<img width="1439" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f36303939362f35643466613034392d343066322d643539372d333262612d3338356138356335666433312e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/ea477134-e44d-f9dc-8de5-905c084c8c98.png">


mockが作成されました。
作成したmockの「操作」→「起動」をクリックしてください。

<img width="1439" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f36303939362f30343133653938332d313232612d613261322d663362332d3439626137346561313033312e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/70a2cd40-f844-50a4-7755-08e0ba0f5ac2.png">


mockが作成され、データ送信が始まります。

### 送信したデータを確認する

[S3のコンソール画面](https://s3.console.aws.amazon.com/s3/home?region=ap-northeast-1#)へアクセスし、作成したバケット名をクリックするとファイル(オブジェクト)が作成されていることがわかります。

<img width="1439" alt="S3_Management_Console_と_joburu_academic.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/62e917de-4f45-47cb-a4f6-5be9f86a33f2.png">

任意のファイル(オブジェクト)をクリックして表示された画面で、「ダウンロード」をクリックしてください。

<img width="1456" alt="S3_Management_Console_と_Slack___障害情報チャンネル___fusic.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/6071da0b-6c61-7036-43cf-5374eee692a8.png">

ダウンロードしたファイルをエディタで開くと、mockmockから送信したJSONが記載されていることが確認できるはずです。

<img width="730" alt="data-1574409957964.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/588b6c8b-036f-d2e0-6e3e-bb595ef1a905.png">

### mockを停止する

起動中のmockの「操作」→「停止」をクリックしてください。

<img width="1439" alt="Banners_and_Alerts_と_IoT開発を加速する仮想デバイス作成サービス___mockmock.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/7e8017ab-1872-846c-ca79-0c2d19a67d4f.png">

以上でmockの停止は完了です。

## まとめ

本記事では、mockmockからAWS IoT Coreにデータを送るプロジェクトを作成しました。
IoTシステムにおいてクラウドの入り口にAWS IoT Coreを採用している事例は多いと思われますので、ぜひご活用ください。

明日も引き続き私@Y_uuuが、mockmockでGoogle Cloud IoT Coreにデータを送るプロジェクトを作成する方法をご紹介します。

## 参考

[[AWS] AWS IoT Coreにデータを送る](https://console.mock-mock.com/docs/guides/aws_iot)