จะทำให้ Objects ทั้งหมดในที่เก็บ AWS S3 เป็นค่าเริ่มต้นได้อย่างไร


151

ฉันใช้ไลบรารี PHP เพื่ออัปโหลดไฟล์ไปยังที่เก็บข้อมูลของฉัน ฉันตั้งค่า ACL เป็นpublic-read-writeและทำงานได้ดี แต่ไฟล์ยังคงเป็นส่วนตัว

ฉันพบว่าถ้าฉันเปลี่ยนผู้รับสิทธิ์เป็นทุกคนมันจะทำให้ไฟล์เป็นแบบสาธารณะ สิ่งที่ฉันต้องการที่จะรู้ว่าเป็นวิธีการที่ฉันจะทำให้การเริ่มต้นของผู้ได้รับสิทธิ์ในวัตถุทั้งหมดในถังของฉันที่จะถูกตั้งค่าเป็น"ทุกคน" หรือมีวิธีอื่นในการทำให้ไฟล์เป็นค่าเริ่มต้น

รหัสที่ฉันใช้อยู่ด้านล่าง:

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
นี่คือการตอบสนองที่ถูกต้อง ต่างจากคำตอบก่อนหน้าโพสต์นี้ยังสอนฉันถึงวิธีการสร้างนโยบายและสิ่งที่พวกเขาทำ หลังจากอ่านสิ่งนี้ฉันสามารถเขียนนโยบายได้ด้วยตนเอง
Jason Cheladyn

2
ฉันตอบคำถามนี้ด้วยเหตุผลเดียวกับ @liyicky คำแนะนำโดยละเอียดคือการแนะนำที่ดีแทนที่จะส่งคำตอบให้
brendo

กันที่นี่ AWS มีแนวโน้มที่จะทึบแสงในบางครั้งและอาจเป็นเหตุผลที่ดีมาก รูปแบบของคำตอบนี้มีประโยชน์จากศูนย์ดิน
เจอโรม

ใช้งานได้เมื่อคุณเพิ่มไฟล์ใหม่ไปยังที่เก็บข้อมูล แต่ฉันต้องเปลี่ยนไฟล์ที่มีอยู่แล้วในที่เก็บข้อมูลเพื่อให้เป็นสาธารณะ
Radenko Zec

137

หากคุณต้องการทำให้วัตถุทั้งหมดเป็นสาธารณะโดยค่าเริ่มต้นวิธีที่ง่ายที่สุดคือการใช้ถังนโยบายแทนการกำหนดรายการควบคุมการเข้าถึง (ACLs) ที่กำหนดไว้ในแต่ละวัตถุ

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถใช้เครื่องมือสร้างนโยบาย AWSเพื่อสร้างนโยบายฝากข้อมูลสำหรับที่เก็บข้อมูลของคุณ

ตัวอย่างเช่นนโยบายต่อไปนี้จะอนุญาตให้ทุกคนอ่านทุกวัตถุในที่เก็บข้อมูล 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เป็นเพียง ID นโยบายที่เป็นทางเลือกและSidเป็นid ของตัวเลือกที่ไม่ซ้ำกัน

สำหรับ S3 Bucket Policies Resource ARNs ใช้แบบฟอร์ม:

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

ตัวอย่างข้างต้นอนุญาตให้ ( Effect: Allow) ใครก็ได้ ( Principal: *) เข้าถึง ( Action: s3:GetObject) วัตถุใด ๆ ในที่เก็บข้อมูล ( Resource: arn:aws:s3:::<bucket-name>/*)


แผงควบคุมไม่มีทางใช่หรือไม่
ianaz

2
@ianaz คุณสามารถเพิ่มนโยบายที่ฝากข้อมูลนี้ลงในที่ฝากข้อมูลผ่านคอนโซล AWS (แผงควบคุม)
dcro

@ianaz ดูคำตอบของฉันด้านล่าง
jaxxbo

นอกจากนี้โปรดทราบว่ามีลิงก์ "นโยบายตัวอย่าง" ในลิงก์ด้านบนที่ให้ข้อมูลที่จำเป็นในการตัดและวางลงในตัวสร้างนโยบาย เนื่องจาก aws อัปเดต API นี่จึงมีแนวโน้มที่จะถูกต้องมากกว่า ทำงานเหมือนมีเสน่ห์สำหรับฉันเมื่อเช้านี้
keithpjolley

Principal: *ช่วยฉันมาก ขอบคุณ!
iedmrc

2

ปัญหาของฉันแตกต่างกันเล็กน้อย แต่เนื่องจากคำถามนี้อยู่ด้านบนของการค้นหาของ Google ฉันจะออกจากการแก้ปัญหาของฉันบางทีมันอาจจะช่วยใครซักคน

ฉันมีสิทธิ์เข้าถึง S3 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/*"
        }
    ]
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.