public note

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() を使います。

boto3 S3.Client.upload_file

boto3 S3.Client.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してみる

boto3 S3.Client.get_object

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)

その他の選択肢

参考にしたサイト

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/