web-dev-qa-db-ja.com

Amazon S3のオブジェクトのメタデータを変更する方法

オブジェクトをAmazon S3バケットに既にアップロードしている場合、APIを使用してメタデータをどのように変更しますか? AWSマネジメントコンソールでこれを行うことは可能ですが、プログラムでそれを行う方法が明確ではありません。具体的には、Python=でboto APIを使用しています。ソースを読むと、key.set_metadataを使用した場合にのみ機能することがわかりますbeforeオブジェクトはそのまま作成されますローカル辞書に影響を与えます。

35
natevw

メタデータに加えてx-amz-metadata-directive: REPLACEヘッダーを含む「PUT Object(Copy)」を使用して、オブジェクトをそれ自体で上書きする必要があるようです。 botoでは、これは次のように実行できます。

k = k.copy(k.bucket.name, k.name, {'myKey':'myValue'}, preserve_acl=True)

古い辞書に含まれていないメタデータはすべて削除されることに注意してください。したがって、古い属性を保持するには、次のようにする必要があります。

k.metadata.update({'myKey':'myValue'})
k2 = k.copy(k.bucket.name, k.name, k.metadata, preserve_acl=True)
k2.metadata = k.metadata    # boto gives back an object without *any* metadata
k = k2;

私はこの解決策を見落としがちでした。これは、実際にはこの質問とは別の問題に関する間違ったタイトルの質問のイントロで示唆されています: 既存のS3オブジェクトのContent-Dispositionの変更

36
natevw

S3ファイルにメタデータを設定するには、ソースの情報だけでメタデータを設定できるため、ターゲットの場所を指定しないでください。

final ObjectMetadata metadata = new ObjectMetadata();
metadata.addUserMetadata(metadataKey, value);
final CopyObjectRequest request = new CopyObjectRequest(bucketName, keyName, bucketName, keyName)
  .withSourceBucketName(bucketName)
  .withSourceKey(keyName)
  .withNewObjectMetadata(metadata);

s3.copyObject(request);`
11
kartik

メタデータをリモートで保存する場合は、_set_remote_metadata_を使用します

例:key.set_remote_metadata({'to_be': 'added'}, ['key', 'to', 'delete'], {True/False})

実装はこちら: https://github.com/boto/boto/blob/66b360449812d857b4ec6a9834a752825e1e7603/boto/s3/key.py#L1875

8
eddd

Copyコマンドを使用すると、オブジェクトを再ロードせずにメタデータを変更できます。この質問を参照してください: オブジェクト全体をダウンロードせずにS3オブジェクトのヘッダーを変更することは可能ですか?

5
John Bachir

最初の回答については、メタデータに元のコンテンツタイプを含めることをお勧めします。次に例を示します。

key.set_metadata('Content-Type', key.content_type) 
1
Ted