Sigfox CallbackとAWS IoT連携

Sigfox Callbackには、Custom Callback以外にAWS IoT、AWS Kinesis、Microsoft Azure Event hub、Microsoft Azure IoT hub、IBM Watson IoT Platformへの連携が用意されています。
ここでは、AWS IoTとの連携方法を記載します。

#Sigfox Callback設定とAWS IoTの設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/4839a3c6-373b-a88b-dd7e-43691b8d7a64.png)
まずは、Sigfoxクラウドで、Callback設定画面に移動し、「AWS IoT」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/391db28c-a8ec-bc46-2f46-a75b695b0dca.png)
下図の画面になります。後ほど、AWS IoT側の設定で必要になるExternal Idをコピーしたうえで、**[Launch Stack]**ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/1ee9a0fe-59b8-b121-eec0-e4ee95df9a50.png)
AWSコンソールが立ち上がり、CloudFormationの画面に移るので、そのまま**[Next]**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/ec298863-e24c-a952-0750-9a196927c339.png)

スタックの詳細の指定画面になります。**AWSAccountId**はご自身の[AWSアカウントID](https://console.aws.amazon.com/billing/home?#/account)、**ExternalId**は、先ほどSigfoxクラウドのCallback設定でコピーしておいたExternalIdを、**Region**には、ご自身のリージョンを入力してください。リージョンを調べる場合は、[こちら](https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html)から探してください。アジアパシフィック（東京）の場合は、「ap-northeast-1」となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/2343fcfb-f55d-b064-cf4c-e0daf15e3237.png)
TopicNameは、AWS IoTにpublishするトピック名となります。
**[次へ]**ボタンをクリックすると、オプションの設定画面になりますので、そのまま**[次へ]**ボタンをクリックすると、確認画面になります。
*☑AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。*
にチェックを入れて、[作成]ボタンクリックで、スタックが作成されます。
作成されたスタックを開き、「出力」を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/b903312b-85ed-1a81-e6cc-3c1cd7bccb9b.png)
ここで、**ARNRole**と**Topic**をコピーしておき、SigfoxクラウドのCallback設定画面に戻り、ARN RoleとTopicに貼り付けます。RegionはAWS IoT側で設定したリージョンと同じものを選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/5086a820-354e-8d12-f092-ddd100b62828.png)
**Json Body**には、AWS IoTにCallbackするデータをJSON形式で入力します。今回は、下記のようなJSONを送ってみます。

```sigfox_awsiot.json
{
  "device":"{device}",
  "time":{time},
  "data":"{data}"
}
```
[OK]ボタンをクリックし、Callback設定を完了させます。これで、SigfoxクラウドからAWS IoTへのCallbackが完了しました。

##DynamoDBにデータを送ってみる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/5d1199d9-196b-49b3-76f0-d984012bd935.png)
SigfoxクラウドからのデータをDynamoDBに保存していきます。
AWSのサービス一覧から「DynamoDB」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/3be84ca5-f990-9150-2612-b1634a927e67.png)
DynamoDBのダッシュボードから「テーブルの作成」ボタンをクリックし、テーブル名とプライマリーキーを設定します。絶対ではないですが、deviceとtimeをキーにしておきます。（timeキーを追加する場合は、☑ソートキーの追加にチェックをいれてください。）
テーブルの作成が完了するとDynamoDBのテーブルメニューにテーブル名が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/04dc3308-ae27-5e46-4887-113cb92c190c.png)

##DynamoDBにデータを受け渡すためのRoleを設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/236115d0-b595-1c3d-18eb-5d370b8df1b6.png)
DBテーブルを用意しただけでは、データが受けわされてないので、受け渡し用の設定を行います。
AWSサービス一覧から**「IoT Core」**を選択し、左メニューの**ACT**をクリックし、**[ルールの作成]**を行います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/d8330447-d608-2c49-8d60-f204d20651bf.png)
ルールの作成画面では、AWS IoT (CloudFormation)で設定したデータハブからデータを取得し、そのあと、どうするかを定義します。
今回は、"sigfox" Topicから全てのデータを取得し、DynamoDBに、そのデータを挿入したいので、**ルールクエリステートメント**には、
`SELECT * FROM 'sigfox'`
と入力します。（Topic名がsigfox以外の場合は、ご自身の環境に合わせて書き換えてください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/0015a1ae-ce03-f88f-c082-e7c1c8d9d175.png)
[アクションの追加]ボタンをクリックし、**DynamoDBテーブルにメッセージを挿入する**を選択。[アクションの設定]ボタンをクリックし、アクションの設定内容を記載していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/5b447a9c-b189-e725-4129-706de4bcf26d.png)
今回は、先ほど作成したDynamoDBのテーブル名を選択します。選択すると、"device"とうパーティションキーと"time"というレンジキーが自動設定されます。
あとは、パーティションキーの値に`${device}`、レンジキーの値に`${time}`を入力し、**この列にメッセージデータを書き込む**という入力欄に`payload`を入力してください。これで、DynamoDBテーブルにpayload列が追加され、その列にSigfoxクラウドからCallbackされたメッセージの中身（JSON形式）が挿入されていくこととなります。
（IAMロール名も適当に作っておいてください）
最後に、[ルールの作成]ボタンをクリックすると、ルールが一つ出来上がります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/306d3e33-ab65-9cd7-6efd-52f43bdd22eb.png)
DynamoDBのテーブルを確認すると、Sigfox Callbackで設定したJSONにあわせた項目が挿入されていることが確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/296737ac-920e-fa82-8d04-e329fb3d8cba.png)

[Sigfox Japan KCCS](https://qiita.com/organizations/sigfox)