S3 のオブジェクトメタデータを HeadObject で取得するには

S3 には、ユーザーが任意の Key-Value データを保管できるオブジェクトメタデータという仕組みがあります。

s3-object-metadata.png

単純なデータを格納できるので敢えてデータベースを用意しなくても済むというメリットがあります。

そして、S3 API には、オブジェクト自体を取得せずにオブジェクトの情報を取得する HeadObject という API があります。

API のリファレンスにはオブジェクトメタデータも取得できると書いてありますが、Ajax で呼び出したときには実はメタデータは取れません......。

しばらく悩んでいて、GitHub の AWS JS SDK Issues にもレポートが合ったので Watch していたのですがやっと原因がわかりました。

オブジェクトメタデータは、オブジェクトの GET 要求や HEAD 要求のレスポンスヘッダーにカスタムヘッダーとして返ってきています。

S3 HeadObject-Response.pngが、しかし、なぜか HeadObject の戻り値には含まれていないのです。

s3-HeadObject-response.png

どうやら CORS 設定の ExposeHeaders にユーザー定義のオブジェクトメタデータのヘッダー名を入れないといけなかったらしい。

HeadObject のドキュメントには書いてなかったけれども、S3 の CORS 設定のドキュメントにはそれらしいことは書いてあった。

s3-cors-exposeheaders.png

ということで、追加してから試してみたところ

s3-metadata-in-headobject-response-correct.png

無事にメタデータを取得できました。x-amzn-meta は取り除かれるんですね。

長年(?)の謎が解けてスッキリしました。