すでにオブジェクトを Amazon S3 バケットにアップロードしている場合、API を使用してメタデータを変更するにはどうすればよいですか? AWS マネジメント コンソールでこれを行うことは可能ですが、プログラムで行う方法は明らかではありません。具体的には、私は Python で boto API を使用しています。ソースを読むと、key.set_metadata の使用はローカル ディクショナリに影響するだけなので、オブジェクトが作成される前にのみ機能することが明らかです。
7 に答える
x-amz-metadata-directive: REPLACEメタデータに加えてヘッダー付きの「PUTオブジェクト(コピー)」を使用して、オブジェクトをそれ自体で上書きする必要があるようです。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;
私はこの解決策をほとんど見逃していました。これは、実際にはこの質問とは異なる問題に関する誤ったタイトルの質問のイントロで示唆されています: Change Content-Disposition of existing S3 object
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);`
メタデータをリモートに保存する場合は、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
copy コマンドを使用すると、オブジェクトを再アップロードせずにメタデータを変更できます。この質問を参照してください:オブジェクト全体をダウンロードせずに S3 オブジェクトのヘッダーを変更することは可能ですか?
最初の回答については、元のコンテンツ タイプをメタデータに含めることをお勧めします。次に例を示します。
key.set_metadata('Content-Type', key.content_type)
これが私のために働いたコードです。aws-java-sdk-s3 バージョン 1.10.15 を使用しています
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(fileExtension.getMediaType());
s3Client.putObject(new PutObjectRequest(bucketName, keyName, tempFile)
.withMetadata(metadata));
Java では、オブジェクトを同じ場所にコピーできます。ここでは、オブジェクトのコピー中にメタデータはコピーされません。オリジナルのメタデータを取得し、リクエストをコピーするように設定する必要があります。Amazon S3 オブジェクトのメタデータを挿入または更新するには、この方法をお勧めします
ObjectMetadata metadata = amazonS3Client.getObjectMetadata(bucketName, fileKey);
ObjectMetadata metadataCopy = new ObjectMetadata();
metadataCopy.addUserMetadata("yourKey", "updateValue");
metadataCopy.addUserMetadata("otherKey", "newValue");
metadataCopy.addUserMetadata("existingKey", metadata.getUserMetaDataOf("existingValue"));
CopyObjectRequest request = new CopyObjectRequest(bucketName, fileKey, bucketName, fileKey)
.withSourceBucketName(bucketName)
.withSourceKey(fileKey)
.withNewObjectMetadata(metadataCopy);
amazonS3Client.copyObject(request);