Amazon Prime Videoのごちうさ監視システムをサーバーレスで構築した
つくったもの
背景
- Amazon Prime Videoでは毎年定期的にごちうさが観られなくなる
去年の
インフラ・仕様
問題点
- PCの電源が点いていないと動かない
- ごちうさが視聴可能になったら毎日メールが届いてしまっていた
- テストを書かなかった
今年の
インフラ・仕様
- AWS LambdaをCloudWatch Eventsで定期実行
- puppeteer不使用。HTTPレスポンスを単純にパース
- 死活をCloudWatchのカスタムメトリクスとして書き出す
- 死活の変化を監視し、アラームを発する
- アラームでSNSをトリガーし、メールを送信する
改善点
- PCの電源が点いていないと動かない
- -> クラウドで常に動いている!
- ごちうさが視聴可能になったら毎日メールが届いてしまっていた
- -> 死活の変化を監視するので、通知が飛び続けない
- テストを書かなかった
- -> まじめに書きました
その他意識して学びをねじ込んだこと
- テスタビリティを考慮した設計
- モジュールのインタフェースと実装の分離
- DI
- InversifyJS
- 見積もり
- trivariate estimation
- The Clean Coderに書いてあったやつ
- Optimistic (<1%), Nominal, Pessinistic(<1%)の3通り見積もって分布を算出するやつ
- 見積もり7時間に対して実作業時間は7時間10分だった。すごい
- trivariate estimation
- IaC
- 初めてCloudFormationを使った
- 直接は使ってないけど…
- Serverless Frameworkというのを使った
- 初めてCloudFormationを使った
- JavaScriptのエコシステム周り
- tslint初めて使った
- TypeScriptのコンフィグ少し書いた
- path aliasとか
- webpackとTSとjestそれぞれに書かないといけないの何とかならないの
- path aliasとか
ソフトウェア設計
- 推移的な依存や相互依存がなくて、結構キレイなんじゃないでしょうか(自画自賛)
- 1年間ダラダラ学んできただけのことはある
- インタフェースに
I
とかInterface
とか付けない試みを試してみた- Clean Code ch2 -- Meaningful Namesより
- 利用側はそれがinterfaceなのかclassなのか意識しないのが望ましいという考え
- 代わりに実装クラス側に
Impl
を付けてみた- これはこれでBridge Patternっぽくてヤダ…
- 言語機構以外のものがどこに位置するかも意識した
- 例: Prime VideoのURL
- これはインフラではなくてドメイン知識といって差し支えないかと
- 例: Prime VideoのURL
- 今回は
Content
クラスは単なるデータストアクラスとしたcontent.isAvailable(): boolean
とか生やそうかと思ったけどやめたContent
にAvailableChecker
をコンストラクタ注入しようと思ったが、InversifyJSでの実現方法がわからず
備忘録
- なにか思い出したら書く
- 書くほどのことはなかった気もする