2017-02-25 48 views
0

這是我無法繞到我的頭,只是還沒有一件奇怪的事情。爲什麼當我使用Boto3將一個「expires」日期時間放在put_object放入AWS S3的對象上時,它會被存儲並顯示在AWS Cosnole中作爲「元數據」。但是,當我檢索對象時,我的「expires」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

如果你做一個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

這是我在使用該通話體驗是一致的。然而,更多的涉及到,那就是我的「過期」的標籤被改寫 CopySource = {「鬥」:「鬥名」,「重點」:「鍵」}, 元= s3_object.metadata,MetadataDirective ='REPLACE ') AND我的「expires」標籤也被覆蓋 CopySource = {'Bucket':'bucket-name','Key':'key'}, Metadata = s3_object.metadata,MetadataDirective ='COPY') 對我來說;因爲我正在更新用戶元數據,所以上述任何一個命令都不應該導致「過期」被覆蓋,但它們會這樣做。 –

+0

@ Trip-G我不確定你的「覆蓋」的含義。 s3.copy_from()不應該改變你的SOURCE對象。它將對TARGET對象進行更改。 – mootmoot

相關問題