ডিফল্টরূপে এডাব্লুএস এস 3 বালতিতে সমস্ত অবজেক্ট কীভাবে করবেন?


151

আমি আমার বালতিতে একটি ফাইল আপলোড করতে একটি পিএইচপি লাইব্রেরি ব্যবহার করছি। আমি এসিএলকে সর্বজনীন-পঠন-লিখনের জন্য সেট করেছি এবং এটি দুর্দান্ত কাজ করে তবে ফাইলটি এখনও ব্যক্তিগত।

আমি খুঁজে পেয়েছি যে আমি যদি সবার জন্য অনুদান পরিবর্তন করি তবে এটি ফাইলটি সর্বজনীন করে। আমি যা জানতে চাই তা হল কীভাবে আমি আমার বালতিতে থাকা সমস্ত বস্তুর উপর "প্রত্যেকের" সেট করার জন্য ডিফল্ট গ্রান্টি করব । বা ডিফল্টরূপে ফাইলগুলি সর্বজনীন করার জন্য আরও কোনও সমাধান আছে ?

আমি যে কোডটি ব্যবহার করছি তা নীচে:

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
আমি এই উত্তরটিকে @ লিলিকি হিসাবে একই কারণে উত্সাহিত করেছি, বিস্তারিত নির্দেশাবলী কেবল উত্তর হস্তান্তরের পরিবর্তে একটি দুর্দান্ত ভূমিকা ছিল।
ব্রেন্ডো

একই অবস্থা. এডাব্লুএস মাঝে মাঝে অস্বচ্ছ হতে থাকে এবং সম্ভবত খুব ভাল কারণে। উত্তরের এই ফর্মটি স্থল শূন্য থেকে সহায়ক।
জেরোম

এটি যখন আপনি বালতিতে নতুন ফাইল যুক্ত করেন তখন কাজ করে তবে আমার আগেই বালতিতে উপস্থিত ফাইলগুলি সর্বজনীন হওয়ার জন্য পরিবর্তন করতে হবে।
রাডেনকো জেক

137

আপনি যদি সমস্ত বস্তুকে ডিফল্টরূপে সর্বজনীন করতে চান, তবে সহজ উপায় হ'ল প্রতিটি পৃথক বস্তুতে অ্যাক্সেস কন্ট্রোল তালিকার (এসিএল) পরিবর্তে একটি বালতি নীতি গ্রহণ করা।

এখানে চিত্র বর্ণনা লিখুন

আপনি আপনার বালতির জন্য বালতি নীতি উত্পন্ন করতে AWS নীতি জেনারেটরটি ব্যবহার করতে পারেন ।

উদাহরণস্বরূপ, নিম্নলিখিত নীতিটি যে কাউকে আপনার এস 3 বাল্টির প্রতিটি বস্তু পড়ার অনুমতি দেবে (কেবলমাত্র <bucket-name>আপনার বালতির নাম দিয়ে প্রতিস্থাপন করুন):

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

বালতি নীতিমালার একটি তালিকা রয়েছে Statementsএবং প্রতিটি বিবৃতিতে (ব্যবহারকারী) দ্বারা নির্দিষ্ট (কোনও বা দ্বারা চিহ্নিত ) দ্বারা সম্পাদিত একটি তালিকার জন্য Effect(হয় Allowবা হয় ) থাকে।DenyActionsPrincipalResourceAmazon Resource NameARN

Idশুধু একটি ঐচ্ছিক নীতি আইডি এবং Sidএকটি ঐচ্ছিক অনন্য বিবৃতি আইডি হল।

এস 3 বালতি নীতিগুলির জন্য, রিসোর্স এআরএনগুলি ফর্মটি গ্রহণ করে:

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

উপরের উদাহরণটি ( Effect: Allow) যে কোনও ব্যক্তিকে ( Principal: *) Action: s3:GetObjectবালতিতে ( Resource: arn:aws:s3:::<bucket-name>/*) কোনও বস্তু অ্যাক্সেস করতে দেয় ।


কন্ট্রোল প্যানেলের সাথে কোনও উপায় নেই?
আইয়ানাজ

2
@ ইয়াণাজ আপনি এই বালতি নীতিটি বালতিতে অ্যাডাব্লুএস কনসোলের মাধ্যমে (কন্ট্রোল প্যানেল) যুক্ত করতে পারবেন
ডিসিক্রো

@ উত্তর আমার নীচে দেখুন উত্তর।
jaxxbo

এছাড়াও নোট করুন যে উপরের লিঙ্কটিতে একটি "উদাহরণ নীতিগুলি" লিঙ্ক রয়েছে যা নীতি জেনারেটরে কাটা এবং আটকানোর জন্য প্রয়োজনীয় সঠিক তথ্য দেয়। অ্যাডস আপডেট হিসাবে এপিআইগুলি এটি সঠিক থাকার সম্ভাবনা বেশি। আজ সকালে আমার জন্য কবজির মতো কাজ করেছেন।
কিথপজল্লি

Principal: *আমাকে অনেক সাহায্য করেছে ধন্যবাদ!
iedmrc

2

আমার সমস্যাটি কিছুটা আলাদা ছিল, তবে যেহেতু এই প্রশ্নটি গুগল অনুসন্ধানের শীর্ষে রয়েছে আমি আমার সমাধানটি ছেড়ে দেব, সম্ভবত এটি কারও সাহায্য করবে।

আমার কাছে এর আগে এস 3 বালতিতে সম্পূর্ণ অ্যাক্সেস ছিল তবে একদিন এটি Access Deniedআমার সমস্ত ফাইলে ফিরে যেতে শুরু করে। সমাধান সোজা ছিল সহজ।

  1. যান Services-S3
  2. আপনার এস 3 বালতি ক্লিক করুন
  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/*"
        }
    ]
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.