如何在S3中创build10,000个文件

我有一个包含10,000个文件的文件夹。 似乎无法将其上传并立即公开。 所以我上传了全部,他们是私人的,我需要把它们全部公开。

我试过aws控制台,它只是给出了一个错误(适用于文件较less的文件夹)。

我已经尝试在Firefox中使用S3组织,同样的事情。

有一些软件或脚本我可以运行,使所有这些公开?

您可以生成一个存储桶策略(请参阅下面的示例),以便访问存储桶中的所有文件。 存储桶策略可以通过AWS控制台添加到存储桶中。

{ "Id": "...", "Statement": [ { "Sid": "...", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::bucket/*", "Principal": { "AWS": [ "*" ] } } ] } 

另请参阅以下Amazon提供的策略生成器工具。

http://awspolicygen.s3.amazonaws.com/policygen.html

如果您是第一次上传,可以通过命令行将文件设置为公开上传:

 aws s3 sync . s3://my-bucket/path --acl public-read 

如使用AWS命令行界面使用高级s3命令所述

不幸的是,它只在file upload时才应用ACL。 它不(在我的testing中)将ACL应用于已经上传的文件。

如果您想更新现有对象,则可以将存储桶同步到自己。

这可以从命令行完成:

 aws s3 sync s3://my-bucket/path s3://my-bucket/path --acl public-read 

您可以将存储桶同步到自己,因此可以使用命令行界面来更新acls,元数据等。

例如,我想更新caching控制标题:

  aws s3 sync s3://my-bucket/path s3://my-bucket/path --cache-control max-age=3888000 

所有的对象得到更新。

我不得不改变几十万个物体。 我启动了一个EC2实例来运行它,这使得它们都变得更快。 您将首先安装aws-sdk gem。

代码如下:

 require 'rubygems' require 'aws-sdk' # Change this stuff. AWS.config({ :access_key_id => 'YOURS_HERE', :secret_access_key => 'YOURS_HERE', }) bucket_name = 'YOUR_BUCKET_NAME' s3 = AWS::S3.new() bucket = s3.buckets[bucket_name] bucket.objects.each do |object| puts object.key object.acl = :public_read end 

我有同样的问题,由@DanielVonFange解决scheme是过时的,因为新版本的SDK已经出来。

现在使用AWS Ruby SDK添加适用于我的代码片段:

 require 'aws-sdk' Aws.config.update({ region: 'REGION_CODE_HERE', credentials: Aws::Credentials.new( 'ACCESS_KEY_ID_HERE', 'SECRET_ACCESS_KEY_HERE' ) }) bucket_name = 'BUCKET_NAME_HERE' s3 = Aws::S3::Resource.new s3.bucket(bucket_name).objects.each do |object| puts object.key object.acl.put({ acl: 'public-read' }) end 

看看BucketExplorer吧,它可以很好地pipe理批量操作,并且是一个可靠的S3客户端。

有这个需要我自己,但文件的数量,这使得它的方式慢慢做串行。 于是我写了一个脚本 ,在iron.io的IronWorker服务上做这个脚本 。 他们每个月500个免费的计算时间足以处理大桶(如果你超过这个价格是合理的话)。 由于它是并行完成的,所以我在32000个物体上完成了不到一分钟的时间。 另外我相信他们的服务器运行在EC2上,所以作业和S3之间的通信很快。

任何人都可以根据自己的需要使用我的脚本。

只是想添加新的S3控制台,您可以select您的文件夹,并selectMake public让文件夹内的所有文件公开。 它作为一个后台任务,所以它应该处理任何数量的文件。

公之于众

你会认为他们会公开阅读默认行为,不是吗? :)我分享你的挫败感,同时build立一个自定义的API来与C#解决scheme的S3接口。 以下是完成上传S3对象并将其设置为公共读取权限的代码片段:

 public void Put(string bucketName, string id, byte[] bytes, string contentType, S3ACLType acl) { string uri = String.Format("https://{0}/{1}", BASE_SERVICE_URL, bucketName.ToLower()); DreamMessage msg = DreamMessage.Ok(MimeType.BINARY, bytes); msg.Headers[DreamHeaders.CONTENT_TYPE] = contentType; msg.Headers[DreamHeaders.EXPECT] = "100-continue"; msg.Headers[AWS_ACL_HEADER] = ToACLString(acl); try { Plug s3Client = Plug.New(uri).WithPreHandler(S3AuthenticationHeader); s3Client.At(id).Put(msg); } catch (Exception ex) { throw new ApplicationException(String.Format("S3 upload error: {0}", ex.Message)); } } 

ToACLString(acl)函数返回公共读取 ,BASE_SERVICE_URL是s3.amazonaws.com ,AWS_ACL_HEADER常量是x-amz-acl 。 插件和DreamMessage的东西可能会看起来很奇怪,因为我们正在使用Dream框架来简化我们的http通信。 基本上,我们正在使用指定的头文件和每个aws规范的特殊头文件签名来执行http PUT(有关如何构build授权头文件的示例,请参阅aws文档中的此页面)。

要更改现有的1000个对象ACL,您可以编写一个脚本,但使用GUI工具解决即时问题可能会更容易。 到目前为止,我使用的最好的产品是来自一家名为S3的公司, 看起来他们至less有一个产品有15天的免费试用期。 我刚刚证实,它将允许您一次select多个对象,并通过上下文菜单将其ACL设置为public。 享受云!