2012-02-11 12 views
38

आप एक एडब्ल्यूएस एस 3 सार्वजनिक फ़ोल्डर को फिर से निजी कैसे बनाते हैं?एस 3: एक सार्वजनिक फ़ोल्डर फिर से निजी बनाओ?

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

+1

आप witin ऐसा कर सकते हैं मैनेजमेंट कंसोल या प्रोग्रामैटिक एपीआई – ascobol

+4

जो मैंने सोचा था, लेकिन मुझे कंसोल के भीतर विकल्प नहीं दिख रहा है। ऐसा लगता है कि कुछ ऐसा करने के लिए एपीआई का उपयोग करना हास्यास्पद लगता है। – GoodGets

+1

वास्तव में, कंसोल केवल आपको एक फ़ाइल द्वारा अनुदान एक फ़ाइल को हटाने देता है। पाइथन में इसे कैसे करें इसके बारे में मेरा विस्तृत उत्तर देखें। – ascobol

उत्तर

28

जो मैं समझता हूं, मैनेजमेंट कंसोल में 'सार्वजनिक बनाएं' विकल्प दोबारा निर्देशिका में प्रत्येक ऑब्जेक्ट के लिए सार्वजनिक अनुदान जोड़ता है। आप इसे एक फ़ाइल पर राइट-क्लिक करके देख सकते हैं, फिर 'Properties' पर क्लिक करें।

Grantee: Everyone [x] open/download [] view permissions [] edit permission. 

यह इस सार्वजनिक उपयोग सेट नहीं होगी आप इस निर्देशिका के भीतर एक नई फ़ाइल अपलोड करते हैं और इसलिए निजी हो: तब आप पर 'अनुमतियां' क्लिक करने के लिए और एक पंक्ति होना चाहिए की जरूरत है।

आपको सार्वजनिक पढ़ने की अनुमति को एक-एक करके मैन्युअल रूप से हटाने की आवश्यकता है, या तो मैन्युअल रूप से यदि आपके पास केवल कुछ कुंजियां हैं या स्क्रिप्ट का उपयोग करके।

मैं 'Boto' मॉड्यूल के साथ अजगर में एक छोटे से पटकथा लिखी रिकर्सिवली एक S3 फ़ोल्डर में 'सार्वजनिक पढ़ा' सभी चाबियों का गुण दूर करने के लिए: (केवल

#!/usr/bin/env python 
#remove public read right for all keys within a directory 

#usage: remove_public.py bucketName folderName 

import sys 
import boto 

bucketname = sys.argv[1] 
dirname = sys.argv[2] 
s3 = boto.connect_s3() 
bucket = s3.get_bucket(bucketname) 

keys = bucket.list(dirname) 

for k in keys: 
    new_grants = [] 
    acl = k.get_acl() 
    for g in acl.acl.grants: 
     if g.uri != "http://acs.amazonaws.com/groups/global/AllUsers": 
      new_grants.append(g) 
    acl.acl.grants = new_grants 
    k.set_acl(acl) 

मैं के साथ एक फ़ोल्डर में परीक्षण किया) 2 वस्तुओं और यह काम किया। आप चाबियों का बहुत है, तो यह पूरा करने के लिए कुछ समय लग सकता है और एक समानांतर दृष्टिकोण आवश्यक हो सकता है। भी एक दिया S3 पथ पर पुनरावर्ती एसीएल सेट करने के लिए लगता है -

+14

आपने मेरे प्रश्न का उत्तर दिया है, इसलिए मैंने आपका जवाब स्वीकार कर लिया है। हालांकि, यह अमेज़ॅन के हिस्से पर बेकार है। चीजों को फिर से निजी बनाने के लिए हमें स्क्रिप्ट लिखनी है? बस भयानक ascobol, आपकी मदद के लिए धन्यवाद – GoodGets

9

मैं वास्तव में इस गाइड http://aws.amazon.com/articles/5050/

although it looks somewhat different than that guide

+0

निर्देश @ https://aws.amazon.com/articles/5050/ 2011 से बाहर होने के लिए प्रतीत होता है ... मेरे पास "गुणों" में जाने का विकल्प नहीं है "मेरी बाल्टी पर। पाइथन स्क्रिप्ट माइट्स अब एकमात्र तरीका है :( –

43

स्वीकार किए जाते हैं जवाब अच्छी तरह से काम करता है निम्नलिखित अमेज़न के यूआई का इस्तेमाल किया। बहरहाल, यह भी एक तीसरी पार्टी उपकरण के द्वारा और अधिक आसानी से किया जा सकता है s3cmd कहा जाता है - हम अपनी कंपनी में भारी इसका इस्तेमाल और यह एडब्ल्यूएस समुदाय के भीतर काफी लोकप्रिय हो रहा है।

उदाहरण के लिए, मान लें कि आपके पास इस प्रकार की एस 3 बाल्टी और डीआईआर संरचना थी: s3://mybucket.com/topleveldir/scripts/bootstrap/tmp/। अब मान लीजिए कि आपने अमेज़ॅन एस 3 कंसोल का उपयोग करके पूरे scripts "निर्देशिका" को सार्वजनिक रूप से चिह्नित किया था।

अब बनाने के लिए पूरे scripts "निर्देशिका पेड़" रिकर्सिवली (यानी उपनिर्देशिका और उनके फ़ाइलों सहित) फिर से निजी:

s3cmd setacl --acl-private --recursive s3://mybucket.com/topleveldir/scripts/ 

यह भी फिर से करता है, तो scripts "निर्देशिका पेड़" रिकर्सिवली सार्वजनिक करना आसान है आप चाहते हैं:

s3cmd setacl --acl-public --recursive s3://mybucket.com/topleveldir/scripts/ 

तुम भी बस ऊपर बताए गए आदेशों में --recursive को छोड़ते हुए से केवल एक दिया S3 "निर्देशिका" (यानी गैर पुनरावर्ती) पर अनुमति/एसीएल सेट करने के लिए चुन सकते हैं।

s3cmd के लिए काम करने के लिए, आप पहली बार (अधिक जानकारी के लिए http://s3tools.org/s3cmd देखें) s3cmd --configure के माध्यम से s3cmd करने के लिए अपने एडब्ल्यूएस का उपयोग और गुप्त चाबियाँ प्रदान करने के लिए है।

+1

एस 3 सीएमडी 1.6.1 का उपयोग कर रहा हूं और यह सुझाव काम नहीं करेगा यदि आपके पास पहले से ही एक फ़ोल्डर पर 'निजी' है। हमारे मामले में हमारे पास सार्वजनिक और निजी था और s3cmd के माध्यम से निजी पर सेटिंग थी, 'सार्वजनिक' को हटा नहीं देता है। अन्य उपयोगकर्ताओं के लिए यहां एक नोट छोड़ना। यहां --verbose के साथ आउटपुट है - "पहले से ही निजी, छोड़ना" – sumit

+0

यह regexy सामान जैसे 's3cmd --access_key $ AWS_ACCESS_KEY_ID --secret_key $ AWS_SECRET_ACCESS_KEY setacl --acl-private -r s3: // $ S3_BUCKET_NAME/*। नक्शा'? – metanerd

1

फिलहाल, boto docs आप इसे इस तरह

#!/usr/bin/env python 
#remove public read right for all keys within a directory 

#usage: remove_public.py bucketName folderName 

import sys 
import boto 

bucketname = sys.argv[1] 
dirname = sys.argv[2] 
s3 = boto.connect_s3() 
bucket = s3.get_bucket(bucketname) 

keys = bucket.list(dirname) 

for k in keys: 
    # options are 'private', 'public-read' 
    # 'public-read-write', 'authenticated-read' 
    k.set_acl('private') 

इसके अलावा क्या कर सकते हैं के अनुसार, आप S3 बाल्टी की अनुमति टैब के तहत कोई बाल्टी नीतियों को दूर करने पर विचार कर सकते।

4

एडब्ल्यूएस सीएलआई के लिए, यह काफी सीधे आगे है।

तो वस्तु है: s3://<bucket-name>/file.txt

एकल ऑब्जेक्ट के लिए:

aws s3api put-object-acl --acl private --bucket <bucket-name> --key file.txt 

बाल्टी में सभी वस्तुओं के लिए (बैश एक लाइनर):

aws s3 ls --recursive s3://<bucket-name> | cut -d' ' -f5- | awk '{print $NF}' | while read line; do 
    echo "$line" 
    aws s3api put-object-acl --acl private --bucket <bucket-name> --key "$line" 
done 
+1

अच्छी तरह से काम करता है, धन्यवाद – DanH

संबंधित मुद्दे