I’m trying to set the lifecycle configuration of a subdirectory in Amazon S3 bucket by using boto3 put_bucket_lifecycle_configuration. I used this code from aws documentation as referece:
lifecycle_config_settings = {
'Rules': [
{'ID': 'S3 Glacier Transition Rule',
'Filter': {'Prefix': ''},
'Status': 'Enabled',
'Transitions': [
{'Days': 0,
'StorageClass': 'GLACIER'}
]}
]}
I removed Transitions and added Expiration, to better fit my purpouses. Here is my code:
myDirectory = 'table-data/'
lifecycle_config_settings = {
'Rules': [{
'ID': 'My rule',
'Expiration': {
'Days': 30,
'ExpiredObjectDeleteMarker': True
},
'Filter': {'Prefix': myDirectory},
'Status': 'Enabled'
}
]}
s3 = boto3.client('s3')
s3.put_bucket_lifecycle_configuration(
Bucket=myBucket,
LifecycleConfiguration=lifecycle_config_settings
)
The error I’m receiving is:
An error occurred (MalformedXML) when calling the PutBucketLifecycleConfiguration operation: The XML you provided was not well-formed or did not validate against our published schema
What could be causing this error?
Advertisement
Answer
I followed @Michael-sqlbot suggestion and found the reason it wasn’t working.
The problem in this settings is in 'ExpiredObjectDeleteMarker': True that is inside Expiration key. In boto3 documentation there is an observation about it.
'ExpiredObjectDeleteMarker'cannot be specified with Days or Date in a Lifecycle Expiration Policy.
Fixing it, the settings will be:
lifecycle_config_settings = {
'Rules': [{
'ID': 'My rule',
'Expiration': {
'Days': 30
},
'Filter': {'Prefix': myDirectory},
'Status': 'Enabled'
}
]}