Подтвердить что ты не робот

Папка не будет удалена на Amazon S3

Я пытаюсь удалить папку, созданную в результате задания MapReduce. Другие файлы в bucket delete просто отлично, но эта папка не будет удалена. Когда я пытаюсь удалить его с консоли, индикатор выполнения рядом с его статусом остается равным 0. Проделали несколько попыток, в том числе с выходом из системы/входа между ними.

4b9b3361

Ответ 1

В первую очередь Amazon S3 на самом деле не имеет собственной концепции папок/каталогов, а представляет собой плоскую архитектуру хранения, состоящую из ведра и объекты/ключи - презентация стиля каталога, встречающаяся в большинстве инструментов для S3 (включая AWS Management Console) основана исключительно на соглашении, то есть моделирование иерархии для объектов с одинаковыми префиксами - см. мой ответ на Как указать префикс срока действия объекта, который не соответствует каталогу? для получения более подробной информации об этой архитектуре, включая цитаты/ссылки из документации AWS.

Соответственно, ваша проблема может возникнуть из инструмента, использующего другое соглашение для моделирования этой иерархии, например, следующие ответы на форумах AWS:

  • Иван Моисеев ответит на соответствующий вопрос Не удается удалить файл из ведра, где он предлагает использовать другой инструмент для проверки того, может иметь такую ​​проблему и исправить ее соответствующим образом.

  • Ответ команды AWS на Что представляют собой эти объекты $$ $$? - Это соглашение, используемое рядом инструментов, включая Hadoop для создания каталогов на S3. Они в первую очередь необходимы для обозначения пустых каталогов. Возможно, вы предпочли бы более эстетичную схему, но хорошо, что это делают эти инструменты.

Удачи!

Ответ 2

У меня была такая же проблема, и я использовал AWS CLI для исправления:

aws s3 rm s3://<your-bucket>/<your-folder-to-delete>/ --recursive ;

(предполагается, что вы запустили aws configure и aws s3 ls s3://<your-bucket>/ уже работает)

Ответ 3

Я получал следующую ошибку, когда пытался удалить ведро, которое было каталогом, в котором хранятся файлы журналов из Cloudfront.

An unexpected error has occurred. Please try again later.

После того, как я отключил ведение журнала в Cloudfront, мне удалось успешно удалить папку.

Я предполагаю, что это была системная папка, используемая Cloudfront, которая не разрешала удаление владельцем.

В вашем случае вы можете проверить, поддерживается ли MapReduce в соответствующей папке.

Ответ 4

У меня была та же проблема. Пробовал много попыток входа, выхода из системы и обновления, но проблема сохраняется. Искал stackoverflow и нашел предложения обрезать и вставить папку в другую папку, а затем удалить, но не сработал. Еще одна вещь, которую вы должны посмотреть, - это управление версиями, которое может повлиять на ваш ведро, может привести к приостановке версии, позволяющей вам удалить папку.

Мое решение состояло в том, чтобы удалить его с помощью кода. Я использовал пакет boto в python для обработки файлов по s3, и удаление было выполнено, когда я попытался удалить эту папку из моего кода на питоне.

import boto
from boto.s3.key import Key
keyId = "your_aws_access_key"
sKeyId = "your_aws_secret_key"
fileKey="dummy/foldertodelete/" #Name of the file to be deleted
bucketName="mybucket001" #Name of the bucket, where the file resides
conn = boto.connect_s3(keyId,sKeyId) #Connect to S3
bucket = conn.get_bucket(bucketName) #Get the bucket object
k = Key(bucket,fileKey) #Get the key of the given object
k.delete() #Delete

S3 не сохраняет каталог, у него просто плоская структура файла, поэтому все управляется с помощью ключа. Для вас это папка, но для S3 это просто ключ.

Если вы хотите удалить папку с именем → dummy то ключ будет

fileKey = "/dummy/"

Ответ 5

Сначала прочитайте содержимое каталога из метода getBucket, затем получите список всех файлов, а затем удалите файл из метода deleteObject.

 if (($contents = $this->S3->getBucket(AS_S3_BUCKET, "file_path")) !== false) 
 {
     foreach ($contents as $file) 
     {
     $result = $this->S3->deleteObject(AS_S3_BUCKET,$file['name']);
     }
 }

$this->S3 - это объект класса S3, а AS_S3_BUCKET - имя ведра.