はじめに
こんにちは。グノシー事業部でサーバーサイドの開発を担当している ふそやん@パルデア地方 (@azihsoyn) / Twitterです。
こちらは Gunosy Advent Calendar 2018 9日目の記事です。なお、昨日の記事は oota3 さんの firecrackerの中身をのぞいてみた - Gunosy Tech Blog でした。firecrackerは個人的にも気になっているので時間を見つけて調べてみたいです。
さて、タイトルの通り、本記事はグノスポ開発ブログの第六回です。
以前のグノスポ開発ブログでサーバーレスであることを紹介しました。
今回はプッシュの管理画面について書きたいと思います。
管理画面の実装コスト
グノスポには現在アドホックプッシュ機能がありません。というよりは、プッシュは送れるのですが、送る側のシステムが整っていない状態です。
(本記事では 速報性の高いニュースをユーザー全体にマニュアル操作で送信するプッシュ
をアドホックプッシュと呼称します。)
弊社の他のプロダクトでは、 Django admin や ng-admin などを使って管理画面を作ってプッシュを送信しています。
グノスポでもアドホックプッシュを送りたいという需要は高く、そろそろ用意しないとなと考えたときにハードルになるのは、やはり管理画面の実装コストです。
求められる機能として上げればきりがありませんが、
- ユーザー認証・認可
- 各種CRUD API /画面
- 履歴管理
- slackなどに通知
あたりは必要になってきそうです。また、管理画面ということは管理画面のサーバーも管理する必要が出てきます。
サーバーレスアーキテクチャだからといって全ての機能をサーバーレスで実現するつもりはありませんが、そもそもの機能要件が多すぎるのでなんとかシンプルにできないかと考えていました。
そんなときにslackのやりとりで思いついたのが、
「slackのリアクション数で送信できたらいいのでは?」
というアイデアでした。
設計
現状のアーキテクチャベースでこのアイデアの仕様を検討してみると、
- 記事がDynamoDBに書き込まれたタイミングでslackのチャンネルに通知する
- slackに通知された記事に 👍/ 👎をつけるとAPI Gateway経由でLambdaを叩いてDynamoDBの賛同者数を+1/-1する
- Dynamo Streamを受け取ったLambdaが賛同者数が一定数以上だったらSNSのトピックにpublish
と最低で上記を満たせばサーバーレスアドホックプッシュシステムが実現できそうです。
リアクションは誰でも出来てしまうので、Lambdaの環境変数にプッシュ送信できるアカウント一覧を持っておくなどの必要がありそうです。
slackにはAPIがたくさんあり、リアクションに関してもAPIが用意されています。
WebSocketのリアルタイムAPIもあるので先日のre:Inventで発表されたAPI GatewayのWebSocketサポートが早速役に立つかもしれません。
ただこのシステムには欠点があります。プッシュの文言をカスタマイズできないことです。
サービスのプッシュ運用する上では割と致命的なため、このシステムで行くのはやめて普通に管理画面作るか、、、と諦めていたのですが、slackコマンドで登録する方法を思いつきました。
あとはこれを実装するだけなのですが、残念ながらアドベントカレンダー担当日までには間に合いませんでした。すみません🙇
(家で実装の続きをしようと思っていたのですが会社PCでpushするのを忘れていました。。。)
終わりに
slack + AWSで管理画面レスなアドホックプッシュシステムのコンセプトを紹介しました。 slackは弊社でも全社員が使っていて、各種外部サービスとの連携は多数あるのですが、カスタムコマンドはそこまで多くはない状況でした。 今回slack周りのAPIを調べてみて、組み合わせればいろいろ面白いことができそうだなと感じました。
少し前に発表されたactionsも面白そうです。
ただ、管理画面を作りたくないからといって無理やりslackだけで実現するのは、後々負債になりかねないのでチームの規模や要件に合わせて定期的にシステムを見直したいと思います。
もしグノスポをお使いの方で速報プッシュを受け取ったらこのシステムが完成したか、このシステムが却下されて無事管理画面が完成したんだなと思ってください。