Первоначально опубликовано в https://gist.github.com/neo01124/dc31d0b08bd7ac6906d06197e20dc9b6
Это должно быть, по крайней мере, 5-й раз, когда я написал этот тип кода для разных проектов и решил сделать его для хорошего.
Это может показаться очень тривиальной задачей, пока вы не поймете, что S3 не имеет концепции иерархии папки. S3 имеет концепцию ведер и ключей. Ведра плоские я. Нет папок. Весь путь (Folder1/folder2/folder3/file.txt) – это ключ для вашего объекта. S3 UI представляет это как файловый браузер Но нет никаких папок. Внутри ведра есть только ключи. От Docs S3
Модель данных Amazon S3 – это плоская структура: вы создаете ведро, а ведро> Магазины объектов. Нет иерархии суббатков или подпапок; Тем не менее, вы> можете сделать вывод логической иерархии, используя префиксы ключей и разделители, поскольку Console Amazon> S3 делает.
Задача в этой задаче состоит в том, чтобы по существу создать структуру каталогов (папку1/папку2/папку3/) в клавише перед загрузкой фактического содержимого объекта S3.
AWS CLI сделает это для вас с Синхронизация работы
aws s3 sync s3://yourbucket /local/path
- Установить BOTO3.
- Создайте IAM пользователь с аналогичным политикой
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:ListMultipartUploadParts", "s3:GetObject", "s3:GetBucketLocation", ], "Resource": [ "arn:aws:s3:::your_bucket_name" ] } ] }
- Создайте профиль в ~/.aws/учетные данные с деталями доступа этого пользователя IAM, как объяснено в БОТО Документация
- Код
import boto3, errno, os def mkdir_p(path): # mkdir -p functionality from https://stackoverflow.com/a/600612/2448314 try: os.makedirs(path) except OSError as exc: # Python >2.5 if exc.errno == errno.EEXIST and os.path.isdir(path): pass else: raise def get_s3_path_filename(key): key = str(key) return key.replace(key.split('/')[-1],""), key.split('/')[-1] def download_s3_bucket(bucket_name, local_folder, aws_user_with_s3_access): session = boto3.Session(profile_name=aws_user_with_s3_access) s3_client = session.resource('s3') s3_bucket = s3_client.Bucket(bucket_name) for obj in s3_bucket.objects.all(): s3_path, s3_filename = get_s3_path_filename(obj.key) local_folder_path = os.path.join(*[os.curdir,local_folder, s3_path]) local_fullpath = os.path.join(*[local_folder_path, s3_filename]) mkdir_p(local_folder_path) s3_bucket.download_file(obj.key, local_fullpath) download_s3_bucket(bucket_name = your_bucket_name, local_folder = "/tmp/s3_bucket", aws_user_with_s3_access = profile_name)
Я бы сделал посылку, если есть достаточно интереса:)
Оригинал: “https://dev.to/neo01124/download-s3-bucket–3bkp”