hammer89
hammer89

Reputation: 393

S3 Bucket Lifecycle Configuration with Boto3 Lambda Function and getting MalformedXML format error

I created lambda function. In the function, I scanned all the s3 buckets if the bucket name contains "log" word. Took those buckets and apply the lifecycle. If the retention older than 30 days delete all kind of files under the buckets that contains "log" word. But when I triggered the code I get this format error.I couldn't fix it. Is my code or format wrong ?

This is my python code:

import logging
import boto3
import datetime, os, json, boto3
from botocore.exceptions import ClientError

def lambda_handler(event, context):
    s3 = boto3.client('s3')
    response = s3.list_buckets()
    
    # Output the bucket names
    print('Existing buckets:')
    for bucket in response['Buckets']:
        #print(f'  {bucket["Name"]}')
        if 'log' in bucket['Name']:
            BUCKET = bucket["Name"]
            print (BUCKET)
            try:
                policy_status = s3.put_bucket_lifecycle_configuration(
                          Bucket = BUCKET ,
                          LifecycleConfiguration={'Rules': [{'Expiration':{'Days': 30,'ExpiredObjectDeleteMarker': True},'Status': 'Enabled',} ]})
            except ClientError as e:
                 print("Unable to apply bucket policy. \nReason:{0}".format(e))

The error

Existing buckets:
sample-log-case
sample-bucket-log-v1
template-log-v3-mv
Unable to apply bucket policy. 
Reason: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

I took below example from boto3 site, I just changed parameters didnt touch the format but I also get the format issue for this too :

import boto3
client = boto3.client('s3')

response = client.put_bucket_lifecycle_configuration(
    Bucket='bucket-sample',
    LifecycleConfiguration={
        'Rules': [
            {
                'Expiration': {
                    'Days': 3650,
                },
                'Status': 'Enabled'
            },
        ],
    },
)

print(response)

Upvotes: 2

Views: 2952

Answers (1)

cathytol
cathytol

Reputation: 31

According to the documentation, the 'Filter' rule is required if the LifecycleRule does not contain a 'Prefix' element (the 'Prefix' element is no longer used). 'Filter', in turn, requires exactly one of 'Prefix', 'Tag' or 'And'.

Adding the following to your 'Rules' in LifecycleConfiguration will solve the problem:

'Filter': {'Prefix': ''}

Upvotes: 3

Related Questions