ラズパイとAWS IoTを使った見守りシステム自作で学んだこと（１）概要の説明

## この記事について

過去３年間の自己開発の備忘録を「ラズパイとAWS IoTを使った見守りシステム自作で学んだこと」と題して本稿含めて１０回に分けて投稿します。

IT素人が必要に応じてLinux、AWS、cliについて調べ実装したことをまとめます。

具体的には、数回のアップデートを経て辿り着いた[現在のリポジトリー](https://github.com/nsaito9628/Monitoring-system-with-Raspberry-Pi-and-AWS)の詳細を説明します。ちなみにLatest版では、エッジもAWSリソースもインターネット接続した端末のcliからdeploy/deleteができます。何故そこまで拘ったかというと最終的に遠隔からの実装と更新を自動でしたいからです。

取組みのきっかけについては[PyCon mini Shizuoka 2020](https://speakerdeck.com/nsaito9628/raspberrypitoawsdequ-rizu-ndazi-zuo-iot)の発表スライドに説明がありますので興味お持ち下さった方はご覧頂ければと思います。

## 参考文献について

代表的な参考文献は文中で都度参照できるように埋め込みリンクとさせて頂きます。ご了承下さい。

この場を借りてDoc、記事の著者の皆さまに御礼と感謝を申し上げます。

## 解決したかった課題
当時(2019.04)、家族（妻）から３つのリクエストをもらいました。

1.  リアルタイムで義母(やネコ)の動きを知りたい
1.  映像で（例えば玄関の）人・ネコの出入りを確認したい
1.  一定時間動きが無かったらメールで知らせて欲しい

本命課題は一人暮らしの義母の見守りで、同居しているネコに自己開発に付き合ってもらったのが実情です。

表向きは家の課題解決が目的でしたが裏課題として今後業務で必要になりそうなスキル習得をイメージして取り組みました。

<img width= 1500 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/0b0fb09c-2340-2683-f196-ed1b2804c04f.png>


## Architecture  
3つのリクエストに対して  

1.  に対してはセンサーモニターのグラフを見せる
1.  に対しては常時録画ではなくセンサー等トリガーの前後１５秒の動画を保存する
1.  に対しては１５時間センサーに反応が無ければメールアラートを出す

といった方法で対応することにしました。以下のArchitectureです。

<img width= 1500 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/13e34f52-4748-3f18-c3e2-3f37b35c6a20.png>


実際にはArchitecture図のラズパイ部分を増やして複数個所の見守りをしています。義実家ではラズパイ２台、自宅ではラズパイ4台が稼働しています。　

なお、リクエスト３番目のメールアラートはAWS SNSからgmailにアラートする設定にしましたが今回の投稿では説明しません。

## 成果物

#### センサーモニター
リクエスト１に応える為のセンサーデータの表示にはAWS CloudWatch Dashboardを使いました。

これ以外に、DynamaDBに貯めたデータをLambdaでS3にグラフ出力してCloudfront経由で閲覧も試みましたが、今回は１０分間隔表示で、データ取り出しの必要が無いので、安価に済むCloudWatch Dashboardを使いました。（１分更新が必要ならLambdaとDynamoDBを使いました）

Dashboardは後述の[（８）](https://qiita.com/nsaito9628/items/312112486ce61ba396ae)で説明します。

<img width= 1500 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/d0a895ac-9dee-3b7f-fa55-b18e5142edb6.png>

#### 映像確認用web page
リクエスト２に応える為に簡単な映像確認用web pageを作りました。S3のBucket policyでアクセスをOAIに制限してCloudfront経由での映像確認が可能にしてあります。

Pythonの初歩的スキルしかなく他の言語も使えなかったので、アップロードされたmp4ファイルをタイムスタンプ昇順に表示するのに苦労しました。本職の方が見ると相当変わったことをしているように見える（今の自分でも別の作り方をする）と思います。スタイルシートでPCとスマホどちらでも表示できるように設定しました。

後述の[（９）](https://qiita.com/nsaito9628/items/73f8f2b175000db46ec2)で作った当時のままを紹介します。

<img width= 720 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/a2a26cdd-d955-ddaf-cf78-c7ea475c72d6.gif>



## 次回以降に説明する内容

構築した内容の中で以下について書きます。


[(2) 見守りProjectの設計（名前の設定）](https://qiita.com/nsaito9628/items/da402829316549853d0f)
[(3) ラズパイ物理構成とパッケージ導入方法](https://qiita.com/nsaito9628/items/528ab7ccd0a62515463b)
[(4) aws cliでAWS IoTに新しいモノを登録し証明書を発行する方法](https://qiita.com/nsaito9628/items/2ff6ab6d471537270e68)  
[(5) paho.mqttでセンサーデータをラズパイからAWS IoTにPublishする方法](https://qiita.com/nsaito9628/items/db43b1e854a3cc95df1a)
[(6) ラズパイでイベント録画してS3にuploadする方法](https://qiita.com/nsaito9628/items/8126fda477d61d542414)
[(7) ラズパイの自動起動の設定方法](https://qiita.com/nsaito9628/items/705b02393218e6c4d95d)
[(8) template.yamlで定義するAWSリソースの説明とsam deployの方法](https://qiita.com/nsaito9628/items/312112486ce61ba396ae)
[(9) S3にuploadした映像の確認用web pageをdeployする方法](https://qiita.com/nsaito9628/items/73f8f2b175000db46ec2)
[(10) 以上の内容を一部シェルスクリプトにまとめてcliでラズパイ環境とAWSリソースを構築する手順](https://qiita.com/nsaito9628/items/0339662ed04ba56bbb44)


## 説明しない内容

システム構築に必要ですが以下の内容は詳細な説明はしません。参考URLの紹介等にとどめます。

*  ラズパイの起動用microSDの作成方法
*  ラズパイのwifi設定
*  AWSアカウントの作成方法
*  AWS IAM userの設定方法
*  IAM userのAccess key IDとSecret access keyの生成方法
*  CloudFormationのCount Macroテンプレートのdeploy

## 業務で役立ったこと
得られたスキルの一部は実務でも活用しています。
さすがにリポジトリーはPrivateですが勉強会のLTで概要を紹介させていただいています。

* [Cloudformation (SAM) で実装した EC2 の 運用自動化](https://speakerdeck.com/nsaito9628/cloudformation-sam-deshi-zhuang-sita-ec2-false-yun-yong-zi-dong-hua)
* [工場でStep FunctionsでStep Functions](https://speakerdeck.com/nsaito9628/gong-chang-destep-functionsdestep-functions)
* [ラズベリーパイで工場が見える話](https://speakerdeck.com/nsaito9628/razuberipaidegong-chang-gajian-eruhua)
* [ LambdaとDynamoDBで簡易時系列グラフ作った話](https://speakerdeck.com/nsaito9628/lambdatodynamodbdejian-yi-shi-xi-lie-gurahuzuo-tutahua)

などです。

## 次回
[(2) 見守りProjectの設計（名前の設定）](https://qiita.com/nsaito9628/items/da402829316549853d0f)に続きます。　　

## 追記
#### 修正　2022.08.22
Project全体のパラメーター設定について説明する投稿を各論の最初に追加を予定します。リポジトリーの説明での整合性に悩みましたが全体の設計→各々の環境構築の順で説明します。

#### 修正　2022.10.26
CloudFormationのCount Macroテンプレートのdeployが必要な記述を追加しました。