見守りカメラRingの録画データをS3に保管して家族にのみ配信する

Ringという見守りカメラを実家に設置している
設置のきっかけは祖父の介護。いつも無茶して立ち上がろうとして倒れたりしてて、そんなとき動き出した時点でRingから通知され駆けつけることができていたので便利だった
Ringの録画は家族との何気ない会話や、祖父含め大変だった介護に家族一丸で取り組んだ思い出を振り返ることができる、祖父が亡くなった今となっては貴重な映像になっている

Ringの録画データはクラウドに保存され、基本的には一定期間後に削除される
家族の要望もあり、録画データを保全し、いつでも見られる状態にしたいとなった

Ringの録画データをS3に置いて保全する

ブラウザで気合でダウンロードした
やろうと思えばseleniumとかでダウンロードを自動化できそうではある

気づいたときにはRing運用開始から2ヶ月が経ったことにより初期の録画から削除されつつあったんですが、削除されたのは2日分くらいで済んで、その後のデータは保全することができました

S3に置いた録画データを家族が見られるようにしたい

  • 専用クライアントみたいなのはめんどいし、親は多分使いきれないはず
  • ブラウザで見られるのがとりあえず良い
  • 一応プライベートな映像なので、家族だけが見られて、インターネットの海には流れないようにする

AWSで配信アプリを作った

リポジトリ: https://github.com/kefi550/private_s3_media_distributor

  • s3 + cloudfront署名付きURL でビデオ配信
  • apigateway + lambda でwebアプリ
    • Lambda Powertools Pythonを使って最低限のルーティングだけを使ってみた
      • Basic認証をベタッと書いていたが、APIGateway REST APIではレスポンスの WWW-Authenticate ヘッダが削除されるらしくBasic認証がいい感じに動かなかった。そのためHTTP APIを使うようにした
      • もともとaws-wsgi + APIGateway REST APIを使おうとしていたが、Basic認証が動かない問題により、aws-wsgiでなくlambda powertools + HTTP APIを使うことにした
    • cdkでlambda等まで作った上で sam local start-api -t cdk.out/<template>.json でローカル開発環境にした
      • 小さいlambda + apigatewayアプリならこのスタイルでいい気がする

認証はとりあえずのBasic認証
UIは最低限で、素朴なHTMLだけを返す
コンテンツ量は限定的なため、ページングとかもせず、愚直にS3をリストして画面に列挙する
ビデオにアクセスされたら毎回CloudFrontの署名URLを作って配信する

保全した録画をとりあえず家族にシェアできるようになってよかったです

今後の展望

  • 今は機械的なファイル名が並んでいるだけなのでサムネを作って表示する
  • 認証がお粗末ではあるのでcognitoなど使ってマシな認証にする
  • お気に入りのような機能を付ける
  • 録画データのRingからのダウンロードを自動化する (今も一応防犯用途的に使っているため)