import boto3 from botocore.exceptions import ClientError from datetime import datetime, timedelta import csv import sys def get_bucket_size(bucket_name: str, storage_type: str) -> float: client = boto3.client('cloudwatch') end_time = datetime.now() start_time = end_time - timedelta(days=30) response = client.get_metric_statistics( Namespace='AWS/S3', MetricName='BucketSizeBytes', Dimensions=[ { 'Name': 'StorageType', 'Value': storage_type }, { 'Name': 'BucketName', 'Value': bucket_name } ], StartTime=start_time, EndTime=end_time, Period=86400 * 30, Statistics=[ 'Average', ], Unit='Bytes' ) stat = 0 for datapoint in response['Datapoints']: stat = datapoint['Average'] return bytes_to_gib(stat) def bytes_to_gib(number: int) -> float: return number / 1024 / 1024 / 1024 def get_s3_buckets() -> list: client = boto3.client('s3') buckets_response = client.list_buckets() s3_buckets = [] for s3_bucket in buckets_response['Buckets']: # get bucket size bucket_size = get_bucket_size(s3_bucket['Name'], 'StandardStorage') # get expiration try: lifecycle_response = client.get_bucket_lifecycle_configuration(Bucket=s3_bucket['Name']) expiration_days = 'No' for rule in lifecycle_response['Rules']: if 'Expiration' in rule: if 'Days' in rule['Expiration']: expiration_days = rule['Expiration']['Days'] except ClientError: expiration_days = 'No' # get bucket tags try: tagging_response = client.get_bucket_tagging(Bucket=s3_bucket['Name']) tag = "".join([tag['Value'] for tag in tagging_response['TagSet'] if tag['Key'] == 'plat_env_project_service']) except ClientError: tag = "" s3_buckets.append((s3_bucket['Name'], bucket_size, tag, expiration_days)) return s3_buckets def main(argv): with open('s3-buckets.csv', mode='w') as s3_bucket_file: s3_buckets_writer = csv.writer(s3_bucket_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) s3_buckets_writer.writerow( ( 'BUCKET_NAME', 'BUCKET_SIZE(AVG/MONTH)', 'TAG_VAL', 'EXPIRATION_DAYS' ) ) s3_buckets_writer.writerows(get_s3_buckets()) if __name__ == '__main__': sys.exit(main(sys.argv[1:]))