CloudStorage에 파일이 업로드되면 이메일 알림

소개



타이틀 대로의 일이 하고 싶고 분투한 기사입니다.
GCP의 서비스만으로 간단하게 할 수 있을까 생각하면 그렇지도 않았습니다.

손쉽게 메일 통지의 구조의 그림 (망상)


실현 방법



결론을 보면 Cloud Functions의 Cloud Storage 트리거를 활용했습니다.

메일 통지의 구조 실현판의 그림





이런 메일이 도착






상세



파일이 "완료/생성"되면 코드가 실행됩니다. 코드는 아래와 같습니다.

메일 전송 코드

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


가장 손쉽게 떠오른 방법.
하지만 원래 Stackdriver logging에는 파일 작성될 때의 로그는 통지되지 않았습니다.

보츠안 2~Stackdriver monitoring의 GCS Bucket의 Object count 메트릭 증가를 트리거에 메일~



Stackdriver monitoring의 Alert Policy Conditions 설정을 보면 얼마나 좋은 메트릭이 있습니까?


이런 그림의 느낌으로 갈 것 같다.

간단하게 통지를 실현할 수 있는 구성의 그림


하지만, 이 object count는 리얼타임이 아니라 하루 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에 로그를 출력하는 다이어그램


결과적으로 이것은 능숙하게 움직였지만 통지의 메일이 경고가 되어 버리는 것이 이마이치였다.


끝에



AWS의 S3라면 더 쉽게 비슷한 구조를 구축할 수 있을까라고 생각했다

좋은 웹페이지 즐겨찾기