はじめに
タイトルどおりの事がやりたくて奮闘した記事です。
GCPのサービスだけで簡単に出来るかと思ったらそうでもありませんでした。
実現方法
結論から言うと、Cloud FunctionsのCloud Storageトリガーを利用しました。
メール通知の仕組み実現版の図
こんなメールが届く
詳細
ファイルが「ファイナライズ/作成」されるとコードが実行されます。コードは下記の通り。
メール送信用コード
def gcs_notification_mail(event, context):
import smtplib
from email.mime.text import MIMEText
# 変数宣言(メッセージの組み立て用)
file = event
filename = file["name"]
filesize_mb = round(int(file["size"]) / 1024 / 1024, 1) # MBに変換
jp = "iso-2022-jp"
# メッセージの組み立て
msg = MIMEText(
str(filename)
+ str("のアップロードが完了しました。\nファイルサイズは約")
+ str(filesize_mb)
+ str("MBです。"),
"plain",
jp,
)
# 変数宣言(メール送信処理用)
fromaddr = "送信元メールアドレス"
toaddr = "送信先メールアドレス"
smtpserver = "smtp.gmail.com"
loginid = "GmailのログインID"
loginpass = "Gmailのログインパスワード"
# メール送信処理
msg["Subject"] = "GCSアップロード通知"
msg["From"] = fromaddr
msg["To"] = toaddr
try:
server = smtplib.SMTP_SSL(smtpserver)
server.login(loginid, loginpass)
server.send_message(msg)
server.quit()
print(f"Processing file: {file['name']}.")
except Exception:
print("Error: unable to send email")
コードはコチラのページを参考にしました。
以降の記事は全てボツ案です。
ボツ案1~Stackdriver loggingに出力される通知をトリガーにメール~
一番お手軽に思いついた方法。
が、そもそもStackdriver loggingにはファイル作成される時のログは通知されていませんでした。
ボツ案2~Stackdriver monitoringのGCS BucketのObject countメトリック増をトリガーにメール~
Stackdriver monitoringのAlerting PolicyのConditionsの設定を見ると、なんと良さそうなメトリックがあるではありませんか!
こんな図の感じでいけそうである。
だがしかし、このobject countはリアルタイムではなく1日1回しか測定されないようである。
以下抜粋
Total number of objects per bucket, grouped by storage class. Values are measured once per day. Sampled every 300 seconds. After sampling, data is not visible for up to 600 seconds.
バケットあたりのオブジェクトの総数。ストレージクラス別にグループ化されています。値は1日に1回測定されます。 300秒ごとにサンプリングされます。サンプリング後、データは最大600秒間表示されません。
実際に試してみたらアップロードしてから数時間後にメールが飛びました。
ボツ案3~Cloud FunctionsのGCSファイル作成トリガーでstackdriver loggingにログ出力させてあとはボツ案1の方法~
Stackdriver loggingで監視するのはGCS Bucketリソースではなく、Cloud Functionsリソースが良いということでボツ案1とのコラボレーション。
結果的にこれは上手く動いたが通知のメールがアラートとなってしまうのがイマイチだった。
終わりに
AWSのS3ならもっと簡単に同じような仕組みを構築できるのかなとは思った