Папка не удаляется на Amazon S3 - PullRequest
13 голосов
/ 23 марта 2012

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

Ответы [ 5 ]

16 голосов
/ 16 ноября 2016

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

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

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

5 голосов
/ 24 марта 2012

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

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

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

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

Удачи!

1 голос
/ 22 октября 2016

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

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

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/"
1 голос
/ 11 февраля 2016

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

An unexpected error has occurred. Please try again later.

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

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

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

0 голосов
/ 10 июня 2014

Сначала прочитайте содержимое каталога из метода 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 - имя сегмента.

...