Amazon S3 イベント通知を使って Lambda Functon を呼びだしてみた

# はじめに

S3 Bucket で何らかのイベントが発生したときに、特定の処理を行いたいことがあります。例えば、大きい画像をアップロードしたあとに、自動的に小さいサムネイル画像を生成するといったことが考えられます。

このときに、S3 側でイベント通知を設定することで、SNS・SQS・Lambda・EventBridge と連携して、サムネイル画像生成といった様々な処理を行うことが出来ます。

今回の記事では、イベント通知を Lambda Function で受け取る手順を確認していきます。また、受け取ったイベントの中身も確認していきましょう。



# Lambda Function を作成

イベント通知から受け取ったイベント内容を CloudWatch Logs に出力する Lambda Function を作成します。今回は、次のような Python の Lambda Function を作成しました。

```python
import json
from logging import getLogger, INFO

logger = getLogger(__name__)
logger.setLevel(INFO)

def lambda_handler(event, context):
    print("============ logger.info の出力 ============")
    logger.info(json.dumps(event))

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world",
        }),
    }
```



マネージメントコンソールでは、こんな感じに作成しました。

![image-20220223215913612.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8390957a-0377-133c-a14c-934234909d8e.png)



# S3 Bucket でイベント通知を設定する

イベント通知を設定したい S3 Bucket の Properties を開きます。

![image-20220223220207610.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/db8053d6-4995-21e9-d5bc-f3126147bc76.png)



Create event notification を押します

![image-20220223220402588.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fb286659-1dd2-b784-1087-f85fcf24cd72.png)



Event の名前を指定します。すべての Object を対象にしたいため、Prefix と Suffix は空白のままとします。

![image-20220223220651864.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2ff1c765-8201-12de-707b-6507dff704eb.png)



Event type では、作成オペレーションを対象にしたいため、All object create events を選択します。

![image-20220223220715215.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c2be48e3-3fc3-b12f-6026-90c8db94f332.png)



イベント通知で連携したい Lambda Function を指定して、Save changes を押します。

![image-20220223220851532.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d1523ab1-aaf3-cdf4-e6e6-6f066e3e1b5d.png)



設定されました

![image-20220223220919783.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8bde0e55-ce37-fe13-738b-aad128a22477.png)



# ファイルを S3 Bucket にアップロード

ここまでで設定が完了です。簡単ですね。実際に動作を確認するためオブジェクトをアップロードしていきましょう。Upload を押します。

![image-20220223221206848.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/634a2d78-e879-f3d3-b0d3-f99ad10fb99d.png)



適当なテキストファイルをアップロードします。

![image-20220223221317839.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ad552d45-e090-c397-ce74-26e9563eb5e3.png)



アップロードされました。

![image-20220223221331487.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/dc14ed8e-ee26-a064-4474-be45ee7d86e2.png)



イベント通知の内容を確認するために、CloudWatch Logs を開きます。Lambda Function が受け取ったイベント通知内容が出力されています。

![image-20220223221448057.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/05a7e38c-ddaf-1b12-8011-e3b0cd4158f8.png)



Logs の内容です。(一部マスクしています)

- eventName : このイベント自体の種類 : `ObjectCreated:Put`
- s3.bucket.name : S3 Bucket の名前 : `s3-presigned-test01`
- s3.object.key : アップロードした Object の名前 : `test-event-notification-from-console.txt`

```json
[INFO]	2022-02-23T13:13:22.083Z	ad5795d8-a492-4809-b8ab-d4837de63f44	{
    "Records": [
        {
            "eventVersion": "2.1",
            "eventSource": "aws:s3",
            "awsRegion": "ap-northeast-1",
            "eventTime": "2022-02-23T13:13:20.928Z",
            "eventName": "ObjectCreated:Put",
            "userIdentity": {
                "principalId": "AWS:xxxxxx:your iam user name"
            },
            "requestParameters": {
                "sourceIPAddress": "your ip address"
            },
            "responseElements": {
                "x-amz-request-id": "PSHDB7WAZT59P5K5",
                "x-amz-id-2": "qVe+UDQA0JKcXCvXEk6k5j9zOOAS3q6ffxzYIYyIljQA6KI+NET9czpVYiiJnLNVXGwURnk6UbZ81N/yY34wY+KfyVZ5VCFc"
            },
            "s3": {
                "s3SchemaVersion": "1.0",
                "configurationId": "event-to-lambda",
                "bucket": {
                    "name": "s3-presigned-test01",
                    "ownerIdentity": {
                        "principalId": "A3A42BDEZS91PL"
                    },
                    "arn": "arn:aws:s3:::s3-presigned-test01"
                },
                "object": {
                    "key": "test-event-notification-from-console.txt",
                    "size": 39,
                    "eTag": "a71911a8b3b67fd336db01eabecf7935",
                    "sequencer": "00621632F0E0615D2C"
                }
            }
        }
    ]
}
```



# 付録

## フォルダー配下にオブジェクトを作成したときのイベント

`"key": "folder01/test-event-notification-from-console.txt",`　と Folder も含めてイベントに記録されている。

```json
[INFO]	2022-02-23T13:16:27.775Z	40bfe1aa-29d8-4039-b47e-98e78ebe6d63	{
    "Records": [
        {
            "eventVersion": "2.1",
            "eventSource": "aws:s3",
            "awsRegion": "ap-northeast-1",
            "eventTime": "2022-02-23T13:16:26.863Z",
            "eventName": "ObjectCreated:Put",
            "userIdentity": {
                "principalId": "AWS:xxxxxx:your iam user name"
            },
            "requestParameters": {
                "sourceIPAddress": "your ip address"
            },
            "responseElements": {
                "x-amz-request-id": "SQSRN1B6C5HDMJP8",
                "x-amz-id-2": "d8LH2y3HOivUZgHZBesPdsW2sQnac49CLjSzn1RyyYeaXz7SSrld4/RPCwAS857/1loOt7r/kB1jvqqnnRIGfNLZ5Fx/elOY"
            },
            "s3": {
                "s3SchemaVersion": "1.0",
                "configurationId": "event-to-lambda",
                "bucket": {
                    "name": "s3-presigned-test01",
                    "ownerIdentity": {
                        "principalId": "A3A42BDEZS91PL"
                    },
                    "arn": "arn:aws:s3:::s3-presigned-test01"
                },
                "object": {
                    "key": "folder01/test-event-notification-from-console.txt",
                    "size": 39,
                    "eTag": "a71911a8b3b67fd336db01eabecf7935",
                    "sequencer": "00621633AAD00B2072"
                }
            }
        }
    ]
}
```



## 署名付き URL でアップロードしたときのイベント

オブジェクトの通常のアップロードも、署名付き URL を使ったアップロードも、イベントでは区別できない。同じイベントの `"eventName": "ObjectCreated:Put",` となっている。

```json
[INFO]	2022-02-23T13:25:07.925Z	69018da5-7284-42fe-9d60-7495c68242e0	{
    "Records": [
        {
            "eventVersion": "2.1",
            "eventSource": "aws:s3",
            "awsRegion": "ap-northeast-1",
            "eventTime": "2022-02-23T13:25:06.954Z",
            "eventName": "ObjectCreated:Put",
            "userIdentity": {
                "principalId": "AWS:xxxxxx"
            },
            "requestParameters": {
                "sourceIPAddress": "10.0.0.163"
            },
            "responseElements": {
                "x-amz-request-id": "PD5BG90V0D18B365",
                "x-amz-id-2": "CXzFTYn0AYA3Irxf5rj6ena66EQZl0BCscKof8rGQXnr1jUkIaxXk+RUcMkpFMMs9CjoLDKRcvuHOMlpk9WyregLg4QhMYyG"
            },
            "s3": {
                "s3SchemaVersion": "1.0",
                "configurationId": "event-to-lambda",
                "bucket": {
                    "name": "s3-presigned-test01",
                    "ownerIdentity": {
                        "principalId": "A3A42BDEZS91PL"
                    },
                    "arn": "arn:aws:s3:::s3-presigned-test01"
                },
                "object": {
                    "key": "this-is-filename.txt",
                    "size": 42,
                    "eTag": "bc1c394a26bb03e0d360ff78daafd221",
                    "sequencer": "00621635B2E75499C7"
                }
            }
        }
    ]
}
```