Я пытаюсь удалить папку, созданную в результате задания MapReduce. Другие файлы в bucket delete просто отлично, но эта папка не будет удалена. Когда я пытаюсь удалить его с консоли, индикатор выполнения рядом с его статусом остается равным 0. Проделали несколько попыток, в том числе с выходом из системы/входа между ними.
Папка не будет удалена на Amazon S3
Ответ 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
- имя ведра.