Рубрики
Без рубрики

Скачать ведро S3

Скачать ведро S3. Помечено с AWS, S3, Python.

Первоначально опубликовано в 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”