8
2

More than 1 year has passed since last update.

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

Posted at

はじめに

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

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

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

Lambda Function を作成

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

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

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

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

image-20220223220207610.png

Create event notification を押します

image-20220223220402588.png

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

image-20220223220651864.png

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

image-20220223220715215.png

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

image-20220223220851532.png

設定されました

image-20220223220919783.png

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

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

image-20220223221206848.png

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

image-20220223221317839.png

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

image-20220223221331487.png

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

image-20220223221448057.png

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

  • eventName : このイベント自体の種類 : ObjectCreated:Put
  • s3.bucket.name : S3 Bucket の名前 : s3-presigned-test01
  • s3.object.key : アップロードした Object の名前 : test-event-notification-from-console.txt
[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 も含めてイベントに記録されている。

[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", となっている。

[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"
                }
            }
        }
    ]
}
8
2
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
8
2