やりたかったこと
最近S3のバケットに対してデータを保存したり持ってきたりしてて、メタデータを介してちょっとした情報のやりとりを行いたいなぁ...と思うことがありました。
S3へのアップロード時にメタデータを付与するまではよかったんですが...
取得ってどうやるんだ...?
ってなったので、それについてです。
オブジェクトのメタデータはAWSの画面で見るとこんな感じで見ることができますね。
この(x-amz-meta-group_idなど)を、S3から取得したい!ってことです!
なかなかビシッと方法が書かれていなかったんですが、手探りでなんとか動くようにはできたので、それについてメモしておきます。
一応PHP全般でも使えると思いますが、Laravel SDKを使っているのでLaravelの記事として書いておきます。
PHP SDKをご使用の方で困っている方もおそらく参考になるかなと思います。
また、本記事では、SDKをLaravelで使えるようにしている前提で進めていきます。
AWS sdkのlaravelへの導入は以下をご参考にしてみてください。(英語ですが...余裕があれば別途記事書きます!)
メタデータを持ってくる
というわけで、早速結論から。
方法としては、クライアントを作り、headObject
というAPIを使うことで、そのファイル自体は持ってこななくとも、メタデータの取得ができます。
// Objectのメタデータを取得
$headObject = app()->make('aws')->createClient('s3')->headObject([
'Bucket' => config('aws.s3'),
'Key' => $key
]);
$groupId = $headObject['@metadata']['headers']['x-amz-meta-group_id'];
$videoId = $headObject['@metadata']['headers']['x-amz-meta-video_id'];
Bucketには対象のバケット名(ここではlaravelの環境変数.envとして設定し、それをconfigを経由して取得するようにしています。)、そして、Keyにはメタデータを持ってきたいオブジェクト(ファイル等)のキーを指定してあげます。
僕の場合はS3アップロード時にSQSに対してキー情報を投げて、そこからこのキーの情報を取得する形で実装していました。
こうすることで、自分たちが設定したメタデータに加え、そのオブジェクトに関する様々な情報が取得できます。
先ほどの画像のようにメタデータが入っている場合は以下のような形でそのデータが取得できます。
$groupId = $headObject['@metadata']['headers']['x-amz-meta-group_id'];
headObjectAPIについてはこちらを参照してみてください。
上記ページの引用ですが、最初の部分をすこしだけ。
The HEAD operation retrieves metadata from an object without returning the object itself. This operation is useful if you're only interested in an object's metadata. To use HEAD, you must have READ access to the object.
ざっと僕の雑魚雑魚イングリッシュで訳すとこんな感じ?
Head操作はオブジェクト自体を含めずそのオブジェクトのメタデータを取得できます。
この操作はオブジェクトのメタデータだけが必要な場合にとても便利です。
Head操作を行うためにはオブジェクトに対するReadアクセス権限が必要です。
まんま求めていたものでした...!
他にも色々パラメータがあったりしてそこら辺は詳しくみていないんですが...
とりあえず取得できたのでよかったです!
まとめ
さて、今回はAWSのS3からオブジェクトのメタデータを取得する方法をみていきました。
最近AWSについて色々いじる機会があり、なかなかよくわからん!ってなるんですが...w
結構うちのインフラ周りでも当たり前のように使われているので、しっかり勉強していかないといけないなぁ...と。
頑張ります...w
それでわ!