Search code examples
pythonamazon-s3aws-cloudformationboto3aws-cli

Validate all cloudformation files in a s3 folder


CloudFormation validate supports validating a cloudformation template in s3.
How to validate all files in a s3 location. The files are located in a folder.


Solution

  • You can use the below python script to validate all cloudformation template in s3 bucket/folder
    The below script generates Object Url/Public Url of all files in a s3 folder and then passes the url to validate_file function

    import boto3
    
    s3_uri="s3://BUCKET_NAME/FOLDER_1/FOLDER2/" # S3 URI of the folder you want to recursively scan, Replace this with your own S3 URI
    
    # Split the s3 uri to extract bucket name and the file prefix
    # Splitting S# 3 URI will generate an array
    # Combine the appropirate elements of the array to extraxt BUCKET_NAME and PREFIX
    arr=s3_uri.split('/')
    bucket =arr[2]
    prefix=""
    for i in range(3,len(arr)-1):
        prefix=prefix+arr[i]+"/"
        
    s3_client = boto3.client("s3")
        
    def validate_file(object_url): # function to validate cloudformation template
        cloudformation_client = boto3.client('cloudformation')
        
        response = cloudformation_client.validate_template(
            TemplateURL=object_url
        )
        print(response) # print the response
        
    
    def get_all_s3_files(bucket,prefix,s3_client): # generate object url of all files in the folder and pass it to validate function
    
        response = s3_client.list_objects_v2(Bucket=bucket,  Prefix=prefix) # Featch Meta-data of all the files in the folder
        files = response.get("Contents")
        for file in files: # Iterate through each files
            file_path=file['Key']
            object_url="https://"+bucket+".s3.amazonaws.com/"+file_path #create Object URL  Manually
            print("Object Url =  "+object_url)
            if object_url.endswith(".yml"):
                validate_file(object_url=object_url) # validate all files
    
    get_all_s3_files(bucket=bucket,prefix=prefix,s3_client=s3_client)