事象
今回、AWS S3にファイルがputされたことをトリガに起動するLambdaを作成したのですが、ファイルサイズが大きいファイルを該当のS3バケットにアップロードした際にイベント通知がされずLambdaが起動しないというトラブルがありました。
その原因と対策を共有させて頂きます。
原因
そもそもS3には様々なイベント通知のタイプが存在します。
S3トリガのLambdaを作成する場合は、トリガーとしてS3バケットに対してどのようなアクションがあった時に通知を送るかを設定する必要があります。
今回の場合は、S3にファイルが配置(PUT)された時にLambdaを起動させたかったので、以下のPUTのイベントタイプを設定しました。
イベントタイプ:s3:ObjectCreated:Put
AWSのドキュメントを見て頂くと全てのイベント通知のタイプを確認できます。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/notification-how-to-event-types-and-destinations.html
しかし、AWSによるとサイズが大きいファイルをS3にアップロードする場合、特にアップロード方法を指定しなければS3PUTではなくS3マルチアップロードが実行されることがあるそうです。
そのため、ファイルサイズが大きいファイルをS3にアップロードした場合、S3PUTのイベントが通知されなかったのでLambdaが起動しませんでした。
解決策
解決策は、Lambdaのトリガーに該当のS3バケットのPUTイベントだけでなく、マルチアップロードイベントも設定することです。
要は、Lambdaに以下の2つをトリガーとして設定すれば良いだけです。
- s3:ObjectCreated:Put
- s3:ObjectCreated:MultipartUpload
ちなみにトリガーの設定方法はLambdaからでもS3からでもどちらでも設定可能です。
まとめ
S3にファイルがアップロードされた際にLambda等にイベントを通知する場合、PUTイベントだけだとファイルサイズが大きいファイルをアップロードした際に、マルチアップロードイベントが実行されてPUTイベントが通知されないことがありますのでご注意下さい。