これはまだ私の頭を包み込むことができない奇妙なことです。なぜBoto3を使用して、put_objectによってAWS S3に配置されるオブジェクトに "期限切れ"の日時を設定すると、格納され、AWSのCosnoleに「メタデータ」として表示されるのはなぜですか。しかし、私が "expires"というオブジェクトを取得すると、datetimeはメタデータ辞書のdatetime要素ではなく、オブジェクトのdatetime要素として表示されます。Boto3 S3既存のオブジェクトのメタデータを更新する
この質問は私を困惑させましたが、私はそれを理解することなくその周りで働いていました。 How to update metadata of an existing object in AWS S3 using python boto3?読みやすくするために下にコピーされます:
import boto3
s3 = boto3.resource('s3')
s3_object = s3.Object('bucket-name', 'key')
s3_object.metadata.update({'id':'value'})
s3_object.copy_from(
CopySource={'Bucket':'bucket-name', 'Key':'key'},
Metadata=s3_object.metadata, MetadataDirective='REPLACE')
は私の「期限が切れる」のメタデータが破壊されるようにします今では、このメソッドを使用することを私に来ます。もちろん、私はこの試みた:
metakeys.metadata.update({'x-amz-meta-hell':'yes', 'expires': metakeys.expires})
をしかし、それはスロー:はAttributeError:「datetime.datetimeの」オブジェクトが属性「エンコード」
を持っていないあなたが「期限が切れる破壊することなく効率的にメタデータを更新できることは事実であります"要素をコンソールから取得します。上記の方法は、ある程度、A:有効ではないか、正しくない、B:壊れた、C:どちらも壊れていて正しくないことを示唆しています。
質問は次のとおりです。 AWS S3オブジェクトのこのまたは将来の奇妙な振る舞いを破壊することなくオブジェクトを作成できますか?
これは私のこの呼び出しの使用経験と一致しています。しかし、私の "expires"タグは、 CopySource = {'Bucket': 'bucket-name'、 'Key': 'key'}、 で上書きされているということになります。Metadata = s3_object.metadata、MetadataDirective = 'REPLACE ') そして、私は、タグも CopySource =で上書きされ、 "期限が切れる" {' バケツ ':' バケツ名」、 'キー': 'キー'}、 メタデータ= s3_object.metadata、MetadataDirective = 'COPY') を私に;ユーザーのメタデータを更新しているので、上記のコマンドのどちらも "期限切れ"に上書きされないようにする必要があります。 –
@ Trip-G私はあなたの "上書きされた"の意味についてはわかりません。 s3.copy_from()はあなたのSOURCEオブジェクトを変更すべきではありません。 TARGETオブジェクトを変更します。 – mootmoot