LoginSignup
1
0

More than 5 years have passed since last update.

CloudStorageにファイルがアップロードされたらメール通知したい

Posted at

はじめに

タイトルどおりの事がやりたくて奮闘した記事です。
GCPのサービスだけで簡単に出来るかと思ったらそうでもありませんでした。

楽々メール通知の仕組みの図(妄想)
GCS通知1.png

実現方法

結論から言うと、Cloud FunctionsのCloud Storageトリガーを利用しました。

メール通知の仕組み実現版の図

GCS通知(採用).png

こんなメールが届く

image.png
image.png

詳細

ファイルが「ファイナライズ/作成」されるとコードが実行されます。コードは下記の通り。

メール送信用コード
gcs_notification_mail.py
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")


トリガーとなったファイルの必要な情報(ファイル名とファイルサイズ)を取り出し、メッセージを組み立て、GmailのSMTPサーバを使ってメール送信します。

コードはコチラのページを参考にしました。
1. Python3.3でメール送信
2. Python3のメール送信
3. Python3で日本語のメールを送信

以降の記事は全てボツ案です。

ボツ案1~Stackdriver loggingに出力される通知をトリガーにメール~

ボツ案その1
GCS通知2.png

一番お手軽に思いついた方法。
が、そもそもStackdriver loggingにはファイル作成される時のログは通知されていませんでした。

ボツ案2~Stackdriver monitoringのGCS BucketのObject countメトリック増をトリガーにメール~

Stackdriver monitoringのAlerting PolicyのConditionsの設定を見ると、なんと良さそうなメトリックがあるではありませんか!
image.png

こんな図の感じでいけそうである。

シンプルに通知を実現できそうな構成の図
GCS通知3.png

だがしかし、この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とのコラボレーション。

Cloud Functionsにログを出力させる図
GCS通知4.png

結果的にこれは上手く動いたが通知のメールがアラートとなってしまうのがイマイチだった。
image.png

終わりに

AWSのS3ならもっと簡単に同じような仕組みを構築できるのかなとは思った

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0