Amazon S3 イベント通知を試してみた

# 背景・目的
今まで、S3のイベント通知を使用したことがなかったので整理してみました。
また、今回、EventBridgeに通知を行いメールで受信するまで試してみました。

# まとめ
S3から、SNS、SQS、Lambda、EventBridgeに対して通知ができます。


# 概要
## Amazon S3 イベント通知とは
- S3 イベント通知機能を使用して、S3 バケットで特定のイベントが発生したときに通知を受け取ることが可能。
- 通知を有効にするには、S3 から発行するイベントを識別する通知設定を追加する。

現在、S3は下記の通知が可能とのことです。
- New object created events
- Object removal events
- Restore object events
- Reduced Redundancy Storage (RRS) object lost events
- Replication events
- S3 Lifecycle expiration events
- S3 Lifecycle transition events
- S3 Intelligent-Tiering automatic archival events
- Object tagging events
- Object ACL PUT events

### イベント通知のタイプおよび送信先
#### サポートされているイベントの送信先
- 下記の宛先にイベントの通知メッセージを送信可能とのことです。
    - Amazon Simple Notification Service (Amazon SNS) のトピック
    - Amazon Simple Queue Service (Amazon SQS) キュー
    - AWS Lambda
    - Amazon EventBridge

# 実践
## S3バケットの設定
1. バケットを作成します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/03ad2f8b-7fb2-6d2f-f3c0-9fac247234d4.png)

1. 該当するS3バケットのプロパティ＞イベント通知のEventBridgeサブセクションの「編集」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5859d8c5-720c-2e30-94a4-7d6238017b3c.png)

1. このバケット内の全てのイベントについて Amazon EventBridgeに通知を送信するを「オン」に変更し、「変更の保存」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a9a0a21c-e198-8196-69a9-79c1a351c3db.png)

## SNSの設定
1. 下記を入力し、トピックを作成します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/fca1d520-bcc7-e8f4-5504-a5fdd858b666.png)
1. サブスクリプションの作成をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c47eac7c-0a91-c1ff-e6ae-befb8fceb2f2.png)
1. 下記を入力し、サブスクリプションの作成をクリックします。
    - トピックには、作成したトピックを指定
    - プロトコルには、Eメール
    - エンドポイントは、メールアドレスを指定
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/29b88599-1ec3-5298-b62c-7542c972be30.png)
1. しばらくするとメールが送られてくるので、メール本文のConfirm Subscriptionをクリックすると、SNSのステータスが「確認済み」に変わります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e8ec777b-e357-3f25-f938-f53ce9ad5bae.png)

## イベントルールの設定
:::note info
イベントパターンの特定のバケットを指定する場合、S3パス（s3://XXX）や、ARNではなく、バケット名だけ指定します。
:::
1. EventBridgeのナビゲーションペインで、「ルール」＞「ルールを作成」をクリックします。 
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6e5f31ff-990f-3dc3-1a13-2388eaaeeee2.png)

1. 下記を入力し、「次へ」をクリックします。
    - 名前
    - イベントバスはDefault
    - ルールタイプは、イベントパターンを持つルールを選択
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0a2bd635-d03c-24a7-6797-750768bd6223.png)

1. 下記を入力し、「次へ」をクリックします。
    - AWS イベントまたは EventBridge パートナーイベント
    - 作成のメソッドは、「パターンフォームを使用する」
    - イベントパターン
        - イベントソースは、AWSサービス
        - AWSのサービスは、S3
        - イベントタイプは、S3イベント通知
        - 特定のイベントは、Object Created
        - 特定のバケット（名前別）は、作成したS3バケット名
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e6701895-5c26-d429-7155-aa0b3afdff1d.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/aeccf994-cc4e-5746-ac99-a4a36c1b49c4.png)


1. 下記を入力し、「次へ」をクリックします。
    - ターゲットタイプは、「AWSのサービスはのサービス」
    - ターゲットを選択は、「SNSトピック」
    - トピックは、作成したトピック名
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a6fc9aee-d8bb-dbc8-da64-efa719273a85.png)
1. タグの設定、確認画面を経て「作成」をクリックします。

## 単一ファイルをPutしたときの確認
1. S３バケットにファイルをアップロードします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3a7d6134-0fd6-0642-c8d5-9837ada896b6.png)

1. 下記のようなメールが届きます。
    - バケット名とオブジェクト名、PutObjectであることがわかります。
    ```
    {"version":"0","id":"XXXXXXXX","detail-type":"Object Created","source":"aws.s3","account":"XXXXXX","time":"2023-03-17T14:30:08Z","region":"ap-northeast-1","resources":["arn:aws:s3:::XXXXXX"],"detail":{"version":"0","bucket":{"name":"XXXXX"},"object":{"key":"noticetest4.txt","size":14,"etag":"XXXXXX","sequencer":"XXXXXX"},"request-id":"XXXXXXX","requester":"XXXXXXX","source-ip-address":"XXXXXX","reason":"PutObject"}}
    ```

## 複数のファイルをPutしたときの確認
1. S3バケットにファイルを複数アップロードします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c3cfdb51-5161-90e5-ad3e-0a15659c32bf.png)

1. 　やはり下記のように、複数の通知（メール）が届きました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f53496a8-83d2-ed6d-2be7-8ea8bd865dde.png)

# 考察
今回はメールで通知としましたがLambdaやSQS/SNSと連携することで色々と可能性は広がりそうです。

# 参考
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/enable-event-notifications-eventbridge.html

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-s3-object-created-tutorial.html