#!/bin/python import boto3 import sys import os import argparse import logging from multiprocessing import Process def parse_arguments(): parser = argparse.ArgumentParser() parser.add_argument('--profile', help='AWS profile', default='gdb-delphi-prod') parser.add_argument('--concurrency', type=int, help='Size of a process pool', default=os.cpu_count()) requiredNamed = parser.add_argument_group('required named arguments') requiredNamed.add_argument('--bucket', help='s3 bucket name', required=True) requiredNamed.add_argument('--canonicalId', help='Canonical ID of bucket owner user', required=True) requiredNamed.add_argument('--keyslistfile', help='file with list of keys', required=True) requiredNamed.add_argument('--outfile', help='file with list of wrong objects', required=True) return parser.parse_args() def get_object_if_wrong_owner(client,bucket,key,canonicalId): acl = client.get_object_acl(Bucket=bucket,Key=key) if (acl['Owner']['ID'] != canonicalId): return f's3://{bucket}/{key}\n' else: return '' def process_object_list(profile,bucket,keylist,canonicalId,filename): session = boto3.Session(profile_name=profile) client = session.client('s3') object_list = '' for key in keylist: object_list += get_object_if_wrong_owner(client,bucket,key,canonicalId) with open(filename, 'a') as fd: fd.write(object_list) def partitioned_keys_list(keys_list, partitions_num): chunk_size = int(len(keys_list)/partitions_num) for i in range(0, len(keys_list), chunk_size): if ((i + chunk_size) < len(keys_list)): yield keys_list[i:(i + chunk_size)] else: yield keys_list[i:] if __name__ == "__main__": logger = logging.getLogger('') logger.setLevel(logging.DEBUG) args = parse_arguments() # I used aws cli for creating keys list # aws s3api list-objects --profile debug_profile --bucket bucket_name --query "(Contents)[].[Key]" --output text keys_list = [line.rstrip('\n') for line in open(args.keyslistfile, 'r')] #print(keys_list) #process_object_list(s3_client,args.bucket,keys_list,args.canonicalId,args.outfile) for partitioned_list in partitioned_keys_list(keys_list, args.concurrency): print(len(partitioned_list)) p = Process(target=process_object_list, args=(args.profile,args.bucket,partitioned_list,args.canonicalId,args.outfile)) p.start()