IoT初心者によるはじめてのIoT

# はじめに
気になっていたけれど中々手を付けられなかったものってありませんか？
私はその１つがラズパイでした。
ラズパイとAWSを組み合わせてIoTシステムを作る記事を見たことをきっかけに今回ラズパイに触ってみました！
※以下は[こちらのAWS公式ブログ](https://aws.amazon.com/jp/builders-flash/202207/create-time-lapse-movie/?awsf.filter-name=*all)を参考に進めた内容です。

# 用意したもの
Raspberry Pi 4 Model B（4GB RAM)
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445555/aa366d61-93cf-4a1e-c808-4bbd7252c55b.jpeg">
と[こちらのUSBカメラ](https://www.amazon.co.jp/gp/product/B09241T966/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1)を用意しました。

※当初「ラズパイは基盤だけ買えばよいかな〜」と考えていたのですが、ネット上で以下のお話を見かけました。
・ヒートシンクを付けないとCPUが高熱になってダウンする可能性
・静電気に弱いので基盤むき出しのまま素手で触ると壊れる可能性
なので、今回は初心者におすすめという[スターターキット](https://www.amazon.co.jp/gp/product/B08BFZ7PXS/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&th=1)を購入しています。

※スターターキットに含まれていないが”あった方がよいもの”はUSBキーボードやUSBマウスです。
ラズパイのセットアップ時に操作を行いやすくなるためあると便利なのですが、
そもそも使用せずにお持ちのPCからSSHしてセットアップする・・・ということも可能です。
この辺りはたくさんの先人たちがネットで説明してくださっているので割愛させていただきます。

# ~~チュートリアルの解説~~ 疑問に思って調べたこと
それではブログの手順に従って進めていきます！
・・・とここからチュートリアル手順の補足をしながら詰まったところを解説していく予定でしたが、
(経験上、こういったチュートリアルものはやってみると何箇所か詰まるポイントがあるイメージでした)
詰まることなく進められてしまったので作業中に調べたことを記載していきます。

### ・Credentials Providerとは？
ラズパイからKinesis Video Streamsに動画を送信する際、Kinesis Video Streamsに書き込み操作が出来る認証情報が必要です。
STSを利用してもよいですが、有効期限があるため期限切れのたびにラズパイ側で作業を行う必要が出てしまいます。
そこで、手順ではAWS IoTの["Credentials Provider"](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/authorizing-direct-aws.html)という仕組みを利用していました。
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445555/2bf64d6f-ca2e-f475-ba3c-cc94ca696e8c.png">

>デバイスは、AWS IoT CoreTLS 相互認証プロトコル使用に接続するための X.509 証明書を使用することができます。
>AWS IoT Core には、組み込みのX.509 証明書を一意のデバイス ID として、 AWS リクエストを認証するために使用することを許可する認証情報プロバイダーがあります。
>これによって、デバイスにアクセスキー ID およびシークレットアクセスキーを保存する必要がなくなります。

>認証情報プロバイダーは、X.509 証明書を使用して発信者を認証し、一時的で制限された権限のセキュリティトークンを発行します。
>このトークンは、すべての AWS リクエストに署名して認証するために使用できます。
>AWS リクエストを認証するこの方法では、AWS Identity and Access Management (IAM) ロールを作成して設定し、ロールに適切な IAM ポリシーをアタッチすることが必要となります。
>これによって、認証情報プロバイダーは、ユーザーに代わってロールを引き受けることができます。

上記説明文では少しややこしいので噛み砕いたものが以下です。
**・IoTデバイスではX.509クライアント証明書を使って認証リクエストを行うことができる**
**・認証にはX.509クライアント証明書を使用するため、デバイス側にクレデンシャル情報(アクセスキー、シークレットキー)を持たせなくてよい**
**・証明書の検証が成功すれば認証情報プロバイダーがAssumeRoleしてSTSを取得する事ができる**

STSを使うことには変わりないのですが、
一時認証情報の取得や失効の管理をSDK側にお任せできるため便利です。
また、もしデバイスが不特定多数に触られる可能性がある場合に
クレデンシャル情報を持たせてしまうセキュリティの危険性を回避することもできます。

### ・IoTポリシー？ IoTのモノ？・・・なにそれ？
手順の中でさらっと出てくるのであやうくスルーしそうになりますが、どちらも初見の単語だったので調べました。
#### IoTポリシー
ポリシー設定画面の説明文として下記が掲載されています。
>AWS IoT ポリシーは、モノ、リソース、デバイスシャドウ、MQTT トピックなどの AWS IoT リソースへのアクセスを許可または拒否します。
>デバイスまたはユーザーが AWS IoT オペレーションを呼び出すことができるのは、適切なアクセス許可が付与されている場合のみです。

要は`デバイス`(今回のチュートリアルだとラズパイ)にAWS IoTリソースへどのような権限を与えるか権限設定できるもので、IAMポリシーのIoT版というイメージです。
例えば下記のようなポリシーを設定でき、チュートリアルでは画像最下部に記載されている`iot:AssumeRoleWithCertificate`ポリシーがラズパイ-Kinesis Video Streams間の接続に利用されていました。
<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445555/0ef79f56-f91a-9dce-edea-94cf28137e5a.png">
※設定可能なポリシー一覧は[こちら](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-policy-actions.html)。

#### IoTのモノ
>"モノ" とは、特定のデバイスまたは論理エンティティを表します。物理的なデバイスやセンサー (電球や壁のスイッチなど) は、モノとして扱うことができます。
>また、アプリケーションのインスタンスなどの論理エンティティや、直接的には接続されておらず AWS IoT に接続されている他のデバイスと関連している物理エンティティ (エンジンセンサーやコントロールパネルがある自動車など) も、モノとして処理できます。
※[デベロッパーガイド](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-thing-management.html)からの抜粋

"モノ"として登録することでAWS IoTサービスから認識できるようになり、チュートリアルでは証明書をアタッチできるようになっていました。
また、"モノ"をグループ化しグループ単位にポリシー設定や証明書のアタッチをすることも可能です。
"モノ"が増えると個別に証明書をアタッチすることは面倒かつ抜け漏れが起きそうですが、グループ化することで防ぐことが出来そうです。

# Kinesis Video Streamsを触ってみた感想
チュートリアルを最後まで進めるとこちらのようなタイムラプス動画を作成することができます。
![result_AdobeExpress (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445555/71497418-2e22-20d8-5b7f-1916822cf518.gif)

Kinesis Video Streamsに取り込んだ動画データのフレームから画像ファイルとして取得してタイムラプス動画を生成していますが、
他にも単純にKinesis Video Streamsに保管されている動画から範囲指定してダウンロードすることも可能です。

前提として動画とは連続した画像が集まったものです。
Kinesis Video Streamsに送った動画は一定時間ごとの画像をまとめた"フラグメント"と呼ばれるもので構成されており、
それらのフラグメント番号を指定すればデータ(動画)を取得することができるという仕組みです。
![arch-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445555/20a36f74-b1ba-625c-14a5-6dbedd973335.png)

こういったことが出来るのであれば、
Kinesis Video Streamsを使って防犯カメラや、画像認識処理と組み合わせて顔認証のサービスも作ることができそうです！

# おわりに
結果として当初記事を書こうと思った内容からは外れてしまいましたが、
IoTに触れる良いきっかけになりました。
顔認証サービスを作ってみたりなどKinesis Video Streamsを使って出来ることにまだまだ気になることはあるので、
~~加えてラズパイの価格が思いの外高かったので元を取らなくてはという思いもある~~
またラズパイを使った何かを作ってみることにチャレンジしてみたいと思います！

# 参考にさせていただいた資料
[AWS公式のタイムラプス動画作成の手順](https://aws.amazon.com/jp/builders-flash/202207/create-time-lapse-movie/?awsf.filter-name=*all)
[Kinesis Video Streams APIについてリファレンスガイド](https://docs.aws.amazon.com/ja_jp/kinesisvideostreams/latest/dg/how-it-works-kinesis-video-api-producer-sdk.html)