S3 へアップロードしたファイルのサイズが大きいときに Lambda へのイベント通知が送信されない場合の対処方法

S3 イベント通知にてイベントタイプ「完了したマルチパートアップロード」の設定を追加することでファイルサイズが大きい場合も Lambda への通知を送ることが可能です。
2021.09.14

困っていた内容

S3 バケットにオブジェクトをアップロードした際に、そのイベントをトリガーにして Lambda 関数を起動させる設定をしています。
アップロードしたファイルのサイズが大きいときに Lambda へのイベント通知が送信されない事象が発生しています。対処方法を教えてください。

どう対応すればいいの?

S3 イベント通知にてイベントタイプ「完了したマルチパートアップロード」の設定を追加してください。
S3 コンソールよりバケットを選択 > プロパティタブをクリック > イベント通知の編集 から変更が可能です。

完了したマルチパートアップロード

S3 へファイルサイズの小さいものがアップロードされた場合は、s3:ObjectCreated:Put イベントが、
ファイルサイズの大きいものがアップロードされた場合は、s3:ObjectCreated:CompleteMultipartUpload イベントがトリガーされるために事象が発生しています。

※ マルチパートアップロードについては AWS ドキュメント をご参照ください。

試してみる(環境設定)

S3 コンソールと AWS CLI でファイルをいくつかアップロードしていき、どのファイルサイズからそれぞれマルチパートアップロードが実行されるかを検証します。

チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出す を参考に S3 バケットと Lambda を作成します。

チュートリアルの通りに作成すると、「完了したマルチパートアップロード」を含む「すべてのオブジェクト作成イベント」が S3 バケットで発生した際に Lambda へイベント通知が行われる設定となります。

my-s3-function関数

今回はテストのため、S3 コンソールより対象バケットのイベント通知を編集し、あえて「完了したマルチパートアップロード」イベントの選択を外して設定を保存します。

完了したマルチパートアップロードをあえて選択しない

約 50 KBのファイルをバケットにアップロードする

S3 コンソール

まずは S3 コンソールより、約 50 KB の jpeg ファイルを対象バケットにアップロードします。

50KB-S3コンソール

50KB-S3コンソール-2

問題なく Lambda に通知が行われ、CloudWatch Logs にログが出力されました。

50KB-S3コンソール-Logs

AWS CLI

次に AWS CLI から cp コマンドで同じファイルを対象バケットにアップロードします。
※ 同じファイルですがオブジェクト名を「dogo2.jpg」に変更しています。

$ aws s3 cp dogo.jpg s3://test-20210912-lambda/dogo2.jpg
upload: dogo.jpg to s3://test-20210912-lambda/dogo2.jpg

アップロードが完了しました。

50KB-CLI

こちらも問題なく Lambda に通知が行われ、CloudWatch Logs にログが出力されました。

50KB-CLI-Logs

約 9 MBのファイルをバケットにアップロードする

S3 コンソール

S3 コンソールより、約 9 MB の Keynote プレゼンテーションファイルを対象バケットにアップロードします。

9MB-S3コンソール

9MB-S3コンソール-2

問題なく Lambda に通知が行われ、CloudWatch Logs にログが出力されました。

9MB-S3コンソール-Logs

AWS CLI

次に AWS CLI から cp コマンドで同じファイルを対象バケットにアップロードします。
※ 同じファイルですがオブジェクト名を「Docker2.key」に変更しています。

$ aws s3 cp Docker.key s3://test-20210912-lambda/Docker2.key
upload: Docker.key to s3://test-20210912-lambda/Docker2.key

アップロードが完了しました。

9MB-CLI

しかし、Lambda に通知が行われず、CloudWatch Logs にログが出力されませんでした。

9MB-CLI-Logs

AWS CLI でマルチパートアップロードが実行されるファイルサイズ

AWS CLI でのアップロード時にファイルが 8 MB 以上のファイルサイズである場合にマルチパートアップロードが実行されるとのことです。

AWS CLI S3 Configuration

multipart_threshold
Default - 8MB
When uploading, downloading, or copying a file, the S3 commands will switch to multipart operations if the file reaches a given size threshold.

約 17 MBのファイルをバケットにアップロードする

S3 コンソール

S3 コンソールより、約 17 MB の PDF ファイルを対象バケットにアップロードします。

17MB-S3コンソール

17MB-S3コンソール-2

しかし、この場合は Lambda に通知が行われず、CloudWatch Logs にログが出力されませんでした。

17MB-CLI-Logs

S3 コンソールでマルチパートアップロードが実行されるファイルサイズ

検証を行ったところ、15.6 MB のファイルの場合は Lambda へ問題なく通知が行われました。
そのため、S3 コンソールからのアップロードの場合は 15.7~16.8 MB あたりからマルチパートアップロードが実行されるかと思います。

参照