I'm building a file hosting app that will store all client files within a folder on an S3 bucket. I then want to track the amount of usage on S3 recursively per top folder to charge back the cost of storage and bandwidth to each corresponding client. 
Front-end is django but the solution can be python for obvious reasons.
Is it better to create a bucket per client programmatically?
If I do go with the approach of creating a bucket per client, is it then possible to get the cost of cloudfront exposure of the bucket if enabled?
No its not possible to create a bucket for each user as Amazon allows only 100 buckets per account. So unless you are sure not to have more than 100 users, it will be a very bad idea.
The ideal solution will be to remember each user's storage in you Django app itself in database. I guess you would be using S3 boto library for storing the files, than it returns the byte size after each upload. You can use that to store that.
There is also another way out, you could create many folders inside a bucket with each folder specific to an user. But still the best way to remember the storage usage in your app
How can I track s3 bucket folder usage with python?