Я взаимодействовал с Amazon S3 через S3Fox, и я не могу удалить свои ведра. Я выбираю ковш, ударяю удалять, подтверждаю удаление во всплывающем окне и... ничего не происходит. Есть ли другой инструмент, который я должен использовать?
Удалить ведра Amazon S3?
Ответ 1
Наконец, можно удалить все файлы за один раз, используя новую функцию правил Lifecycle (expiration). Вы даже можете сделать это с консоли AWS.
Просто щелкните правой кнопкой мыши по имени ведра в консоли AWS, выберите "Свойства", а затем в строке вкладок внизу страницы выберите "жизненный цикл" и "добавить правило". Создайте правило жизненного цикла, когда поле "Префикс" пусто (пустые означает все файлы в ведре), или вы можете установить его в "a", чтобы удалить все файлы, имена которых начинаются с "a" ). Установите для поля "Дни" значение "1". Это. Готово. Предполагая, что файлы более одного дня, все они должны быть удалены, а затем вы можете удалить ведро.
Я только что попробовал это в первый раз, поэтому я все еще жду, чтобы узнать, как быстро файлы будут удалены (это было не мгновенно, но предположительно должно произойти в течение 24 часов) и получает ли я счет за одну команду удаления или 50 миллионов команд удаления... пальцы скрещены!
Ответ 2
Помните, что S3 Buckets должны быть пустыми, прежде чем их можно будет удалить. Хорошей новостью является то, что большинство сторонних инструментов автоматизируют этот процесс. Если у вас возникли проблемы с S3Fox, я рекомендую попробовать S3FM для GUI или S3Sync для командной строки. У Amazon есть отличная статья, описывающая как использовать S3Sync. После настройки ваших переменных команда ключа
./s3cmd.rb deleteall <your bucket name>
Удаление ведер с большим количеством отдельных файлов приводит к сбою большого количества инструментов S3, поскольку они пытаются отобразить список всех файлов в каталоге. Вам нужно найти способ удаления пакетами. Лучший инструмент GUI, который я нашел для этой цели, - это Bucket Explorer. Он удаляет файлы в ведро S3 в 1000 фрагментов файла и не сбой при попытке открыть большие ведра, такие как s3Fox и S3FM.
Я также нашел несколько сценариев, которые вы можете использовать для этой цели. Я еще не пробовал эти скрипты, но они выглядят довольно просто.
РУБИН
require 'aws/s3'
AWS::S3::Base.establish_connection!(
:access_key_id => 'your access key',
:secret_access_key => 'your secret key'
)
bucket = AWS::S3::Bucket.find('the bucket name')
while(!bucket.empty?)
begin
puts "Deleting objects in bucket"
bucket.objects.each do |object|
object.delete
puts "There are #{bucket.objects.size} objects left in the bucket"
end
puts "Done deleting objects"
rescue SocketError
puts "Had socket error"
end
end
PERL
#!/usr/bin/perl
use Net::Amazon::S3;
my $aws_access_key_id = 'your access key';
my $aws_secret_access_key = 'your secret access key';
my $increment = 50; # 50 at a time
my $bucket_name = 'bucket_name';
my $s3 = Net::Amazon::S3->new({aws_access_key_id => $aws_access_key_id, aws_secret_access_key => $aws_secret_access_key, retry => 1, });
my $bucket = $s3->bucket($bucket_name);
print "Incrementally deleting the contents of $bucket_name\n";
my $deleted = 1;
my $total_deleted = 0;
while ($deleted > 0) {
print "Loading up to $increment keys...\n";
$response = $bucket->list({'max-keys' => $increment, }) or die $s3->err . ": " . $s3->errstr . "\n";
$deleted = scalar(@{ $response->{keys} }) ;
$total_deleted += $deleted;
print "Deleting $deleted keys($total_deleted total)...\n";
foreach my $key ( @{ $response->{keys} } ) {
my $key_name = $key->{key};
$bucket->delete_key($key->{key}) or die $s3->err . ": " . $s3->errstr . "\n";
}
}
print "Deleting bucket...\n";
$bucket->delete_bucket or die $s3->err . ": " . $s3->errstr;
print "Done.\n";
ИСТОЧНИК: Tarkblog
Надеюсь, это поможет!
Ответ 3
В последних версиях s3cmd есть --recursive
например,
~/$ s3cmd rb --recursive s3://bucketwithfiles
Ответ 4
С s3cmd: Создать новый пустой каталог s3cmd sync -delete-deleted empty_directory s3://yourbucket
Ответ 5
Это может быть ошибка в S3Fox, поскольку он обычно способен рекурсивно удалять элементы. Тем не менее, я не уверен, что когда-либо пытался удалить целую ведро и его содержимое сразу.
Проект JetS3t, как упоминается Stu, включает апплет Java GUI, который вы можете легко запустить в браузере для управления вашими ведрами S3: Cockpit. У этого есть и сильные и слабые стороны по сравнению с S3Fox, но есть хороший шанс, что это поможет вам справиться с вашим беспокойным ведром. Хотя вам потребуется сначала удалить объекты, а затем ведро.
Отказ от ответственности: я являюсь автором JetS3t и Cockpit
Ответ 6
SpaceBlock также упрощает удаление кодов s3 - щелчок правой кнопкой мыши, удаление, ожидание выполнения задания в режиме просмотра передачи, завершение.
Это бесплатный интерфейс с открытым исходным кодом s3, который я поддерживаю, поэтому бесстыдное уведомление о подключении и т.д.
Ответ 7
Я реализовал bucket-destroy, многопоточную утилиту, которая делает все необходимое для удаления ведра. Я обрабатываю непустые ведра, а также ключи с поддержкой версии.
Здесь вы можете прочитать сообщение в блоге http://bytecoded.blogspot.com/2011/01/recursive-delete-utility-for-version.html и инструкции здесь http://code.google.com/p/bucket-destroy/
Я успешно удалил с ним ведро, содержащее double '//' в имени ключа, ключе версии и DeleteMarker. В настоящее время я запускаю его на ведро, которое содержит ~ 40 000 000, до сих пор я смог удалить 1 200 000 за несколько часов на m1.large. Обратите внимание, что утилита многопоточная, но еще не реализована перетасовка (которая будет горизонтальной масштабирования, запуск утилиты на нескольких машинах).
Ответ 8
Если вы используете консоль amazon и на разовой основе должны очистить ведро: вы можете перейти к своему ковшу, затем выбрать верхнюю клавишу, затем прокрутить вниз, а затем нажать shift на клавиатуре, а затем нажать на нижнюю один. Он выберет все между ними, после чего вы сможете щелкнуть правой кнопкой мыши и удалить.
Ответ 9
Если у вас ruby (и rubygems), установите aws-s3 с помощью
gem install aws-s3
или
sudo gem install aws-s3
создать файл delete_bucket.rb
:
require "rubygems" # optional
require "aws/s3"
AWS::S3::Base.establish_connection!(
:access_key_id => 'access_key_id',
:secret_access_key => 'secret_access_key')
AWS::S3::Bucket.delete("bucket_name", :force => true)
и запустите его:
ruby delete_bucket.rb
Так как для Bucket#delete
для меня были возвращены исключения времени ожидания, я расширил script:
require "rubygems" # optional
require "aws/s3"
AWS::S3::Base.establish_connection!(
:access_key_id => 'access_key_id',
:secret_access_key => 'secret_access_key')
while AWS::S3::Bucket.find("bucket_name")
begin
AWS::S3::Bucket.delete("bucket_name", :force => true)
rescue
end
end
Ответ 10
Я думаю, самым простым способом было бы использовать S3fm, бесплатный онлайн-менеджер файлов для Amazon S3. Нет приложений для установки, нет регистрации сторонних веб-сайтов. Работает непосредственно с Amazon S3, безопасным и удобным.
Просто выберите свое ведро и нажмите delete.
Ответ 11
Один метод, который можно использовать для предотвращения этой проблемы, заключается в том, чтобы поместить все объекты в "папку" в ведро, позволяя вам просто удалить папку, затем продолжить и удалить ведро. Кроме того, инструмент s3cmd, доступный из http://s3tools.org, может быть использован для удаления ведра с файлами в нем:
s3cmd rb --force s3://bucket-name
Ответ 12
Я взломал script для выполнения этого с Python, он успешно удалил мои 9000 объектов. См. Эту страницу:
Ответ 13
Еще один бесстыдный плагин: я устал ждать отдельных запросов на удаление HTTP, когда мне приходилось удалять 250 000 элементов, поэтому я написал Ruby script, который делает это многопоточным и заканчивается за долю времени:
http://github.com/sfeley/s3nuke/
Это тот, который работает намного быстрее в Ruby 1.9 из-за того, как обрабатываются потоки.
Ответ 14
Это сложная проблема. Мое решение находится в http://stuff.mit.edu/~jik/software/delete-s3-bucket.pl.txt. Он описывает все, что я определил, может ошибаться в комментарии вверху. Здесь текущая версия script (если я ее изменю, я положу новую версию по URL-адресу, но, вероятно, не здесь).
#!/usr/bin/perl
# Copyright (c) 2010 Jonathan Kamens.
# Released under the GNU General Public License, Version 3.
# See <http://www.gnu.org/licenses/>.
# $Id: delete-s3-bucket.pl,v 1.3 2010/10/17 03:21:33 jik Exp $
# Deleting an Amazon S3 bucket is hard.
#
# * You can't delete the bucket unless it is empty.
#
# * There is no API for telling Amazon to empty the bucket, so you have to
# delete all of the objects one by one yourself.
#
# * If you've recently added a lot of large objects to the bucket, then they
# may not all be visible yet on all S3 servers. This means that even after the
# server you're talking to thinks all the objects are all deleted and lets you
# delete the bucket, additional objects can continue to propagate around the S3
# server network. If you then recreate the bucket with the same name, those
# additional objects will magically appear in it!
#
# It is not clear to me whether the bucket delete will eventually propagate to
# all of the S3 servers and cause all the objects in the bucket to go away, but
# I suspect it won't. I also suspect that you may end up continuing to be
# charged for these phantom objects even though the bucket they're in is no
# longer even visible in your S3 account.
#
# * If there a CR, LF, or CRLF in an object name, then it sent just that
# way in the XML that gets sent from the S3 server to the client when the
# client asks for a list of objects in the bucket. Unfortunately, the XML
# parser on the client will probably convert it to the local line ending
# character, and if it different from the character that actually in the
# object name, you then won't be able to delete it. Ugh! This is a bug in the
# S3 protocol; it should be enclosing the object names in CDATA tags or
# something to protect them from being munged by the XML parser.
#
# Note that this bug even affects the AWS Web Console provided by Amazon!
#
# * If you've got a whole lot of objects and you serialize the delete process,
# it'll take a long, long time to delete them all.
use threads;
use strict;
use warnings;
# Keys can have newlines in them, which screws up the communication
# between the parent and child processes, so use URL encoding to deal
# with that.
use CGI qw(escape unescape); # Easiest place to get this functionality.
use File::Basename;
use Getopt::Long;
use Net::Amazon::S3;
my $whoami = basename $0;
my $usage = "Usage: $whoami [--help] --access-key-id=id --secret-access-key=key
--bucket=name [--processes=#] [--wait=#] [--nodelete]
Specify --processes to indicate how many deletes to perform in
parallel. You're limited by RAM (to hold the parallel threads) and
bandwidth for the S3 delete requests.
Specify --wait to indicate seconds to require the bucket to be verified
empty. This is necessary if you create a huge number of objects and then
try to delete the bucket before they've all propagated to all the S3
servers (I've seen a huge backlog of newly created objects take *hours* to
propagate everywhere). See the comment at the top of the script for more
information about this issue.
Specify --nodelete to empty the bucket without actually deleting it.\n";
my($aws_access_key_id, $aws_secret_access_key, $bucket_name, $wait);
my $procs = 1;
my $delete = 1;
die if (! GetOptions(
"help" => sub { print $usage; exit; },
"access-key-id=s" => \$aws_access_key_id,
"secret-access-key=s" => \$aws_secret_access_key,
"bucket=s" => \$bucket_name,
"processess=i" => \$procs,
"wait=i" => \$wait,
"delete!" => \$delete,
));
die if (! ($aws_access_key_id && $aws_secret_access_key && $bucket_name));
my $increment = 0;
print "Incrementally deleting the contents of $bucket_name\n";
$| = 1;
my(@procs, $current);
for (1..$procs) {
my($read_from_parent, $write_to_child);
my($read_from_child, $write_to_parent);
pipe($read_from_parent, $write_to_child) or die;
pipe($read_from_child, $write_to_parent) or die;
threads->create(sub {
close($read_from_child);
close($write_to_child);
my $old_select = select $write_to_parent;
$| = 1;
select $old_select;
&child($read_from_parent, $write_to_parent);
}) or die;
close($read_from_parent);
close($write_to_parent);
my $old_select = select $write_to_child;
$| = 1;
select $old_select;
push(@procs, [$read_from_child, $write_to_child]);
}
my $s3 = Net::Amazon::S3->new({aws_access_key_id => $aws_access_key_id,
aws_secret_access_key => $aws_secret_access_key,
retry => 1,
});
my $bucket = $s3->bucket($bucket_name);
my $deleted = 1;
my $total_deleted = 0;
my $last_start = time;
my($start, $waited);
while ($deleted > 0) {
$start = time;
print "\nLoading ", ($increment ? "up to $increment" :
"as many as possible")," keys...\n";
my $response = $bucket->list({$increment ? ('max-keys' => $increment) : ()})
or die $s3->err . ": " . $s3->errstr . "\n";
$deleted = scalar(@{ $response->{keys} }) ;
if (! $deleted) {
if ($wait and ! $waited) {
my $delta = $wait - ($start - $last_start);
if ($delta > 0) {
print "Waiting $delta second(s) to confirm bucket is empty\n";
sleep($delta);
$waited = 1;
$deleted = 1;
next;
}
else {
last;
}
}
else {
last;
}
}
else {
$waited = undef;
}
$total_deleted += $deleted;
print "\nDeleting $deleted keys($total_deleted total)...\n";
$current = 0;
foreach my $key ( @{ $response->{keys} } ) {
my $key_name = $key->{key};
while (! &send(escape($key_name) . "\n")) {
print "Thread $current died\n";
die "No threads left\n" if (@procs == 1);
if ($current == @procs-1) {
pop @procs;
$current = 0;
}
else {
$procs[$current] = pop @procs;
}
}
$current = ($current + 1) % @procs;
threads->yield();
}
print "Sending sync message\n";
for ($current = 0; $current < @procs; $current++) {
if (! &send("\n")) {
print "Thread $current died sending sync\n";
if ($current = @procs-1) {
pop @procs;
last;
}
$procs[$current] = pop @procs;
$current--;
}
threads->yield();
}
print "Reading sync response\n";
for ($current = 0; $current < @procs; $current++) {
if (! &receive()) {
print "Thread $current died reading sync\n";
if ($current = @procs-1) {
pop @procs;
last;
}
$procs[$current] = pop @procs;
$current--;
}
threads->yield();
}
}
continue {
$last_start = $start;
}
if ($delete) {
print "Deleting bucket...\n";
$bucket->delete_bucket or die $s3->err . ": " . $s3->errstr;
print "Done.\n";
}
sub send {
my($str) = @_;
my $fh = $procs[$current]->[1];
print($fh $str);
}
sub receive {
my $fh = $procs[$current]->[0];
scalar <$fh>;
}
sub child {
my($read, $write) = @_;
threads->detach();
my $s3 = Net::Amazon::S3->new({aws_access_key_id => $aws_access_key_id,
aws_secret_access_key => $aws_secret_access_key,
retry => 1,
});
my $bucket = $s3->bucket($bucket_name);
while (my $key = <$read>) {
if ($key eq "\n") {
print($write "\n") or die;
next;
}
chomp $key;
$key = unescape($key);
if ($key =~ /[\r\n]/) {
my(@parts) = split(/\r\n|\r|\n/, $key, -1);
my(@guesses) = shift @parts;
foreach my $part (@parts) {
@guesses = (map(($_ . "\r\n" . $part,
$_ . "\r" . $part,
$_ . "\n" . $part), @guesses));
}
foreach my $guess (@guesses) {
if ($bucket->get_key($guess)) {
$key = $guess;
last;
}
}
}
$bucket->delete_key($key) or
die $s3->err . ": " . $s3->errstr . "\n";
print ".";
threads->yield();
}
return;
}
Ответ 15
Я являюсь одним из членов команды разработчиков Team Bucket Explorer, мы предоставим вам другую возможность удалить Bucket по выбору пользователя... 1) Быстрое удаление. Этот параметр удалит ваши данные из ведра в кусках 1000. 2) Постоянное удаление. Этот параметр будет удалять объекты в очереди.
Ответ 16
Недавно Amazon добавила новую функцию "Multi-Object Delete", которая позволяет удалять до 1000 объектов одновременно с помощью одного запроса API. Это должно позволить упростить процесс удаления огромного количества файлов из ведра.
Документация по новой функции доступна здесь: http://docs.amazonwebservices.com/AmazonS3/latest/dev/DeletingMultipleObjects.html
Ответ 17
Я всегда использовал свой С# API и маленькие скрипты для этого. Я не уверен, почему S3Fox не может этого сделать, но в данный момент эта функция, по-видимому, нарушена. Я уверен, что многие другие инструменты S3 тоже могут это сделать.
Ответ 18
Сначала удалите все объекты в ковше. Затем вы можете удалить сам ковш.
По-видимому, нельзя удалить ведро с объектами, а S3Fox не делает этого для вас.
У меня были другие небольшие проблемы с S3Fox самостоятельно, вот так, и теперь использую инструмент на основе Java, jets3t, который более ожидающих об условиях ошибки. Должны быть и другие.
Ответ 19
Вы должны убедиться, что у вас есть правильный набор разрешений для записи для ведра, а ведро не содержит объектов. Некоторые полезные инструменты, которые могут помочь вам удалить: CrossFTP, просматривать и удалять ведра, такие как FTP-клиент. jets3t Инструмент, как указано выше.
Ответ 20
Мне нужно взглянуть на некоторые из этих альтернативных файловых менеджеров. Я использовал (и вроде) BucketExplorer, от которого вы можете получить - удивительно - http://www.bucketexplorer.com/.
Это 30-дневная бесплатная пробная версия, затем (в настоящее время) стоимостью 49,99 доллара США за лицензию (49,95 долларов США на странице обложки покупки).
Ответ 21
Попробуйте https://s3explorer.appspot.com/ для управления вашей учетной записью S3.
Ответ 22
Это то, что я использую. Просто простой код ruby.
case bucket.size
when 0
puts "Nothing left to delete"
when 1..1000
bucket.objects.each do |item|
item.delete
puts "Deleting - #{bucket.size} left"
end
end
Ответ 23
Используйте консоль управления Amazon Web. С Google хром для скорости. Удаленные объекты намного быстрее, чем firefox (примерно в 10 раз быстрее). Удалено 60 000 объектов.