2017-02-25 303 views
0

これはまだ私の頭を包み込むことができない奇妙なことです。なぜ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オブジェクトのこのまたは将来の奇妙な振る舞いを破壊することなくオブジェクトを作成できますか?

答えて

0

"Expires"パラメータでput_object()を実行すると、次のような情報が得られます。

{ 
    'Expiration': 'string', 
    'ETag': 'string', 
    .......... 
} 

しかし、Expirationは、それはあなたのユーザーカスタムメタデータではありません、属性です。すべてのユーザーカスタムメタデータはSTRINGにしかなりません。メタデータのチェック時には、すべてプレフィックスx-amz-meta-が付きます。アップデートの上

metakeys.metadata.update({'x-amz-meta-hell':'yes', 'expires': metakeys.expires}) 

与えmetakeys.expiresが文字列でない場合、失敗します。 isoformat()を使用して文字列に変換するのと同じくらい簡単です。

copy_object()は、明示的に有効期限を指定することができますが、APIドキュメントでは、元のファイルの有効期限がターゲットオブジェクトにコピーされることは明示的には言及されていません。

+0

これは私のこの呼び出しの使用経験と一致しています。しかし、私の "expires"タグは、 CopySource = {'Bucket': 'bucket-name'、 'Key': 'key'}、 で上書きされているということになります。Metadata = s3_object.metadata、MetadataDirective = 'REPLACE ') そして、私は、タグも CopySource =で上書きされ、 "期限が切れる" {' バケツ ':' バケツ名」、 'キー': 'キー'}、 メタデータ= s3_object.metadata、MetadataDirective = 'COPY') を私に;ユーザーのメタデータを更新しているので、上記のコマンドのどちらも "期限切れ"に上書きされないようにする必要があります。 –

+0

@ Trip-G私はあなたの "上書きされた"の意味についてはわかりません。 s3.copy_from()はあなたのSOURCEオブジェクトを変更すべきではありません。 TARGETオブジェクトを変更します。 – mootmoot

関連する問題