[AWS IoT] Kinesis Firehoseに連携しAmazon S3へ保管

#やりたかったこと
**AWS IoTを入り口にKinesis Firehose経由でAmazon S3にファイルを保管する**仕組みを作りました。ノーコーディングなので、だいたい1時間くらいで実装できます。
本当はRaspberry Piあたりもやろうかと思ったのですが、時間がないので省略しました。
AWS IoTのMQTT Clientというテストツールを使うとAmazon S3に以下のようにファイルができます。
![AWS IoT Result.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/c9bb2b43-55a7-fd68-1529-637c1240a912.jpeg)

#仕組み
今回の連携図はこんな感じです。
![IoT Overview.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/e71ac74d-f857-1cf1-24b3-63e892998afd.jpeg)
**AWSのサービス間は連携が優れています。**この辺のサービスを作った結果の感想を[マイクロサービス否定派が変節した経験](http://qiita.com/FukuharaYohei/items/3c1b1b1b9283e45adad7)に書いています。
初心者が疑問に思うのは**「Kinesis Firehoseいるの？」**です。私も最初はその状態でした。
Kinesis FirehoseがないとIoT情報を集約することができず、**Amazon S3に生成されるファイル数が異常に増えてしまいます。**
例えば、100台のマシンから1分ごとにリクエストを受けた場合の1時間のファイル数は以下のとおりになります。
Kinesis Firehoseなし：6000ファイル(100 * 60 = 6000)
Kinesis Firehoseあり：20ファイル(3分でサマリする0設定にした場合:60 / 3 = 20)

#設定1. Amazon S3
まず、Amazon S3から設定していきます。バケットを作るだけの簡単な作業です。
1.「バケットを作成」ボタンを押します。
![01.AWS IoT 01 Create a S3 Bucket.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/25b7ad39-08e8-62e6-9dce-9292c39fb561.jpeg)
2.バケット名入力とリージョン選択だけです。
![01.AWS IoT 02 Create a S3 Bucket.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/5fd42ea6-837f-2b9b-1959-3adb909abc22.jpeg)

#設定2. Kinesis Firehose
####1. Create Delivery Stream
まずは「Create Delivery Stream」ボタンを押します。
![01.AWS IoT 03 Create Kinesis FH.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/1f5aa75b-fe2a-8cd4-2a2a-08f4693b5707.jpeg)

####2. Destination
次にDestinationをAmazon S3にして先のステップで登録したバケット名を指定します。
![01.AWS IoT 04 Create Kinesis FH.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/b2a50f44-f7a7-475e-9d07-42f346ba75ec.jpeg)
####3. Configuration
最後は細かい設定です。ほとんどはデフォルト値のままにして、「Buffer interval」だけ60(秒)にしました。この設定により、60秒間隔でAWS IoTからの情報を集約してAmazon S3にファイルを生成します。
![01.AWS IoT 05 Create Kinesis FH.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/48e55848-9ded-b487-912c-a574f5ed7ccf.jpeg)
#設定3. AWS IoT
####1. Create a thing(1/2)
まずは「Create a thing」ボタンを押して"a thing"を作ることから始めます。
![01.AWS IoT 06 IoT Create a Thing.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/a86b3423-dcbe-1ae6-93c2-b74137eea306.jpeg)
####2. Create a thing(2/2)
次に"a thing"の情報を入力して登録します。
![01.AWS IoT 07 IoT Create a Thing.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/175e6f7d-d5a8-76a9-decd-57985b0b8891.jpeg)
####3. Create a rule(1/2)
"a thing"に続いてルールを登録するため「Create a rule」ボタンを押します。
![01.AWS IoT 08 IoT Create a rule.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/71920154-6583-6fd6-c859-fabedb420280.jpeg)
####4. Create a rule(2/2)
ルールの情報を入力していきます。「Choose an action」で"Amazon Kinesis Firehose"を選択して、先のステップで登録したDelivery Streamを入力します。**"Amazon Kinesis Firehose"のリージョンとAWS IoTのリージョンが一緒でないとプルダウンメニューに出てこない**ので注意してください。
![01.AWS IoT 09 IoT Create a rule.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/531bb263-8c6e-2f37-4019-b51f5d841a4b.jpeg)
#さいごに
これでAWS IoT→Amazon S3につながりました。Amazon S3はSparkやMapReduceなどからもアクセスできるので使いみち広がります！

以下の記事も併せて参考になるかと思います。

- [マイクロサービス否定派が変節した経験](http://qiita.com/FukuharaYohei/items/3c1b1b1b9283e45adad7)
- [Amazon S3にドキュメントを置いたらLambda経由でSlackに通知させてみた](http://qiita.com/FukuharaYohei/items/bf053fc78b4dcb961245)