2010-06-29 28 views
59

मेरे पास 10,000 फाइलों वाली बाल्टी में एक फ़ोल्डर है। ऐसा लगता है कि उन्हें अपलोड करने और उन्हें सीधे सार्वजनिक करने का कोई तरीका नहीं है। इसलिए मैंने उन सभी को अपलोड किया, वे निजी हैं, और मुझे उन्हें सभी सार्वजनिक बनाने की जरूरत है।एस 3 सार्वजनिक में 10,000 फाइलें कैसे बनाएं

मैंने aws कंसोल की कोशिश की है, यह सिर्फ एक त्रुटि देता है (कम फ़ाइलों वाले फ़ोल्डर के साथ ठीक काम करता है)।

मैंने फ़ायरफ़ॉक्स में एस 3 आयोजन का उपयोग करने की कोशिश की है, वही बात।

क्या कोई सॉफ्टवेयर या कुछ स्क्रिप्ट मैं इन सभी सार्वजनिक बनाने के लिए चला सकता हूं?

+2

हर उपकरण मैंने कोशिश दुर्घटनाग्रस्त हो गया, तो मैं एक PHP स्क्रिप्ट है कि कुछ घंटे लगते हैं और सिर्फ बाल्टी में हर वस्तु के माध्यम से लूप में चलाया और इसे सार्वजनिक नहीं किया लेखन समाप्त हो गया। – PeterV

उत्तर

91

आप एक बाल्टी नीति उत्पन्न कर सकते हैं (नीचे उदाहरण देखें) जो बाल्टी में सभी फ़ाइलों तक पहुंच प्रदान करता है। बाल्टी नीति को एडब्ल्यूएस कंसोल के माध्यम से बाल्टी में जोड़ा जा सकता है।

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

अमेज़ॅन द्वारा प्रदान की गई नीति जनरेटर टूल को भी देखें।

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

+3

यह मेरे लिए काम नहीं किया। कुछ ऑब्जेक्ट्स अभी भी बाल्टी नीति के साथ 'पहुंच से वंचित' प्रतिक्रिया लौट रहे हैं। यह उपरोक्त से प्रतिलिपि बनाई गई है, केवल बाल्टी नाम बदल गया है। मुझे लगता है कि सभी 1.3 मिलियन ऑब्जेक्ट्स के माध्यम से लूप को लिपि लिखने का समय है ... थोड़े परेशान –

+0

आपको अपनी बाल्टी – karnage

+8

के नाम पर "बाल्टी" बदलने की ज़रूरत है, मुझे इस तरह से ऐसा करने से नाराज है। वह कुछ बदसूरत JSON है। – superluminary

2

BucketExplorer पर एक नज़र डालें, यह थोक संचालन को बहुत अच्छी तरह से प्रबंधित करता है और एक ठोस एस 3 क्लाइंट है।

+3

अब पैलेट के माध्यम से साइबरडक (फ्री) में परिवर्तन अनुमतियों को थोक करना भी संभव है। –

+0

बकेट एक्सप्लोरर केवल तभी उपयोगी होता है जब आपको सभी बाल्टी सूचीबद्ध करने की अनुमति हो। इस ऑपरेशन के लिए सीएलआई या एसडीके का उपयोग करना बेहतर है और अपने उपयोगकर्ताओं को प्रतिबंधित अनुमतियों के साथ छोड़ दें। – perilandmishap

0

आपको लगता है कि वे सार्वजनिक व्यवहार को डिफ़ॉल्ट व्यवहार पढ़ेंगे, है ना? :) मैंने सी # समाधान से 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: यहाँ टुकड़ा accomplishes है कि एक S3 वस्तु अपलोड करने और सार्वजनिक-पठन पहुँच के लिए यह डिफ़ॉल्ट रूप से स्थापित कर रहा है और AWS_ACL_HEADER स्थिर x-amz-acl है। प्लग और ड्रीम मैसेज सामान आपके लिए अजीब लगेंगे क्योंकि हम अपने http संचार को सुव्यवस्थित करने के लिए ड्रीम फ्रेमवर्क का उपयोग कर रहे हैं। अनिवार्य रूप से हम निर्दिष्ट शीर्षलेखों के साथ एक http PUT कर रहे हैं और एक विशेष हेडर हस्ताक्षर प्रति aws विनिर्देशों (प्राधिकरण शीर्षलेख बनाने के उदाहरणों के लिए aws docs में यह पृष्ठ देखें)।

मौजूदा 1000 ऑब्जेक्ट एसीएल को बदलने के लिए आप एक स्क्रिप्ट लिख सकते हैं लेकिन तत्काल समस्या को ठीक करने के लिए जीयूआई उपकरण का उपयोग करना संभवतः आसान है। अब तक का सबसे अच्छा उपयोग मैंने एस 3 के लिए cloudberry नामक कंपनी से किया है; ऐसा लगता है कि उनके पास कम से कम एक उत्पाद के लिए 15 दिन का नि: शुल्क परीक्षण है। मैंने अभी सत्यापित किया है कि यह आपको एक साथ कई ऑब्जेक्ट्स चुनने और संदर्भ मेनू के माध्यम से अपने एसीएल को सार्वजनिक करने की अनुमति देगा। बादल का आनंद लें!

30

मैं कई सौ हजार वस्तुओं बदलना पड़ा। मैंने इसे चलाने के लिए एक ईसी 2 उदाहरण निकाल दिया, जिससे यह सब तेजी से बढ़ जाता है। आप पहले aws-sdk मणि इंस्टॉल करना चाहते हैं।

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 
+1

सरल तरीका उन्हें सार्वजनिक स्थान के ध्वज सेट के साथ अपलोड करना है, लेकिन असफल रहा है, यह एक अच्छा विकल्प है। – superluminary

+0

स्नैप किया गया यह कोड पुराना है, मेरे [उत्तर] (http: // stackoverflow का संदर्भ लें।कॉम/प्रश्न/3142388/कैसे-टू-मेक -10-000-files-in-s3-public/31379500 # 31379500) – ksarunas

2

इस जरूरत थी अपने आप को लेकिन फ़ाइलों की संख्या यह धारावाहिक में क्या करना धीमा करने के लिए रास्ता बनाता है:

कोड यह रहा। इसलिए मैंने a script लिखा जो iron.io की IronWorker सेवा पर करता है। प्रति माह उनके 500 मुफ्त गणना घंटे भी बड़ी बाल्टी को संभालने के लिए पर्याप्त हैं (और यदि आप यह मानते हैं कि कीमत उचित है)। चूंकि यह समानांतर में किया जाता है क्योंकि यह मेरे पास 32,000 वस्तुओं के लिए एक मिनट से भी कम समय में पूरा होता है। इसके अलावा मेरा मानना ​​है कि उनके सर्वर ईसी 2 पर चलते हैं, इसलिए नौकरी और एस 3 के बीच संचार जल्दी है।

किसी की भी अपनी स्क्रिप्ट का उपयोग अपनी आवश्यकताओं के लिए करने के लिए स्वागत है।

18

मुझे एक ही समस्या थी, @DanielVonFange द्वारा समाधान पुराना है, क्योंकि एसडीके का नया संस्करण बाहर है।

जोड़ना कोड स्निपेट कि एडब्ल्यूएस रूबी 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 
+1

शानदार उत्तर - केवल एक स्क्रिप्ट स्पॉट में आवश्यक स्क्रिप्ट – Phantomwhale

+1

बहुत मदद की, धन्यवाद! – antonbormotov

+0

भयानक, पूरी तरह से काम करता है। –

34

आप पहली बार के लिए अपलोड कर रहे हैं, तो आप कमांड लाइन पर अपलोड पर सार्वजनिक रूप से करने के लिए फ़ाइलों सेट कर सकते हैं:

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

Using High-Level s3 Commands with the AWS Command Line Interface

में दस्तावेज के रूप में दुर्भाग्य से यह केवल एसीएल लागू होता है जब फ़ाइलों को अपलोड कर रहे हैं। यह (मेरे परीक्षण में) पहले से अपलोड की गई फ़ाइलों को एसीएल लागू नहीं करता है।

यदि आप मौजूदा ऑब्जेक्ट्स को अपडेट करना चाहते हैं, तो आप बाल्टी को स्वयं सिंक करने में सक्षम होते थे, लेकिन ऐसा लगता है कि यह काम करना बंद कर दिया है।

[अब और काम नहीं कर] यह कमांड लाइन से किया जा सकता है:

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

(तो यह लंबे समय तक नहीं प्रश्न का उत्तर है, लेकिन संदर्भ के लिए इस सवाल का जवाब छोड़ने के रूप में यह काम करता था।)

+0

क्या यह आदेश उन फ़ाइलों पर प्रभाव डालता है जो पहले से अपलोड हैं लेकिन अभी तक सार्वजनिक नहीं पढ़े गए हैं? – Alston

+5

जब मैंने इसका परीक्षण किया, ऐसा लगता है कि यह केवल नई सिंक की गई फ़ाइलों में एसीएल जोड़ता है। –

+0

रीप्ले के लिए धन्यवाद, मैंने इसका परीक्षण भी किया। बैच करने के लिए कोई भी तरीका अपलोड की गई फ़ाइलों की अनुमति को बदलता है? – Alston

8

बस नए एस 3 कंसोल के साथ इसे जोड़ना चाहते थे, आप फ़ोल्डरों के अंदर सभी फाइलें बनाने के लिए अपने फ़ोल्डर (ओं) का चयन कर सकते हैं और Make public का चयन कर सकते हैं। यह पृष्ठभूमि कार्य के रूप में काम करता है इसलिए इसे किसी भी फाइल को संभालना चाहिए।

Make Public