Сведения о вопросе

Kimsanov

05:01, 5th August, 2020

Теги

amazon-s3   buckets    

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

Просмотров: 531   Ответов: 23

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



  Сведения об ответе

VERSUION

04:45, 10th August, 2020

Наконец-то можно удалить все файлы за один раз, используя новую функцию правил жизненного цикла (истечения срока действия). Вы даже можете сделать это с помощью консоли AWS.

Просто щелкните правой кнопкой мыши на имени корзины в консоли AWS, выберите "Properties", а затем в строке вкладок внизу страницы выберите "lifecycle" и "add rule". Создайте правило жизненного цикла с пустым полем "Prefix" (пустое означает все файлы в корзине, или вы можете установить его в значение "a", чтобы удалить все файлы, имена которых начинаются с "a"). Установите для поля "Days" значение "1". Вот и все. Сделано. Предполагая, что файлы старше одного дня, они все должны быть удалены, тогда вы можете удалить ведро.

Я только что попробовал это в первый раз, поэтому я все еще жду, чтобы увидеть, как быстро удаляются файлы (это не было мгновенным, но предположительно должно произойти в течение 24 часов) и будет ли мне выставлен счет за одну команду удаления или 50 миллионов команд удаления... скрестив пальцы!


  Сведения об ответе

lesha

00:47, 23rd August, 2020

Помните, что ведра S3 должны быть пустыми, прежде чем их можно будет удалить. Хорошей новостью является то, что большинство сторонних инструментов автоматизируют этот процесс. Если у вас возникли проблемы с S3Fox, я рекомендую попробовать S3FM для GUI или S3Sync для командной строки. Amazon имеет большую статью, описывающую, как использовать S3Sync . После настройки переменных ключевой командой будет

./s3cmd.rb deleteall <your bucket name>

Удаление ведер с большим количеством отдельных файлов приводит к сбою многих инструментов S3, потому что они пытаются отобразить список всех файлов в каталоге. Вам нужно найти способ удаления в пакетах. Лучший инструмент GUI, который я нашел для этой цели, - это Bucket Explorer. Он удаляет файлы в корзине S3 в 1000 кусков файла и не дает сбоя при попытке открыть большие корзины, такие как s3Fox и S3FM.

Я также нашел несколько сценариев, которые вы можете использовать для этой цели. Я еще не пробовал эти сценарии, но они выглядят довольно простыми.

RUBY

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";

SOURCE: Таркблог

Надеюсь, это поможет!


  Сведения об ответе

VCe znayu

04:41, 8th August, 2020

последние версии s3cmd имеют --recursive

напр.,

~/$ s3cmd rb --recursive s3://bucketwithfiles

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


  Сведения об ответе

nYU

20:46, 20th August, 2020

С помощью s3cmd: Создайте новый пустой каталог s3cmd sync --delete-удалить пустой каталог s3://yourbucket


  Сведения об ответе

lesha

08:20, 5th August, 2020

Это может быть ошибкой в S3Fox, потому что он обычно способен удалять элементы рекурсивно. Однако я не уверен, что когда-либо пытался удалить целое ведро и его содержимое сразу.

Проект JetS3t , как упоминал Стю, включает в себя Java GUI applet, который вы можете легко запустить в браузере для управления своими ведрами S3: Cockpit . У него есть как сильные, так и слабые стороны по сравнению с S3Fox, но есть хороший шанс, что он поможет вам справиться с вашим проблемным ведром. Хотя это потребует от вас сначала удалить объекты, а затем ведро.

Отказ от ответственности: я являюсь автором JetS3t и Cockpit


  Сведения об ответе

9090

02:47, 15th August, 2020

SpaceBlock также упрощает удаление ведер s3 - щелкните правой кнопкой мыши ведро, удалить, дождитесь завершения задания в представлении передачи, готово.

Это свободный и открытый исходный код windows s3 front-end, который я поддерживаю, поэтому бесстыдный plug alert и т. д.


  Сведения об ответе

P_S_S

07:31, 4th August, 2020

Я реализовал bucket-destroy, многопоточную утилиту, которая делает все необходимое для удаления ведра. Я обрабатываю непустые ведра,а также ключи ведра с включенной версией.

Вы можете прочитать сообщение в блоге здесь http://bytecoded.blogspot.com/2011/01/recursive-delete-utility-for-version.html и инструкции здесь http://code.google.com/p/bucket-destroy/

Я успешно удалил с ним ведро, которое содержит двойное '//' в имени ключа, версионный ключ и ключи DeleteMarker. В настоящее время я запускаю его на ведре, которое содержит ~40,000,000 до сих пор мне удавалось удалить 1,200,000 за несколько часов на m1.large. Обратите внимание, что утилита является многопоточной, но не имеет (пока) реализованной перетасовки (что приведет к горизонтальному масштабированию, запуску утилиты на нескольких машинах).


  Сведения об ответе

fo_I_K

10:40, 8th August, 2020

Если вы используете консоль amazon и на одноразовой основе должны очистить ведро: вы можете перейти к своему ведру, затем выбрать верхнюю клавишу, затем прокрутите вниз, а затем нажмите shift на клавиатуре, а затем нажмите на нижнюю. Он будет выбирать все между ними, то вы можете щелкнуть правой кнопкой мыши и удалить.


  Сведения об ответе

appple

03:21, 6th August, 2020

Если у вас установлено rubyrubygems), установите aws-s3 gem с помощью

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 возвращал исключения таймаута много для меня, я расширил скрипт:

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


  Сведения об ответе

LIZA

09:52, 23rd August, 2020

Один из методов, который можно использовать, чтобы избежать этой проблемы, - это поместить все объекты в "folder" в корзину, что позволяет вам просто удалить папку, а затем перейти и удалить корзину. Кроме того, инструмент s3cmd, доступный в http://s3tools.org , можно использовать для удаления корзины с файлами в ней:

s3cmd rb --force s3://bucket-name


  Сведения об ответе

crush

05:29, 15th August, 2020

Я думаю, что самый простой способ-это использовать S3fm, бесплатный онлайн - файловый менеджер для Amazon S3. Нет приложений для установки, нет регистрации сторонних веб-сайтов. Работает непосредственно с Amazon S3, безопасно и удобно.

Просто выберите свое ведро и нажмите Удалить.


  Сведения об ответе

SSESION

22:34, 9th August, 2020

Это очень сложная проблема. Мое решение находится на уровне http://stuff.mit.edu/~jik/software/delete-s3-bucket.pl.txt . Он описывает все то, что я определил, может пойти не так в комментарии вверху. Вот текущая версия скрипта (если я изменю ее, я поставлю новую версию на 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's a CR, LF, or CRLF in an object name, then it's 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's different from the character that's 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;
}


  Сведения об ответе

LIZA

04:52, 8th August, 2020

Я взломал скрипт для этого из Python, он успешно удалил мои 9000 объектов. Видеть эту страницу:

https://efod.se/blog/archive/2009/08/09/delete-s3-bucket


  Сведения об ответе

crush

13:24, 4th August, 2020

Еще один бесстыдный плагин: я устал ждать индивидуальных запросов на удаление HTTP, когда мне нужно было удалить 250 000 элементов, поэтому я написал сценарий Ruby, который делает это многопоточным и завершает за долю времени:

http://github.com/sfeley/s3nuke/

Это тот, который работает намного быстрее в Ruby 1.9 из-за способа обработки потоков.


  Сведения об ответе

P_S_S

08:57, 18th August, 2020

Я являюсь одним из членов команды разработчиков Bucket Explorer Team, мы предоставим другой вариант для удаления Bucket в соответствии с выбором пользователей... 1) быстрое удаление-эта опция удалит ваши данные из корзины кусками по 1000. 2) постоянное удаление-эта опция будет удалять объекты в очереди.

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


  Сведения об ответе

9090

12:27, 4th August, 2020

Amazon недавно добавила новую функцию "Мультиобъектное удаление", которая позволяет удалять до 1000 объектов одновременно с одним запросом API. Это должно позволить упростить процесс удаления огромного количества файлов из корзины.

Документация по новой функции доступна здесь: http://docs.amazonwebservices.com/AmazonS3/latest/dev/DeletingMultipleObjects.html


  Сведения об ответе

$DOLLAR

08:46, 10th August, 2020

Это то, что я использую. Просто простой код 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


  Сведения об ответе

lool

15:38, 13th August, 2020

Попробуйте https://s3explorer.appspot.com/ управлять своим аккаунтом S3.


  Сведения об ответе

DINO

15:08, 1st August, 2020

Мне придется взглянуть на некоторые из этих альтернативных файловых менеджеров. Я использовал (и нравится) BucketExplorer, который вы можете получить от - удивительно - http://www.bucketexplorer.com/ .

Это 30-дневная бесплатная пробная версия, а затем (в настоящее время) стоит US$49.99 за лицензию (US$49.95 на титульной странице покупки).


  Сведения об ответе

lourence

20:28, 13th August, 2020

Я всегда заканчивал тем, что использовал их C# API и маленькие скрипты для этого. Я не знаю, почему S3Fox не может этого сделать, но эта функциональность, похоже, в данный момент нарушена. Однако я уверен, что многие другие инструменты S3 могут сделать это так же хорошо.


  Сведения об ответе

ASSembler

12:50, 29th August, 2020

Сначала удалите все объекты из корзины. Затем вы можете удалить само ведро.

По-видимому, нельзя удалить ведро с объектами в нем, и S3Fox не делает этого за вас.

У меня были и другие небольшие проблемы с S3Fox, как это, и теперь я использую инструмент на основе Java, jets3t , который больше подходит для условий ошибок. Но ведь должны быть и другие.


  Сведения об ответе

SSESION

15:25, 16th August, 2020

Вы должны убедиться, что у вас есть правильный набор разрешений на запись для ведра, и ведро не содержит никаких объектов. Некоторые полезные инструменты, которые могут помочь вашему удалению: CrossFTP, просмотр и удаление ведер, таких как клиент FTP. Jets3t инструмент, как уже упоминалось выше.


  Сведения об ответе

LAST

22:18, 24th August, 2020

Используйте консоль веб-управления amazon. С Google chrome для скорости. Удалил объекты намного быстрее, чем firefox (примерно в 10 раз быстрее). Нужно было удалить 60 000 объектов.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться