How to make 10,000 files in S3 public

前端 未结 9 952
梦如初夏
梦如初夏 2020-12-04 07:07

I have a folder in a bucket with 10,000 files. There seems to be no way to upload them and make them public straight away. So I uploaded them all, they\'re private, and I ne

相关标签:
9条回答
  • 2020-12-04 07:52

    You would think they would make public read the default behavior, wouldn't you? : ) I shared your frustration while building a custom API to interface with S3 from a C# solution. Here is the snippet that accomplishes uploading an S3 object and setting it to public-read access by default:

    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));
         }
    }
    

    The ToACLString(acl) function returns public-read, BASE_SERVICE_URL is s3.amazonaws.com and the AWS_ACL_HEADER constant is x-amz-acl. The plug and DreamMessage stuff will likely look strange to you as we're using the Dream framework to streamline our http communications. Essentially we're doing an http PUT with the specified headers and a special header signature per aws specifications (see this page in the aws docs for examples of how to construct the authorization header).

    To change an existing 1000 object ACLs you could write a script but it's probably easier to use a GUI tool to fix the immediate issue. The best I've used so far is from a company called cloudberry for S3; it looks like they have a free 15 day trial for at least one of their products. I've just verified that it will allow you to select multiple objects at once and set their ACL to public through the context menu. Enjoy the cloud!

    0 讨论(0)
  • 2020-12-04 07:53

    I had to change several hundred thousand objects. I fired up an EC2 instance to run this, which makes it all go faster. You'll want to install the aws-sdk gem first.

    Here's the code:

    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
    
    0 讨论(0)
  • 2020-12-04 07:53

    Had this need myself but the number of files makes it WAY to slow to do in serial. So I wrote a script that does it on iron.io's IronWorker service. Their 500 free compute hours per month are enough to handle even large buckets (and if you do exceed that the pricing is reasonable). Since it is done in parallel it completes in less than a minute for the 32,000 objects I had. Also I believe their servers run on EC2 so the communication between the job and S3 is quick.

    Anybody is welcome to use my script for their own needs.

    0 讨论(0)
提交回复
热议问题