AWS S3オブジェクトのMetadata管理
S3にファイルを格納する際に、そのファイルがどういった設定・経緯で作成されたのかを合わせて記録に残したいというニーズがありました。今回のケースでは、S3オブジェクトにMetadataを設定しつつputして、そのあとgetする手順をPythonで試したので、記録に残します。
検証環境
S3 Metadataの仕様を確認
- a set of key-value pair
- should be set lowercase
- provide on sending a PUT or POST request
- response by HTTP Header
- S3 shows user-defined-key \"x-amz-meta-[your key]"
- 2KB limit(total)
Metadataをつけてputする
upload_file() には、metadataを設定するオプションがなさそうなので、put_object() を使います。
import boto3 bucketname = 'your_bucket_name' key = 'object_key' s3 = boto3.resource('s3') s3_client = s3.meta.client with open(filepath, 'rb') as body: response_put = s3_client.put_object( Bucket=bucketname, Body=body, Key=key, ServerSideEncryption='AES256', Metadata={ 'test': 'test metadata' } ) print(response_put)
getしてみる
response_get = s3_client.get_object( Bucket=bucketname, Key=key ) metadata = response_get['Metadata'] print(metadata)
実行結果
{'test': 'test metadata'}
Bodyを取得したくない場合
response_get = s3_client.head_object( Bucket=bucketname, Key=key ) metadata = response_get['Metadata'] print(metadata)
その他の選択肢
- S3 Tag機能
- KeyValue方式
- 10個まで
- objectのハンドリングに使うことが一般的
- DynamoDB
- metadataを使って集計したり、インデックスを貼って検索したい、というときに有用
- AWS Blog - Building and Maintaining an Amazon S3 Metadata Index without Servers
参考にしたサイト
https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html#object-metadata
https://github.com/boto/boto3/issues/477
https://tasotasoso.hatenablog.com/entry/2019/01/13/171819
https://blog.mosuke.tech/entry/2018/10/16/object-storage-metadata/