S3Foxを介して Amazon S3 とやり取りしていますが、バケットを削除できないようです。バケットを選択して [削除] をクリックし、ポップアップで削除を確認しても... 何も起こりません。使用すべき別のツールはありますか?
23 に答える
新しいライフサイクル (有効期限) ルール機能を使用して、すべてのファイルを一度に削除できるようになりました。AWS コンソールから行うこともできます。
AWS コンソールでバケット名を右クリックして [プロパティ] を選択し、ページの下部にあるタブの行で [ライフサイクル] と [ルールの追加] を選択します。「プレフィックス」フィールドを空白に設定してライフサイクル ルールを作成します (空白はバケット内のすべてのファイルを意味します。「a」に設定して、名前が「a」で始まるすべてのファイルを削除することもできます)。「日」フィールドを「1」に設定します。それでおしまい。終わり。ファイルが 1 日以上経過していると仮定すると、それらはすべて削除されるはずであり、バケットを削除できます。
私はこれを初めて試したばかりなので、ファイルがどれだけ早く削除されるか(すぐではありませんでしたが、おそらく24時間以内に発生するはずです)、および1回の削除コマンドまたは5000万回の削除に対して請求されるかどうかを確認するのを待っていますコマンド...指が交差しました!
S3バケットは、削除する前に空にする必要があることに注意してください。幸いなことに、ほとんどのサードパーティツールはこのプロセスを自動化します。S3Foxで問題が発生した場合は、GUIの場合はS3FMを、コマンドラインの場合はS3Syncを試すことをお勧めします。Amazonには、S3Syncの使用方法を説明するすばらしい記事があります。変数を設定した後、重要なコマンドは次のとおりです。
./s3cmd.rb deleteall <your bucket name>
多数の個別ファイルを含むバケットを削除すると、ディレクトリ内のすべてのファイルのリストを表示しようとするため、多くのS3ツールがクラッシュする傾向があります。バッチで削除する方法を見つける必要があります。この目的のために私が見つけた最高のGUIツールはバケットエクスプローラーです。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
お役に立てれば!
s3cmdの最近のバージョンには--recursiveがあります
例えば、
~/$ s3cmd rb --recursive s3://bucketwithfiles
s3cmd の場合: 新しい空のディレクトリを作成します s3cmd sync --delete-removed empty_directory s3://yourbucket
これはS3Foxのバグである可能性があります。これは、通常、アイテムを再帰的に削除できるためです。ただし、バケット全体とその内容を一度に削除しようとしたことがあるかどうかはわかりません。
JetS3tプロジェクトには、 Stuが言及しているように、ブラウザで簡単に実行してS3バケットを管理できるJava GUIアプレットが含まれています:コックピット。S3Foxと比較して長所と短所の両方がありますが、面倒なバケツに対処するのに役立つ可能性があります。最初にオブジェクトを削除してからバケットを削除する必要がありますが。
免責事項:私はJetS3tとコックピットの作者です
また、 SpaceBlockを使用すると、s3 バケットを簡単に削除できます。バケットを右クリックして削除し、転送ビューでジョブが完了するのを待ちます。
これは私が保守しているフリーでオープン ソースの Windows s3 フロント エンドなので、恥知らずなプラグ アラートなどです。
Amazon のコンソールを使用していて、一度だけバケットをクリアする必要がある場合: バケットを参照し、一番上のキーを選択してから一番下までスクロールし、キーボードの Shift キーを押して一番下のキーをクリックします。その間のすべてが選択され、右クリックして削除できます。
バケットの削除に必要なすべてを実行するマルチスレッド ユーティリティのbucket-destroyを実装しました。空でないバケットと、バージョン対応のバケット キーを処理します。
http://bytecoded.blogspot.com/2011/01/recursive-delete-utility-for-version.htmlのブログ投稿と、 http ://code.google.com/p/bucket-の手順を読むことができます。破壊する/
キー名、バージョン管理されたキー、および DeleteMarker キーに二重の「//」を含むバケットを正常に削除しました。現在、〜 40,000,000 を含むバケットで実行しています。これまでのところ、m1.large で数時間で 1,200,000 を削除できました。ユーティリティはマルチスレッドですが、(まだ)シャッフルを実装していないことに注意してください(これにより、水平方向のスケーリングが行われ、複数のマシンでユーティリティが起動されます)。
ruby (およびrubygems ) がインストールされている場合は、 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
この問題を回避するために使用できる手法の 1 つは、すべてのオブジェクトをバケット内の「フォルダー」に配置することです。これにより、フォルダーを削除してからバケットを削除することができます。さらに、 http: //s3tools.org から入手できる s3cmd ツールを使用して、ファイルを含むバケットを削除できます。
s3cmd rb --force s3://bucket-name
最も簡単な方法は、Amazon S3 用の無料のオンライン ファイル マネージャーであるS3fmを使用することだと思います。アプリケーションをインストールする必要も、サード パーティの Web サイトに登録する必要もありません。安全で便利な Amazon S3 から直接実行されます。
バケットを選択して削除をクリックするだけです。
Python から実行するためのスクリプトをまとめてハックしたところ、9000 個のオブジェクトが正常に削除されました。このページを参照してください:
これは難しい問題です。私の解決策は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;
}
もう 1 つの恥知らずなプラグイン: 250,000 個のアイテムを削除する必要があるときに、個々の HTTP 削除リクエストを待つのにうんざりしたので、マルチスレッドでそれを実行し、わずかな時間で完了する Ruby スクリプトを作成しました。
http://github.com/sfeley/s3nuke/
これは、スレッドの処理方法により、Ruby 1.9 ではるかに高速に動作するものです。
私は Bucket Explorer Team の開発者チーム メンバーの 1 人です。ユーザーの選択に応じて、バケットを削除する別のオプションを提供します...削除 - このオプションは、キュー内のオブジェクトを削除します。
Amazon は最近、1 回の API リクエストで一度に最大 1,000 個のオブジェクトを削除できる「マルチオブジェクト削除」という新機能を追加しました。これにより、バケットから膨大な数のファイルを削除するプロセスが簡素化されるはずです。
新機能のドキュメントは、http: //docs.amazonwebservices.com/AmazonS3/latest/dev/DeletingMultipleObjects.htmlから入手できます。
これらの代替ファイルマネージャーのいくつかを確認する必要があります。私はBucketExplorerを使用しました(そして気に入っています)。これは、驚くべきことに、http: //www.bucketexplorer.com/から入手できます。
これは30日間の無料トライアルで、(現在)ライセンスあたり49.99米ドル(購入の表紙に49.95米ドル)かかります。
https://s3explorer.appspot.com/を試して、S3アカウントを管理してください。
これは私が使用するものです。シンプルな 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
最初にバケット内のすべてのオブジェクトを削除します。その後、バケット自体を削除できます。
どうやら、オブジェクトを含むバケットを削除することはできず、S3Fox はこれを行いません。
私自身、このような S3Fox で他にも小さな問題がありましたが、現在は Java ベースのツールであるjets3tを使用しています。他にもあるはずです。
これを行うために、私は常に C# API と小さなスクリプトを使用することになりました。S3Fox がそれを実行できない理由はわかりませんが、現時点ではその機能が壊れているようです。ただし、他の S3 ツールの多くでも同様に実行できると確信しています。
アマゾン ウェブ管理コンソールを使用します。Google chrome でスピードアップ。Firefox よりもはるかに高速にオブジェクトを削除しました (約 10 倍の速さ)。削除するオブジェクトが 60,000 個ありました。