S3 पब्लिक में 10,000 फाइलें कैसे बनाते हैं


92

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

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

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

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


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

जवाबों:


119

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

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

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

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


5
इसने मेरे लिए काम नहीं किया। कुछ वस्तुएं अभी भी बाल्टी नीति के साथ 'एक्सेस अस्वीकृत' प्रतिक्रिया दे रही हैं। यह ऊपर से कॉपी-पेस्ट किया गया है केवल बाल्टी के नाम के साथ। मुझे लगता है कि यह सभी 1.3 मिलियन वस्तुओं के माध्यम से एक स्क्रिप्ट लिखने का समय है ... थोड़े परेशान
ब्लेक मिलर

आपको "बाल्टी" को अपनी बाल्टी के नाम पर बदलने की आवश्यकता है
कर्नेज

11
मैं इसे इस तरह से करने से नाराज था। यह कुछ बदसूरत JSON है।
१०:५०

6
बस एक ध्यान दें: यह स्पष्ट लग सकता है, लेकिन आप यह भी विशिष्ट को सीमित करने के लिए चुन सकते हैं फ़ोल्डरों : bucket/avatars/*। ( *अंत में मत भूलना । मैंने किया और मैं थोड़ी देर के लिए हलकों में भाग गया।)
पुरातत्ववेत्ता

2
@Benjamin आपके लिए "बुनियादी" कॉन्फ़िगरेशन दूसरों के लिए अनुपयुक्त है, क्योंकि हर किसी की सुरक्षा आवश्यकताएं अलग हैं। AWS इन नीतियों को अनुकूलित करने के लिए एक समान तरीका प्रदान करता है। इसलिए, किसी को सुरक्षा नीतियों को ठीक से सीखने के लिए समय लेना चाहिए और JSON की कुछ सरल लाइनों से दूर नहीं हटना चाहिए।
afilina

68

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

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

जैसा कि AWS कमांड लाइन इंटरफेस के साथ उच्च-स्तरीय s3 कमांड का उपयोग करने में प्रलेखित है

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

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

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

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

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


क्या यह कमांड उन फाइलों पर प्रभाव डालती है जो पहले ही अपलोड हो चुकी हैं लेकिन अभी तक सार्वजनिक नहीं पढ़ी गई हैं?
एल्स्टन

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

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

ओह, कोई आश्चर्य नहीं। मैं इससे भ्रमित था। वास्तव में आपने स्पष्ट करने की सराहना की।
श्रीधर सरनोबत

मौजूदा फ़ाइलों को बदलने के लिए कैसे शामिल करने के लिए अद्यतन उत्तर।
डेविड

34

मुझे कई लाख वस्तुओं को बदलना पड़ा। मैंने इसे चलाने के लिए एक EC2 उदाहरण दिया, जिससे यह सब तेजी से आगे बढ़ता है। आप 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
इसका सरल तरीका यह है कि आप पहले से ही public_read फ्लैग सेट के साथ उन्हें अपलोड कर दें, लेकिन इसे विफल करते हुए, यह एक अच्छा विकल्प है।
१०:०५ पर सुपरल्युमरी

यह कोड पुराना है, मेरा उत्तर
ksarunas

26

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

कोड स्निपेट जोड़ना जो मेरे लिए अभी AWS रूबी एसडीके के साथ काम करता है:

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
शानदार जवाब - सिर्फ एक स्क्रिप्ट जिसकी मुझे एक कड़ी जगह में जरूरत थी
फैंटमव्हेल

@ksarunas मेरे मामले में, मुझे सार्वजनिक को निजी अनुमतियों में बदलने की आवश्यकता है, इसलिए सार्वजनिक-निजी को निजी के साथ बदलें और पहुंच बदल गई, लेकिन फिर भी, मैं URL तक पहुंचने में सक्षम हूं?
राहुल

19

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

सार्वजनिक करें


5
दुर्भाग्य से इसमें एक लंबा समय लगता है और कमांड रनर होने पर आप ब्राउज़र को बंद नहीं कर सकते। आपका ब्राउज़र प्रत्येक फ़ाइल के लिए 2 अनुरोध भेज रहा है, मेरे मामले में दोनों अनुरोधों ने 500ms लिया। यदि आपके पास बहुत सारी फाइलें हैं, तो इसमें लंबा समय लग जाएगा = (
हेरालॉन अगुएर

2
और, एक और समस्या है: यह पूरी तरह से सार्वजनिक कर देगा। यदि आप केवल पब्लिक-रीड एक्सेस चाहते हैं, तो यह एक समस्या है।
मार्सेलो एग्मोवेल

बहुत सावधान - मैंने यह सार्वजनिक किया और "प्रगति पट्टी" जो पॉप अप है, इतनी सूक्ष्म है, मैंने सोचा कि यह किया गया था। मैंने जाँच की और संभवत: इस पर काम करने में एक घंटा बिताया, इससे पहले कि मैंने महसूस किया कि आप Make सार्वजनिक और छोटे सूक्ष्म "प्रगति बार दिखाता है" पर क्लिक करें ... grrr ... जब से मैंने ब्राउज़र विंडो को लगभग 10 बार बंद किया है, मुझे लगता है कि इसे हर बार मार दिया गया था । मैं इसे अभी चला रहा हूं - यह बहुत जल्दी है - शायद 120k छवियों के लिए 20 मिनट
स्कॉट

11

क्ली का उपयोग करना:

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


3
क्या आप केवल सभी files.txt के साथ डिस्क पर लिखने के बजाय grep करने के लिए एक पाइप का उपयोग नहीं कर सकते हैं? यह हो सकता हैaws s3 ls s3://bucket-name --recursive | grep .jpg | awk '{cmd="aws s3api put-object-acl --acl public-read --bucket bucket-name --key "$4;system(cmd)}'
sakurashinken

2

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


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

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

2

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

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


0

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.