如何在S3公共中制作10,000个文件

Pet*_*erV 82 amazon-s3 amazon-web-services

我有一个包含10,000个文件的文件夹.似乎没有办法上传它们并立即公开.所以我把它们全部上传,它们都是私密的,我需要将它们全部公开.

我已经尝试过aws控制台,它只是出错(对于文件较少的文件夹工作正常).

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

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

Raj*_*jiv 110

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

{
    "Id": "...",
    "Statement": [ {
        "Sid": "...",
        "Action": [
            "s3:GetObject"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::bucket/*",
        "Principal": {
            "AWS": [ "*" ]
        }
    } ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我不得不这样做.这是一些丑陋的JSON. (11认同)
  • 只是注意:看起来很明显,但您也可以选择限制对特定_folders_:`bucket/avatars/*`的访问.(不要忘记最后的`*`.我做了,我绕圈跑了一会儿.) (5认同)
  • 这不适合我.即使存在存储桶策略,某些对象仍会返回"拒绝访问"响应.它是从上面复制粘贴的,只更改了桶名.我想是时候编写一个脚本来遍历所有130万个对象......有点刺激 (4认同)
  • @Benjamin什么是"基本"配置对你不适合,因为每个人的安全要求都不同.AWS提供了一种统一的方法来自定义这些策略.因此,必须花时间正确学习安全策略,而不是回避几个简单的JSON行. (2认同)

Dav*_*sel 57

如果您是第一次上传,可以在命令行上将文件设置为上载:

aws s3 sync . s3://my-bucket/path --acl public-read
Run Code Online (Sandbox Code Playgroud)

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

不幸的是,它仅在上载文件时应用ACL.它(在我的测试中)没有将ACL应用于已经上传的文件.

如果您确实想要更新现有对象,您曾经能够将存储桶同步到自身,但这似乎已停止工作.

[不再工作]这可以从命令行完成:

aws s3 sync s3://my-bucket/path s3://my-bucket/path --acl public-read
Run Code Online (Sandbox Code Playgroud)

(所以这不再回答这个问题,而是留下答案,以供参考.)

  • 当我测试它时,似乎只将ACL添加到新同步的文件中. (8认同)

Dan*_*nge 33

我不得不改变几十万件物品.我启动了一个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
Run Code Online (Sandbox Code Playgroud)

  • 简单的方法是首先使用 public_read 标志设置上传它们,但如果失败,这是一个不错的选择。 (2认同)

ksa*_*nas 22

我有同样的问题,@DanielVonFange的解决方案已经过时,因为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
Run Code Online (Sandbox Code Playgroud)


Sel*_*cuk 14

只想添加新的S3控制台,您可以选择文件夹并选择Make public将文件夹中的所有文件公开.它作为后台任务,因此它应该处理任意数量的文件.

公开

  • 不幸的是,它需要很长时间,而且当命令是跑步者时你无法关闭浏览器.您的浏览器正在为每个文件发送2个请求,在我的情况下,这两个请求需要500毫秒.如果你有很多文件需要很长时间=( (3认同)
  • 而且,还有另一个问题:这将完全公开.如果您只想要公共读取权限,那就是一个问题. (2认同)

Ale*_*nov 7

使用cli:

aws s3 ls s3://bucket-name --recursive > all_files.txt && grep .jpg all_files.txt > files.txt && cat files.txt | awk '{cmd="aws s3api put-object-acl --acl public-read --bucket bucket-name --key "$4;system(cmd)}'

  • 难道你不能只使用管道来 grep 而不是将所有 files.txt 写入磁盘吗?这可以是 `aws s3 ls s3://bucket-name --recursive | .jpg | grep awk '{cmd="aws s3api put-object-acl --acl public-read --bucket 存储桶名称 --key "$4;system(cmd)}'` (4认同)