Як зробити за умовчанням усі об'єкти у відрі 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

Якщо ви хочете зробити всі об'єкти загальнодоступними за замовчуванням, найпростіший спосіб - це зробити через політику Bucket замість списків контролю доступу (ACL), визначених для кожного окремого об'єкта.

введіть тут опис зображення

Ви можете використовувати генератор політики AWS для створення політики для відра.

Наприклад, наведена нижче політика дозволить будь-кому прочитати кожен об’єкт у вашому відрі S3 (просто замініть <bucket-name>його ім'ям):

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

Політика Bucket містить перелік, 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:GetObject) до будь-якого об'єкта у відрі ( Resource: arn:aws:s3:::<bucket-name>/*).


Чи немає способу за допомогою панелі управління?
ianaz

2
@ianaz Цю політику щодо відра можна додати у відро через консоль AWS (панель управління)
dcro

@ianaz дивіться мою відповідь нижче.
jaxxbo

Також зауважте, що у вищенаведеному посиланні є посилання "приклад політики", яке дає точну інформацію, необхідну для вирізання та вставки в генератор політики. Що стосується Aws-оновлень API, це швидше залишається правильним. Сьогодні вранці спрацювало як шарм.
keithpjolley

Principal: *мені дуже допомогли. Дякую!
iedmrc

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.