Удалить ведра Amazon S3?

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

Ответ 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

http://s3tools.org/kb/item5.htm

Ответ 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

Если у вас rubyrubygems), установите 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

Ответ 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) Постоянное удаление. Этот параметр будет удалять объекты в очереди.

Как удалить файлы и ведро Amazon S3?

Ответ 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 долларов США на странице обложки покупки).

Ответ 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 объектов.