Management ConsoleからS3のオブジェクトを削除するとcreateイベントが発生する?

2016.01.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

S3にオブジェクトをアップロードした際に、SQSなどにイベント通知することは良くあるかと思います。今回、ObjectCreatedのイベント通知設定してあるバケット配下のオブジェクトをManagement Consoleから削除したところSQSへ通知されたのでちょっと調べてみました。

イベント通知してみる

ObjectCreated(All)イベントでSQSに通知されるように設定したバケットのevent-test/というパスに対してhoge.csvというファイルをアップロードします。

{バケット}
 └─event-test
   └─hoge.csv

以下のようにSQSに通知がされました。

SQS1

次にManagement Consoleからアップロードしたhoge.csvを削除します。削除した際にSQSにイベント通知されていることが分かります。

SQS2

キューのメッセージの詳細をみてみると、event-test/というオブジェクトがPutされているのが分かります。

","eventName":"ObjectCreated:Put",・・・
"object":{"key":"event-test","bucket":{"name":"cm-test","ownerIdentity":{"principalId":"AVNGKDU9UP8JL"},"arn":"arn:aws:s3:::cm-test"},"object":{"key":"event-test/","size":0,"eTag":"d41d8cd98f00b204e9800998ecf8427e","sequencer":"00568CAA47BE056E24"}・・・

※一部を抜粋して記載しています。

メッセージからすると削除イベントで通知されているわけではないことが分かりました。
本当にevent-testを作成しているかS3のアクセスログを出力してみて確認してみました。 S3のアクセスログはManagement Consoleで対象のバケットを選択してPropertiesからEnabledにチェックを入れ、ログを出力する先を設定すればログが出力されるようになります。
出力されたログを見るとやはり、DELETEの後にevent-testがPUTされていることが分かります。

[06/Jan/2016:06:41:15 +0000] user/cm-test 6D9D9851E6E2E741 REST.DELETE.OBJECT event-test/hoge.csv "DELETE /cm-ootaki/event-test/hoge.csv HTTP/1.1" 204 - - 98368 18 - "-" "S3Console/0.4" -

[06/Jan/2016:06:41:16 +0000]user/cm-test .kentaro D8B5A0EEE3D4CF54 REST.PUT.OBJECT event-test/ "PUT /cm-ootaki/event-test/ HTTP/1.1" 200 - - 0 46 28 "-" "S3Console/0.4" -

※ログは抜粋して記載しています。
※ログはリアルタイムには出力されないので注意して下さい。

ではどうしてPutされるのか

AWS CLIで同様の操作をしても、event-testがPutされることは当然ありません。またManagement Consoleからの操作あってもバケット直下のオブジェクトやevent-test配下に1つ以上のオブジェクトが配置されてる場合はオブジェクトを削除してもevent-testがPutされることはありません。
今回、バケット配下の”event-test/hoge.csv”にファイルをアップロードしました。Management Consoleでみるとevent-testというフォルダ配下にhoge.csvがあるように見えますが、S3にはフォルダという概念はなく”event-test/hoge.csv”というパスにオブジェクトが存在していることになります。 例えば、AWS CLIから”{バケット}/aaa/bbb.txt”というオブジェクトをPutします。その後、AWS CLIから作成したオブジェクトを作成すると、”aaa/”は削除されています。
今度はManagement Consoleから”aaa/bbb.txt”を作成します。同様にAWS CLIからオブジェクトを削除します。今度は”aaa”が残ります。この違いはManagement Consoleでの操作では”aaa”を作成した後にbbb.txtをアップロードしています。その場合”aaa”と”aaa/bbb.txt”という二つのオブジェクトが作成されることになります。そのため、AWS CLIから”aaa/bbb.txt”を削除しても”aaa”が残ることになります。

話が少し長くなりました。当初のどうしてPutされるか?になりますが、Management Console上では”aaa”というフォルダを作成して”bbb.txt”を作成します。そのためあたかも”aaa”というフォルダ配下に”bbb.txt”が存在するように見えます。(Management ConsoleではCreate Folderボタンからパスを作成するようにフォルダという表現をしています)
そのため、AWS CLIから”aaa/bbb.txt”を作成した後に、Management Consoleから”bbb.txt”を削除した場合、本来”aaa/bbb.txt”が消えるはずですが、”aaa”フォルダ配下の”bbb.txt”を削除したと思わせるために、オブジェクト削除後にあえて”aaa”を自動で作成していると推測します。
よって、”aaa/bbb.txt”、”aaa/ccc.txt”という複数オブジェクトが存在する場合は、Management Consoleから”aaa/bbb.txt”を削除しても、”aaa”が作成されることはありません。これは”aaa/ccc.txt”があるため、Management Consoleから”aaa”というフォルダがあるように見せられるからだと思います。

まとめ

特定の条件下の場合、Management Consoleからオブジェクトを削除すると勝手にパスをPutしていることが分かりました。 特定のファイルのみS3にアップロードしないのであれば、イベントを設定する際にSuffixにオブジェクトの拡張子を指定してあげることで、Management Consoleからオブジェクトを削除してもイベント通知されなくなるので設定することをオススメします。 以上 Management ConsoleからS3のオブジェクトを削除するとcreateイベントが発生するの調査でした。