user8405195 user8405195 - 2 months ago 15
Python Question

aws s3 - object has no attribute 'server_side_encryption'

Can someone please explain the differences in these two calls. The first one gives the correct server_side_encryption and the second one gives an error. The other attributes give the same value-

#!/usr/bin/python

import boto3
import botocore

s3 = boto3.resource('s3')
s3_client = boto3.client('s3')


object = s3.Object('abcdefhkjl9999','error.html')

print(object.bucket_name)
print(object.key)
print(object.last_modified)
print(object.storage_class)
print(object.server_side_encryption)


bucket = s3.Bucket('abcdefhkjl9999')
for object in bucket.objects.all():
print("#############################")
print(object.bucket_name)
print(object.key)
print(object.last_modified)
print(object.storage_class)
print(object.server_side_encryption)


The output is -
abcdefhkjl9999
error.html
2017-08-20 22:58:02+00:00
REDUCED_REDUNDANCY
aws:kms
#############################
abcdefhkjl9999
error.html
2017-08-20 22:58:02+00:00
REDUCED_REDUNDANCY
Traceback (most recent call last):
File "./test3.py", line 26, in <module>
print(object.server_side_encryption)
AttributeError: 's3.ObjectSummary' object has no attribute 'server_side_encryption'

Answer Source

As the error you received states, the object you're trying to get the server_side_encryption attribute from is not, in fact, of the type s3.Object, but rather of the type s3.ObjectSummary

Fortunately you can get the object as a sub-resource as specified here

inner = outer.Object() Then query for the property

print(inner.server_side_encryption)