S3に大きなファイルをアップロードした時、イベントが発火しない問題の原因と対策メモ


ファイル作成(PUT/POST)時にLambda FunctionをキックするイベントをセットしたS3のバケットがある。このバケットに対して、AWS SDK for Ruby 経由でサイズが大きなファイルをアップロードしたところ、イベントが発火しない問題があった。調査にそこそこ時間がかかったのでメモ。

まとめ

  • 原因は、ファイルアップロードの方式が「PUT」から「Multipart Upload」に変わったため。AWS SDK for Rubyのデフォルト設定ではファイルサイズが「15MB」以上になると、アップロード方式が自動的に切り替わる。
  • さらに、S3のイベント発火対象の操作に「Complete Multipart Upload」を選択していなかったため、アップロード方式が「Multipart Upload」になるとイベントが発火しなかった。
  • 対策は、イベント発火対象の操作に「Complete Multipart Upload」を追加で選択すればOK。

詳細

AWS SDK for Rubyの挙動

AWS SDK for Rubyのデフォルトの閾値(15MB)を決定している部分。オプション(:multipart_threshold)で変更することも可能。

https://github.com/aws/aws-sdk-ruby/blob/v2.10.15/aws-sdk-resources/lib/aws-sdk-resources/services/s3/file_uploader.rb#L16

この閾値にしたがって、アップロード方式を切り替えている部分。

https://github.com/aws/aws-sdk-ruby/blob/v2.10.15/aws-sdk-resources/lib/aws-sdk-resources/services/s3/file_uploader.rb#L31-L35

対策

ここのチェックをつければOK。

参考