删除Amazon S3存储桶?

56

我一直通过S3Fox与Amazon S3进行交互,但似乎无法删除我的存储桶。我选择一个存储桶,点击删除,确认弹出窗口中的删除操作,然后...什么都没有发生。是否有其他工具可以使用?


我最终使用了Cyberduck,它有Windows和Mac版本 :) - balexandre
使用AWS Ruby SDK,您可以在一个命令中完成它(bucket.delete!)。http://docs.aws.amazon.com/AWSRubySDK/latest/frames.html#!AWS.html - MaximusDominus
23个回答

144

通过新的生命周期(过期)规则功能,现在可以一次性删除所有文件。您甚至可以从AWS控制台进行操作。

在AWS控制台中,只需右键单击存储桶名称,选择“属性”,然后在页面底部的选项卡行中选择“生命周期”和“添加规则”。创建一个生命周期规则,“前缀”字段留空(留空表示删除存储桶中的所有文件,或者您可以将其设置为“a”,以删除文件名以“a”开头的所有文件)。将“天数”字段设置为“1”。就这样,完成了。假设文件已经超过一天,它们应该全部被删除,然后您可以删除存储桶。

我第一次尝试这个功能,所以我还在等待文件被删除的速度有多快(不是瞬间的,但应该会在24小时内完成),以及我是否会因为一个删除命令或五千万个删除命令而产生费用...祈祷顺利!


11
跟进这件事情,它完美地执行了,所有文件在24小时内被删除,据我所见甚至没有任何删除请求的费用。这是解决问题的最终方案! - chris14679
1
我喜欢这个。比安装工具、发现它们无法处理我的桶的某些方面并重复操作要好得多... - Steve McLeod
1
只是想说谢谢这个解决方案。简单的点赞无法表达我有多感激。它运行得非常出色。 - Serge Shultz
2
太棒了!非常感谢。点赞一下!有一个小改变。现在,当您进入规则窗口时,它们有一个复选框,可以明确地将规则应用于整个存储桶。现在不允许您将前缀字段留空。 - Guerry
1
虽然这是一个老问题,但对于其他人来说可能会很有用……使用 aws cli,一个单独的命令可以递归删除所有文件:aws s3 rm s3://bucket/folder/ --recursive - Adrian Torrie
显示剩余7条评论

29

请记住,S3桶在删除之前需要为空。好消息是,大多数第三方工具都自动化了这个过程。如果您在使用S3Fox时遇到问题,我建议尝试使用GUI的S3FM或命令行的S3Sync。亚马逊有一篇很棒的文章描述如何使用S3Sync。在设置变量后,关键命令是

./s3cmd.rb deleteall <your bucket name>

删除包含大量单个文件的桶往往会导致许多S3工具崩溃,因为它们尝试显示目录中所有文件的列表。您需要找到一种分批删除的方法。我发现用于此目的的最佳GUI工具是Bucket Explorer。它以1000个文件块的方式删除S3存储桶中的文件,并且在尝试打开像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";

来源:Tarkblog

希望这有所帮助!


我在使用aws/s3 gem时遇到了问题,因为我的区域是欧洲。通过使用s3 gem - https://github.com/qoobaa/s3 解决了这个问题。 - Louis Sayers
使用生命周期过期规则的 chris14679 提供的解决方案现在是首选方法。 - Max Masnick
这个回答得到了最多的赞,但是它无法与@chris14679下面的简洁相竞争。我刚刚在不到10次点击和大约10个按键的情况下删除了几百万个文件。美丽的简单。 - Ryan

16

1
这个有效了,谢谢。 - Jirapong

7
使用s3cmd: 创建一个新的空目录 s3cmd sync --delete-removed empty_directory s3://yourbucket

5

SpaceBlock 还可以简单地删除 s3 存储桶 - 右键单击存储桶,选择删除,等待传输视图中的作业完成,就完成了。

这是我维护的免费开源的 Windows S3 前端,所以请不要介意我的自我推销。


哇,感谢提供SB的参考。非常好用,我不必安装FireFox就能删除S3存储桶。 - Javadog
由于某些原因,它对我没起作用。但是浏览存储桶的好工具。也许可以添加一个“全部删除”的选项。 - Jus12

5
这可能是S3Fox的一个bug,因为它通常能够递归删除项目。但是,我不确定是否曾经尝试过一次性删除整个存储桶及其内容。 JetS3t 项目,如Stu所述,包括一个Java GUI applet,您可以轻松在浏览器中运行以管理您的S3存储桶:Cockpit。与S3Fox相比,它具有优势和劣势,但很有可能它将帮助您处理麻烦的存储桶。尽管它需要您先删除对象,然后再删除存储桶。
免责声明:我是JetS3t和Cockpit的作者。

4

如果您已经安装了 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

4

如果您使用亚马逊的控制台,并且需要一次性清空存储桶:您可以浏览到您的存储桶,然后选择顶部的键,向下滚动并按住键盘上的shift键,然后单击底部的键。它将选择所有中间的内容,然后您可以右键单击并删除。


如果你有成千上万的文件,这不是一个好主意。 - Patrick Burtchaell

4
我已经实现了 bucket-destroy,这是一个多线程工具,可以删除存储桶的所有内容。我处理了非空存储桶以及启用版本控制的存储桶键。你可以在这里阅读博客文章:http://bytecoded.blogspot.com/2011/01/recursive-delete-utility-for-version.html,并在这里查看说明:http://code.google.com/p/bucket-destroy/
我已经成功使用它删除了包含双“//”的键名、版本化键和DeleteMarker键的存储桶。目前我正在运行它来删除一个包含约4000万个对象的存储桶,到目前为止,在m1.large上几个小时内已经删除了120万个对象。请注意,该工具是多线程的,但尚未实现洗牌(这将实现水平扩展,即在多台计算机上启动该工具)。

这是一个实现良好的代码,对我来说运行非常顺畅。 - curthipster
@curthipster:谢谢。请注意,亚马逊最近添加了“对象过期”,这使得代码变得不那么相关。请参见此处http://docs.amazonwebservices.com/AmazonS3/latest/dev/ObjectExpiration.html。 - Maxim Veksler
很棒的工具。我喜欢命令行操作。+1。 - Jus12
@MaximVeksler FYI,CLASSPATH上的导出命令不正确。它引用了“target/dependency/commons-logging-1.1.1.jar”,但实际依赖中的jar包版本是1.1.3。 - Mason G. Zhwiti

3

避免这个问题的一种技术是将所有对象放在存储桶中的“文件夹”中,这样您就可以只删除文件夹,然后继续删除存储桶。此外,可从http://s3tools.org获取的s3cmd工具可用于删除包含文件的存储桶:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接