‼️

AWSを使ったメール通知設定:S3のイベントをトリガーに活用する方法

に公開

はじめに

本記事では、EventBridgeとLamdaを使用して、S3へのオブジェクトのアップロードをトリガーにメールを送信する手順を紹介します。

構成図

以下のような処理を想定します。

使用端末

  • Macbook Air M1,2020
  • OS macOS Sonoma バージョン14.6.1

この記事でやらないこと

  • Amazon SNSへのメールアドレス登録
    こちらの手順に関しては以前私が執筆した以下の記事を参考にしていただければと思います。

https://zenn.dev/yu_shi/articles/99a5f0b473a5ac

  • S3バケットの作成

実施手順

IAMロールの作成

Lambdaで作成する関数にアタッチするためのIAMロールを事前に作成します。

以下の点に注意して、ロールの作成を行います。

①信頼されたエンティティタイプでAWSのサービスを、ユースケースでLambdaを選択

②ポリシーは以下の3つをアタッチ

   AmazonS3ReadOnlyAccess
   AmazonSNSFullAccess
   AWSLambdaBasicExecutionRole

Lambda関数の作成

以下のコードを参考に、Lambda関数を作成します。
※topicarnを自身が使用したいものに書き換えてください。

import boto3
import json

def lambda_handler(event, context):
    try:
        sns_client = boto3.client('sns')
        
        # SNSトピックARN(設定済みのトピックARN)
        sns_topic_arn = "arn:aws:sns:ap-northeast-1:762233727903:object-create"
        
        # S3イベントから情報を取得
        if 'Records' in event and len(event['Records']) > 0:
            record = event['Records'][0]
            bucket_name = record['s3']['bucket']['name']
            object_key = record['s3']['object']['key']
        else:
            raise ValueError("Event does not contain S3 record information.")
        
        # メッセージを作成
        message = f"New file uploaded to S3 bucket '{bucket_name}': {object_key}"
        subject = "S3 Upload Notification"
        
        # SNS通知を送信
        response = sns_client.publish(
            TopicArn=sns_topic_arn,
            Message=message,
            Subject=subject
        )
        
        # ログに成功結果を記録
        print(f"SNS Publish Response: {response}")
        
        return {
            'statusCode': 200,
            'body': json.dumps('Notification sent successfully!')
        }
    
    except Exception as e:
        # エラー発生時のログ
        print(f"Error: {e}")
        return {
            'statusCode': 500,
            'body': json.dumps(f"Error sending notification: {str(e)}")
        }

また、以下の事項に注意してください。
①ランタイムはPythonを選択
②実行ロールは先ほど作成したものを選択

3.以下のテストコードを使用し、Lambda関数が正常に動作することを確認します。

{
  "Records": [
    {
      "eventVersion": "2.1",
      "eventSource": "aws:s3",
      "awsRegion": "ap-northeast-1",
      "eventTime": "2023-01-01T12:34:56.000Z",
      "eventName": "ObjectCreated:Put",
      "s3": {
        "bucket": {
          "name": "your-bucket-name"
        },
        "object": {
          "key": "test-file.txt"
        }
      }
    }
  ]
}

バケットの設定

作成済みのバケットに対して、Event Bridgeへの通知設定をオンにする必要があります。
1.S3コンソールから対象のバケットを押下し、プロパティを選択します。


2.EventBridgeの編集を押下します。


3.オンを選択し、変更の保存を押下します。
なお、変更の保存が完了するまでには最大で5分ほどかかります。


4.イベント通知を作成します。


5.イベントタイプでPUTを選択します。


6.送信先として、作成したLambda関数を選択し、「変更の保存」を押下します。


EventBridgeのルール作成

1.イベントパターンを持つルールを選択し「次へ」を押下します。


2.以下のようにイベントパターンを構築します。
①イベントリソースとしてAWSイベントまたはEventBridgeパートナーイベントを選択します。


②画像の赤枠部分を同様に設定し、「次へ」を押下します。


3.ターゲットを以下の通り選択し、「次へ」を押下します。
※関数は自身が作成したものを選択してください。


4.ルールが作成され、ステータスが有効になっていることを確認します。


メール送信テスト

バケットにオブジェクトを保存し、メールが来ていることを確認します。

最後に

今回はEメールを送信するだけという簡単な処理でしたが、今後もっと複雑な処理も試してみたいと考えている所存です。
あと、記事の内容とは関係ありませんが明けましておめでとうございます。
今年も昨年以上にたくさんの技術に触れられればなあと思います。

おしまい。

Discussion