2017-09-08 41 views
0

代碼:boto3 S3 head_object方法返回存儲類無

import boto3 

s3_cli = boto3.client('s3') 
object_summary = s3_cli.head_object(
     Bucket='test-cf', 
     Key='RDS.template', 
     VersionId='szA3ws4bH6k.rDXOEAchlh1x3OgthNEB' 
    ) 

print('LastModified: {}'.format(object_summary.get('LastModified'))) 
print('StorageClass: {}'.format(object_summary.get('StorageClass'))) 
print('Metadata: {}'.format(object_summary.get('Metadata'))) 
print('ContentLength(KB): {}'.format(object_summary.get('ContentLength')/1024)) 

輸出:

LastModified: 2017-06-08 09:22:43+00:00 
StorageClass: None 
Metadata: {} 
ContentLength(KB): 15 

我無法獲得使用boto3 SDK的關鍵StorageClass。我可以看到從aws控制檯設置的存儲類別爲標準。我一直在使用s3.ObjectSummarys3.ObjectVersion方法boto3 S3 resouces也嘗試過,但他們也返回

回答

1

不確定它爲什麼返回無。同時,使用下面的代碼來獲取存儲類。讓我檢查一下我的Boto3版本。

bucket = s3.Bucket('test-cf') 
for object in bucket.objects.all(): 
    print object.key, object.storage_class 
+0

儘管...這是使用一個ListObjects響應,其中API確實返回'STANDARD'。 'HEAD' REST API調用是不同的 - 它有一個頭部'x-amz-storage-class',它提供對象的存儲類信息。Amazon S3爲所有對象返回這個頭,除了標準存儲類對象「*](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectHEAD.html),所以這將是有道理的,儘管boto3文檔表明相反。 boto3文檔也沒有提及它可以包含'GLACIER',儘管它可以,所以這可能是一個boto3文檔錯誤。 –

+0

@helloV:謝謝你的回覆。當我分析這段代碼時,我看到* bucket.objects.all()*返回一個Object Summary資源集合*。如果你執行print(object),它會輸出類似's3.ObjectSummary(bucket_name ='test-cf',key ='RDS.template')'的東西。這是我困惑的地方。如果使用ObjectSummary資源直接獲取存儲類:'s3 = boto3.resource('s3'); object = s3.ObjectSummary('test-cf','RDS.template')',它返回None(對於STD S3中的對象)。對於S3 IA/GLACIER中的對象,OBjectSummary返回正確的storage_class。 –

+0

@ Michael-sqlbot感謝您的解釋。我現在明白了。就像所有人一樣澄清,'Head' API調用返回'STANDARD_IA'或'GLACIER'對象的storage_class信息。對於'STANDARD'中的對象,它返回None。 –