少しずつ、プライベートでのインプットとアウトプットを再開している@mosuke5です。
という話はおいておいて、オブジェクトストレージ(S3を例にとる)のメタデータ管理について書きます。
S3のオブジェクトのメタデータ管理など今更という感じもありますが、案外「なぜそうするのか?」について書かれた日本語の記事が少なかったので、書いておこうと思います。
S3のオブジェクトのメタデータ管理方法の種類について
S3内のオブジェクトのメタデータの管理方法はいくつかあります。
- オブジェクトのメタデータ機能を利用する
- オブジェクトのタグ機能を利用する
- メタデータを外部ストレージ等に保存する
メタデータ機能を利用する
S3にはオブジェクトごとにメタデータを保有しており、ユーザサイドでメタデータを追加することもできます。 このメタデータには基本的に2つの種類があります。システムメタデータとユーザ定義メタデータです。 システムメタデータは、名前の通りS3がシステム的に登録しているメタデータで、代表的なものにオブジェクトのサイズやオブジェクトのバージョン、ストレージクラスなどが記載されています。
ユーザ定義でメタデータをセットすることも可能です。
しかし、このメタデータは基本的にアクセスしたときにHTTP Headerとしてレスポンスが返ることになります。
メタデータのキー値もx-amz-meta
が先頭に必ず付く必要があります。
HTTP Headerへの記載する用途として使うのが一番ふさわしいといえるでしょう。
試しに、とあるオブジェクトに対してx-amz-meta-mosuke
というのを追加してみてHTTPのレスポンスHeaderをみてみました。
レスポンスに追加したメタデータが追加されていることがわかります。
$ curl -I https://s3-ap-northeast-1.amazonaws.com/mosuke5-bucket/some-object
HTTP/1.1 200 OK
x-amz-id-2: juKYB/CT2Y6tKwZtCzx+ekySq3urohsF2tJGume+mvSmwd/oYw4AMue5rLPp4D9L8q7M3Z8x/T0=
x-amz-request-id: 8CF6A3284876D199
Date: Sat, 20 Oct 2018 09:41:27 GMT
Last-Modified: Sat, 20 Oct 2018 09:41:25 GMT
ETag: "66cebd6dbb821d5b43777c8f3362acad"
x-amz-meta-mosuke5: tsuikashitayo
Accept-Ranges: bytes
Content-Type: application/octet-stream
Content-Length: 277965
Server: AmazonS3
タグ機能を利用する
メタデータとは別に「タグ」という機能が2016年ごろに追加されました。
こちらもメタデータと同様にキーバリューの形でタグを登録できます。
主な用途としては、AWSも公式に発表していますが、下記のようなことを想定しているようです。
- ライフサイクルポリシーがタグに対応したとのことで、タグを使ってストレージクラスを決める
- IAMのポリシーでタグが利用できるようになり、よりきめ細かに権限設定が可能になった
- S3の分析機能との連携
外部ストレージ等に保存する
最後に、外部ストレージで管理する方法もあります。
下記AWSのブログで紹介されているように、S3へのオブジェクトのアップロードなどをトリガーにLambdaを起動させ、メタデータをDynamoDBへ保存するなどで実装できます。
Building and Maintaining an Amazon S3 Metadata Index without Servers
これから記述していきますが、なぜわざわざS3のオブジェクトのメタデータを外部ストレージに保存する必要があるのか。
それは、メタデータを使った集計やインデックスを張っての検索などを行いたい場合に有効です。
ケーススタディ
これはAWSのSolutin Architect Professionalの問題でも問われていたユースケースです。
「ファイル共有サービスを提供している会社があるとします。このサービスで扱うファイル数が数百万になる予定です。
このサービスの収益はユーザの利用するストレージ量に基づくものです。さらに、アップロードしたファイルに対して、そのタイトルやディスクリプション、公開可否などいくつかのメタデータを持たせたいと思っています。
これらを実現するのに、コスト効率がよくて、今後のユーザの拡大に対応できるアーキテクチャはどうしたらいいだろうか。」
オブジェクトに対してタグやメタデータを使って、追加の情報を付与することが可能です。
しかし、アプリケーションとして上記の方法で情報を追加するのは適切とは言えません。
なぜならば、例えばタイトルやディスクリプションで検索したい、あるいはそれぞれのファイルのサイズを格納しており集計したい、こういった場合にはやはりなんらかのDBにいれておくことで実現しやすいからです。もちろんシチュエーションによると思います。