डिफ़ॉल्ट रूप से AWS S3 बाल्टी में सभी वस्तुओं को कैसे सार्वजनिक किया जाए?


151

मैं अपनी बाल्टी में फ़ाइल अपलोड करने के लिए PHP लाइब्रेरी का उपयोग कर रहा हूं। मैंने ACL को पब्लिक-रीड-राइट पर सेट किया है और यह ठीक काम करता है लेकिन फाइल अभी भी निजी है।

मैंने पाया कि अगर मैं ग्रांटी को हर किसी को बदलता हूं तो यह फाइल को सार्वजनिक करता है। मैं जानना चाहता हूं कि मैं अपनी बाल्टी में सभी वस्तुओं पर डिफ़ॉल्ट ग्रांटी कैसे बनाऊं जिसे "सभी" पर सेट किया जाए । या क्या डिफ़ॉल्ट रूप से फ़ाइलों को सार्वजनिक करने का एक और समाधान है ?

मेरे द्वारा उपयोग किया जा रहा कोड नीचे है:

public static function putObject($input, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array()) {
    if ($input === false) return false;
    $rest = new S3Request('PUT', $bucket, $uri);

    if (is_string($input)) $input = array(
        'data' => $input, 'size' => strlen($input),
        'md5sum' => base64_encode(md5($input, true))
    );

    // Data
    if (isset($input['fp']))
        $rest->fp =& $input['fp'];
    elseif (isset($input['file']))
        $rest->fp = @fopen($input['file'], 'rb');
    elseif (isset($input['data']))
        $rest->data = $input['data'];

    // Content-Length (required)
    if (isset($input['size']) && $input['size'] >= 0)
        $rest->size = $input['size'];
    else {
        if (isset($input['file']))
            $rest->size = filesize($input['file']);
        elseif (isset($input['data']))
            $rest->size = strlen($input['data']);
    }

    // Custom request headers (Content-Type, Content-Disposition, Content-Encoding)
    if (is_array($requestHeaders))
        foreach ($requestHeaders as $h => $v) $rest->setHeader($h, $v);
    elseif (is_string($requestHeaders)) // Support for legacy contentType parameter
        $input['type'] = $requestHeaders;

    // Content-Type
    if (!isset($input['type'])) {
        if (isset($requestHeaders['Content-Type']))
            $input['type'] =& $requestHeaders['Content-Type'];
        elseif (isset($input['file']))
            $input['type'] = self::__getMimeType($input['file']);
        else
            $input['type'] = 'application/octet-stream';
    }

    // We need to post with Content-Length and Content-Type, MD5 is optional
    if ($rest->size >= 0 && ($rest->fp !== false || $rest->data !== false)) {
        $rest->setHeader('Content-Type', $input['type']);
        if (isset($input['md5sum'])) $rest->setHeader('Content-MD5', $input['md5sum']);

        $rest->setAmzHeader('x-amz-acl', $acl);
        foreach ($metaHeaders as $h => $v) $rest->setAmzHeader('x-amz-meta-'.$h, $v);
        $rest->getResponse();
    } else
        $rest->response->error = array('code' => 0, 'message' => 'Missing input parameters');

    if ($rest->response->error === false && $rest->response->code !== 200)
        $rest->response->error = array('code' => $rest->response->code, 'message' => 'Unexpected HTTP status');
    if ($rest->response->error !== false) {
        trigger_error(sprintf("S3::putObject(): [%s] %s", $rest->response->error['code'], $rest->response->error['message']), E_USER_WARNING);
        return false;
    }
    return true;
}

जवाबों:


300

Http://awspolicygen.s3.amazonaws.com/policygen.html पर जाएं जैसे विवरण भरें:यहाँ छवि विवरण दर्ज करें लड़ाई में "GetObject" का चयन करें "विवरण जोड़ें" का चयन करें और फिर "जनरेट पॉलिसी" चुनें।

पाठ उदाहरण की प्रतिलिपि बनाएँ:

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

अब अपने AWS S3 कंसोल पर जाएं, बाल्टी स्तर पर, गुण, विस्तार अनुमतियाँ पर क्लिक करें, फिर बाल्टी नीति जोड़ें चुनें। उपरोक्त कोड को संपादक में पेस्ट करें और सहेजें को हिट करें।

बाल्टी में आपके सभी आइटम डिफ़ॉल्ट रूप से सार्वजनिक होंगे।


8
यह सही प्रतिक्रिया है। उत्तर से पहले के विपरीत, इस पोस्ट ने मुझे यह भी सिखाया कि नीतियां कैसे बनाएं और वे क्या करते हैं। इसे पढ़ने के बाद मैं मैन्युअल रूप से पॉलिसी लिख सकता हूं।
जेसन चेलैडिन

2
मैंने इस उत्तर को @liyicky के समान कारण के लिए उकेरा, विस्तृत निर्देशों का केवल जवाब सौंपने के बजाय एक अच्छा परिचय था।
ब्रेंडो

मुझे भी। AWS कई बार अपारदर्शी होता है और शायद बहुत अच्छे कारण के लिए। उत्तर का यह रूप ग्राउंड जीरो से मददगार है।
जेरोम

यह तब काम करता है जब आप बाल्टी में नई फाइलें जोड़ते हैं, लेकिन मुझे सार्वजनिक होने के लिए बाल्टी में पहले से मौजूद फाइलों को बदलना होगा।
रेडेंको ज़ेक

137

यदि आप सभी वस्तुओं को डिफ़ॉल्ट रूप से सार्वजनिक करना चाहते हैं, तो सबसे सरल तरीका यह है कि प्रत्येक व्यक्तिगत ऑब्जेक्ट पर परिभाषित एक्सेस कंट्रोल लिस्ट (ACL) के बजाय एक बकेट पॉलिसी को ट्रफ करें ।

यहाँ छवि विवरण दर्ज करें

आप एडब्ल्यूएस पॉलिसी जेनरेटर का उपयोग कर सकते हैं अपनी बाल्टी के लिए एक बाल्टी नीति बनाने के लिए का ।

उदाहरण के लिए, निम्न नीति आपके S3 बाल्टी में हर वस्तु को पढ़ने की अनुमति देगी (बस <bucket-name>अपनी बाल्टी के नाम से बदलें ):

{
  "Id": "Policy1380877762691",
  "Statement": [
    {
      "Sid": "Stmt1380877761162",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::<bucket-name>/*",
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    }
  ]
}

बाल्टी नीति की एक सूची है Statementsऔर प्रत्येक बयान एक है Effect(या तो Allowया Denyकी एक सूची के लिए) Actionsहै कि द्वारा किया जाता है Principalपर निर्दिष्ट (उपयोगकर्ता) Resource(पहचान एक से Amazon Resource NameयाARN )।

Idसिर्फ एक वैकल्पिक नीति आईडी और हैSid एक वैकल्पिक अद्वितीय बयान आईडी है।

S3 बाल्टी नीतियों के लिए, संसाधन ARN फॉर्म लेते हैं:

arn:aws:s3:::<bucket_name>/<key_name>

उपर्युक्त उदाहरण बाल्टी में ( ) किसी भी वस्तु को एक्सेस करने के लिए ( ) किसी को Effect: Allowभी अनुमति देता है ।Principal: *Action: s3:GetObjectResource: arn:aws:s3:::<bucket-name>/*


वहाँ नियंत्रण कक्ष के साथ एक रास्ता नहीं है?
इयनाज

2
@ianaz आप इस बाल्टी पॉलिसी को AWS कंसोल (कंट्रोल पैनल) के माध्यम से बाल्टी में जोड़ सकते हैं
dcro

@ianaz नीचे मेरा जवाब देखें।
jaxxbo

यह भी ध्यान दें कि उपरोक्त लिंक में एक "उदाहरण नीतियां" लिंक है जो पॉलिसी जनरेटर में कटौती और पेस्ट करने के लिए आवश्यक सटीक जानकारी देता है। चूंकि एपीआई एपीआई को अपडेट करते हैं इसलिए यह सही रहने की अधिक संभावना है। आज सुबह मेरे लिए एक आकर्षण की तरह काम किया।

Principal: *मेरी बहुत मदद की। धन्यवाद!
Iiedmrc

2

मेरी समस्या थोड़ी अलग थी, लेकिन चूंकि यह प्रश्न Google खोज के शीर्ष पर है, इसलिए मैं अपना समाधान छोड़ दूंगा, शायद यह किसी की मदद करे।

मेरे पास पहले से ही S3 बाल्टी तक पूरी पहुंच थी, लेकिन एक दिन यह Access Deniedमेरी सभी फाइलों पर वापस जाने लगा। समाधान सीधा सरल था।

  1. पर जाएं Services-S3
  2. अपने S3 बाल्टी पर क्लिक करें
  3. में स्विच करें Permissionsटैब और फिर करने के लिए जाना Bucket Policyटैब
  4. और Saveबटन पर क्लिक करें।

यह आपकी सभी फाइलों पर अनुमति पुन: सौंपना चाहिए।

यहाँ छवि विवरण दर्ज करें

वैसे भी, यहाँ पूर्ण है bucket policyजो सभी ऑब्जेक्ट को सार्वजनिक करने की अनुमति देता है

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::enter-here-your-media-bucket-name/*"
        }
    ]
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.