Làm cách nào để đặt tất cả các Đối tượng trong nhóm AWS S3 theo mặc định?


151

Tôi đang sử dụng thư viện PHP để tải tệp lên nhóm của mình. Tôi đã đặt ACL thành công khai-đọc-ghi và nó hoạt động tốt nhưng tệp vẫn ở chế độ riêng tư.

Tôi thấy rằng nếu tôi thay đổi Grantee thành Mọi người, nó sẽ khiến tập tin được công khai. Điều tôi muốn biết là làm cách nào để Grantee mặc định trên tất cả các đối tượng trong nhóm của tôi được đặt thành "Mọi người" . Hoặc có một giải pháp khác để làm cho các tập tin công khai theo mặc định?

Mã tôi đang sử dụng là dưới đây:

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;
}

Câu trả lời:


299

Truy cập http://awspolicygen.s3.amazonaws.com/policygen.html Điền vào các chi tiết như:nhập mô tả hình ảnh ở đây Trong hành động chọn "GetObject" Chọn "Thêm tuyên bố" Sau đó chọn "Tạo chính sách"

Sao chép ví dụ văn bản:

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

Bây giờ, hãy chuyển đến bảng điều khiển AWS S3 của bạn, Ở cấp độ nhóm, nhấp vào Thuộc tính, Mở rộng Quyền, sau đó Chọn Thêm chính sách nhóm. Dán mã được tạo ở trên vào trình chỉnh sửa và nhấn lưu.

Tất cả các mục của bạn trong xô sẽ được công khai theo mặc định.


8
Đây là phản ứng chính xác. Không giống như câu trả lời trước đây, bài đăng này cũng dạy tôi cách tạo ra các chính sách và những gì họ làm. Sau khi đọc xong tôi có thể viết một chính sách bằng tay.
Jason Cheladyn

2
Tôi đã đưa ra câu trả lời này với cùng lý do như @liyicky, các hướng dẫn chi tiết là một lời giới thiệu hay thay vì chỉ đưa ra câu trả lời.
brendo

Tương tự ở đây. AWS có xu hướng mờ đục đôi khi và có lẽ vì lý do rất tốt. Hình thức trả lời này là hữu ích từ mặt đất bằng không.
Jerome

Điều này hoạt động khi bạn thêm các tệp mới vào nhóm nhưng tôi cần thay đổi các tệp đã tồn tại trong nhóm để công khai.
Radenko Zec

137

Nếu bạn muốn làm cho tất cả các đối tượng được công khai theo mặc định, cách đơn giản nhất là thực hiện theo Chính sách nhóm thay vì Danh sách điều khiển truy cập (ACL) được xác định trên từng đối tượng riêng lẻ.

nhập mô tả hình ảnh ở đây

Bạn có thể sử dụng Trình tạo chính sách AWS tạo để tạo chính sách nhóm cho nhóm của mình.

Ví dụ: chính sách sau đây sẽ cho phép mọi người đọc mọi đối tượng trong nhóm S3 của bạn (chỉ cần thay thế <bucket-name>bằng tên của nhóm của bạn):

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

Chính sách nhóm chứa danh sách Statementsvà mỗi câu lệnh có một Effect(hoặc Allowhoặc Deny) cho danh sách Actionsđược thực hiện bởi Principal(người dùng) trên chỉ định Resource(được xác định bởi một Amazon Resource Namehoặc ARN).

Đây Idchỉ là một id chính sách tùy chọn và Sidlà một id câu lệnh duy nhất tùy chọn.

Đối với Chính sách nhóm S3, ARN tài nguyên có dạng:

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

Ví dụ trên cho phép ( Effect: Allow) bất cứ ai ( Principal: *) truy cập ( Action: s3:GetObject) bất kỳ đối tượng nào trong nhóm ( Resource: arn:aws:s3:::<bucket-name>/*).


Có cách nào với bảng điều khiển không?
ianaz

2
@ianaz Bạn có thể thêm chính sách nhóm này vào nhóm qua bảng điều khiển AWS (bảng điều khiển)
dcro

@ianaz xem câu trả lời của tôi dưới đây.
jaxxbo

Cũng lưu ý rằng có một liên kết "chính sách mẫu" trong liên kết trên cung cấp thông tin chính xác cần thiết để cắt và dán vào trình tạo chính sách. Khi aws cập nhật API, điều này có nhiều khả năng giữ đúng. Làm việc như một cơ duyên cho tôi sáng nay.
keithpjcar

Principal: *đã giúp tôi rất nhiều Cảm ơn!
iedmrc

2

Vấn đề của tôi hơi khác một chút, nhưng vì câu hỏi này nằm trong top tìm kiếm của google nên tôi sẽ rời khỏi giải pháp của mình, có lẽ nó sẽ giúp được ai đó.

Tôi đã có quyền truy cập đầy đủ vào nhóm S3 trước đây, nhưng một ngày, nó mới bắt đầu quay trở lại Access Deniedtất cả các tệp của tôi. Giải pháp rất đơn giản.

  1. Đi đến Services-S3
  2. Nhấp vào nhóm S3 của bạn
  3. Chuyển sang Permissionstab, sau đó chuyển đến Bucket Policytab
  4. Và nhấp vào Savenút.

Nó sẽ gán lại quyền cho tất cả các tập tin của bạn.

nhập mô tả hình ảnh ở đây

Dù sao, đây là đầy đủ bucket policycho phép làm cho tất cả các đối tượng công khai

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::enter-here-your-media-bucket-name/*"
        }
    ]
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.