この記事は Alibaba Cloud アドベントカレンダー2021 3日目の記事です。
とある案件で「OSSにファイルがアップロードされたことを通知してほしい」という依頼がありました。
そこでOSSのログ機能であるLogServiceを使ったという話です。
背景
OSSにはイベント通知機能があります。
OSSのドキュメント Event notification Overview
これはOSSで発生したイベント(ファイルのuploadとかdownloadとか)をMNSに通知する機能です。
便利な機能なのですが、MNSからは直接ユーザーへ通知ができません。
MNSからユーザーへのそれらしい通知を行うには、OSS→MNS→別のプロダクト(FunctionComputeやらECSやら)経由でユーザーに送信しないといけないです。
特に今回はメールで通知がほしいとのことだったので、少し面倒だなと感じました。
例えばこんな感じになります。(有償のチュートリアルです)
Labex - OSS File Download Triggers Email Sending
そこでもっとシンプルな方法として、OSSのログをLogServiceで検出して、LogServiceのアラート機能で通知することにしました。
概要
ファイルがOSSの特定ディレクトリにアップロードされたことをメールで通知する
ファイルの検出クエリ
OSSにファイルをアップロードしたさいに、ログから operation をキーとして検出する。
operationの値
- PostObject ・・・Alibaba Cloudコンソールからの通常のファイルアップロード。これは検知する。
- PutObject ・・・OSSブラウザなどのAPIからの通常のファイルアップロード。これは検知する。
- UploadPart ・・・マルチアップロードパートで分割されたファイルアップロード。これは検知したくない。
- CompleteUploadPart ・・・マルチアップロードパートが完了したファイルアップロード。これは検知する。
例えば、OSSの 2021-yoshimura バケットに test.jpeg ファイルをアップロードすると
OSSのログには以下のように operation : PostObject が記録されます
更に念の為に、OSSにファイルをアップロードしたさいに、ログから http_status をキーとして検出する。
http_statusの値
- 204 ・・・ Alibaba Cloudコンソールからのファイルをアップロードした際のステータスコード
- 200 ・・・ OSSブラウザなどのAPIからファイルをアップロードした際のステータスコード
例えば先程同様に、OSSの 2021-yoshimura バケットに test.jpeg ファイルをアップロードするとこんな感じです。
Alibaba Cloudコンソールからアップロードすると204
ここまで分かれば、あとはLogServiceで検出クエリを以下のように作ります。
2021-yoshimura バケットのすべてのフォルダにアップロードした場合の検出クエリ
* AND bucket: 2021-yoshimura AND (operation:CompleteUploadPart OR PostObject) AND http_status: 204
* AND bucket: 2021-yoshimura AND (operation:CompleteUploadPart OR PutObject) AND http_status: 200
クエリの保存とアラート通知
先ほどのクエリを保存して、LogServiceのアラートルールを作ります。
アラート条件
- Log Search 期間 ・・・過去15分
- Log Search 頻度 ・・・15分に1度
- Trigger 条件 ・・・ contains(http_status, '200') ※204は別途アラートルールを作成
- 通知方法 ・・・メール
これでOSSにファイルがアップロードされると15分間隔で検知&通知してくれます。
ちなみにLogServiceのアラート機能は今年バージョンアップして、様々な機能が使えるようになりました。
画像の参考URL : The alerting feature of Log Service
カレンダーで休日を指定してアラートを停止したり、メール以外にもSMSや電話通知など様々な通知方法が使えたりでするので、興味ある方はそちらも見てみてください。
それでは、明日の4日目にパス。