В отличие от иерархических файловых систем, Object Storage имеет плоскую структуру. В нем нет файлов и папок в традиционном понимании. Все объекты хранятся на одном уровне.
Чтобы лучше организовать данные и упростить навигацию, можно имитировать работу с папками. Такой подход используется в веб-консоли и во многих графических утилитах: с точки зрения пользователя все операции с объектами выглядят так, как если бы он работал с папками и файлами в иерархической файловой системе.
Чтобы имитировать работу с папками, нужно создать пустой объект, имя которого заканчивается косой чертой (/) — например, myphotos/. Если нужно создать вложенные папки, к имени добавляются дополнительные элементы с разделителями — например, myphotos/folder1/photo1.png.
В дальнейшем это имя будет использоваться во всех операциях с папкой. Например, чтобы добавить объект в папку myphotos/, нужно добавить к его имени соответствующий элемент с разделителем.
Имя папки должно отвечать следующим требованиям:
иметь формат UTF-8;
иметь длину от 1 до 1023 байт;
не содержать символов : * ? " < > | !;
не начинаться с символов / и \ .
Веб-консоль AWS CLI Python Go
Чтобы создать пустой объект, который будет представлять папку:
В
веб-консоли выберите нужный проект.
В списке сервисов выберите Object Storage .
Нажмите на имя нужного бакета.
На вкладке Объекты нажмите кнопку Создать папку .
Введите имя папки и нажмите кнопку Создать .
aws s3api put-object --bucket <имя бакета> --key <имя папки>/
Приведенный код на Python:
Импортирует необходимые библиотеки, в том числе boto3 — официальный AWS SDK для Python.
Получает из аргументов командной строки имя бакета и имя папки, которую нужно создать внутри этого бакета.
Создает сессию с использованием профиля по умолчанию, который хранится в файле ~/.aws/credentials.
Создает клиент для подключения к Object Storage.
Создает пустой объект, который будет представлять папку, и добавляет к его имени косую черту.
Выводит сообщение об успешном создании папки.
# Импортируем необходимые модули
# Принимаем в качестве аргументов командной строки имя бакета и имя папки, которую нужно создать внутри этого бакета
parser = argparse. ArgumentParser ( description = ' Create a folder in an S3 bucket. ' )
parser. add_argument ( ' -b ' , ' --bucket ' , required = True , help = ' Name of the S3 bucket ' )
parser. add_argument ( ' -d ' , ' --directory ' , required = True , help = ' Name of the folder to create ' )
args = parser. parse_args ()
# Создаем сессию и клиент для подключения к Object Storage
session = boto3.session. Session ( profile_name = ' default ' )
s3 = session. client ( service_name = ' s3 ' , endpoint_url = ' https://storage.mwsapis.ru/ ' )
# Создание папки (пустого объекта в S3)
folder_key = f " { args.directory } /" # Добавляем косую черту в конце, чтобы обозначить папку
s3. put_object ( Bucket = args.bucket , Key = folder_key , Body = b '' )
print ( f "Successfully created folder ' {args.directory} ' in bucket ' {args.bucket} '" )
Приведенный код на Go:
Импортирует необходимые пакеты, в том числе AWS SDK для Go.
Получает из аргументов командной строки имя бакета и имя папки, создание которой нужно имитировать.
Подгружает конфигурацию из ~/aws/*.
Создает клиент для доступа к Object Storage.
Создает пустой объект, который будет представлять папку.
Выводит сообщение об успешном создании папки.
" github.com/aws/aws-sdk-go-v2/aws "
" github.com/aws/aws-sdk-go-v2/config "
" github.com/aws/aws-sdk-go-v2/service/s3 "
// Получаем имя бакета из аргумента командной строки
bucketName := flag . String ( " b " , "" , " The name of the bucket " )
folderName := flag . String ( " d " , "" , " Name of the folder to create " )
fmt . Println ( " You must supply the name of a bucket (-b BUCKET) " )
fmt . Println ( " You must supply the name of the folder (-d FOLDER) " )
// Подгружаем конфигурацию из ~/.aws/*
cfg , err := config . LoadDefaultConfig ( context . TODO ())
// Создаем клиент для доступа к хранилищу S3
client := s3 . NewFromConfig ( cfg )
// Создаем пустой объект, который будет представлять папку
_ , err = client . PutObject ( context . TODO (), & s3.PutObjectInput{
Bucket : aws . String ( * bucketName ),
Key : aws . String ( * folderName + " / " ), // Добавляем косую черту в конце, чтобы обозначить папку
Body : bytes . NewReader ( nil ), // Передаем пустое тело
log . Fatalf ( " Unable to create folder %q in bucket %q , %v " , * folderName , * bucketName , err )
fmt . Printf ( " Successfully created folder %q in bucket %q \n " , * folderName , * bucketName )
Веб-консоль AWS CLI Python Go
В
веб-консоли выберите нужный проект.
В списке сервисов выберите Object Storage .
Нажмите на имя нужного бакета.
Нажмите на значок ... для удаляемой папки и выберите Удалить .
aws s3 rm --bucket <имя бакета> --key <имя папки> --recursive
Приведенный код на Python:
Импортирует необходимые библиотеки, в том числе boto3 — официальный AWS SDK для Python.
Получает из аргументов командной строки имя бакета и имя папки, которую нужно удалить из этого бакета.
Создает сессию с использованием профиля по умолчанию, который хранится в файле ~/.aws/credentials .
Создает клиент с использованием созданной сессии.
Получает список всех объектов с элементом, который указан как имя папки.
Удаляет все эти объекты.
def delete_objects_with_prefix ( bucket_name , prefix ) :
session = boto3.session. Session ( profile_name = ' default ' )
endpoint_url = ' https://storage.mwsapis.ru/ '
# Получаем список всех объектов в бакете: которые объединены в указанную папку
objects = s3. list_objects_v2 ( Bucket = bucket_name , Prefix = prefix )
objects_to_delete = [ { ' Key ' : obj[ ' Key ' ]} for obj in objects. get ( ' Contents ' , [] ) ]
# Удаляем объекты по частям, т.к. есть ограничение на количество объектов в одном запросе
for i in range ( 0 , len ( objects_to_delete ) , max_keys ):
response = s3. delete_objects (
Delete = { ' Objects ' : objects_to_delete [ i:i + max_keys ] }
print ( f "Deleted { len ( response. get ( ' Deleted ' , [] )) } objects" )
print ( f "Folder {prefix} deleted" )
if __name__ == " __main__ " :
parser = argparse. ArgumentParser ( description = ' Delete objects with a specific prefix from an S3 bucket ' )
parser. add_argument ( ' -b ' , ' --bucket ' , required = True , help = ' Name of the bucket ' )
parser. add_argument ( ' -f ' , ' --folder ' , required = True , help = ' Name of the folder to delete ' )
args = parser. parse_args ()
delete_objects_with_prefix ( args.bucket , args.folder )
Приведенный код на Go:
Импортирует необходимые пакеты, в том числе официальный AWS SDK для Go.
Получает из аргументов командной строки имя бакета и имя папки в этом бакете, которую нужно удалить.
Подгружает конфигурацию из файлов ~/.aws/*.
Cоздает клиент для доступа к Object Storage.
Удаляет все объекты с указанным элементом, выступающим в качестве имени папки.
Выводит сообщение об успешном удалении папки и всех объектов в этой папке.
" github.com/aws/aws-sdk-go-v2/aws "
" github.com/aws/aws-sdk-go-v2/config "
" github.com/aws/aws-sdk-go-v2/service/s3 "
" github.com/aws/aws-sdk-go-v2/service/s3/types "
// Получаем имя бакета и префикс из аргументов командной строки
bucketName := flag . String ( " b " , "" , " The name of the bucket " )
prefix := flag . String ( " f " , "" , " The name of the folder to delete " )
fmt . Println ( " You must supply the name of a bucket (-b BUCKET) " )
fmt . Println ( " You must supply the name of a folder (-f FOLDER) " )
// Подгружаем конфигурацию из ~/.aws/*
cfg , err := config . LoadDefaultConfig ( context . TODO ())
// Создаем клиент для доступа к Object Storage
client := s3 . NewFromConfig ( cfg )
// Получаем список всех объектов, объединенных в указанную папку
listObjectsInput := & s3.ListObjectsV2Input{
Bucket : aws . String ( * bucketName ),
Prefix : aws . String ( * prefix ),
listObjectsOutput , err := client . ListObjectsV2 ( context . TODO (), listObjectsInput )
var objectIdentifiers []types.ObjectIdentifier
for _ , obj := range listObjectsOutput . Contents {
objectIdentifiers = append ( objectIdentifiers , types.ObjectIdentifier{ Key : obj . Key })
// Удаляем все объекты с указанным элементом в имени
deleteObjectsInput := & s3.DeleteObjectsInput{
Bucket : aws . String ( * bucketName ),
Objects : objectIdentifiers ,
_ , err = client . DeleteObjects ( context . TODO (), deleteObjectsInput )
log . Printf ( " Successfully delete folder %s with all objects inside it " , * prefix )
Примечание
Удаление папки может занимать длительное время. Информация о ходе удаления отображается на странице бакета (вкладка Операции ).