Подтвердить что ты не робот

Как сделать все объекты в объявлении AWS S3 общедоступными по умолчанию?

Я использую библиотеку PHP для загрузки файла в свой ковш. Я установил ACL в public-read-write, и он отлично работает, но файл по-прежнему остается конфиденциальным.

Я обнаружил, что если я изменил Грантополучатель на всех, он сделает файл общедоступным. Я хочу знать, как мне сделать Grantee по умолчанию для всех объектов в моем ковше для установки "Все" . Или есть другое решение для сделать файлы общедоступными по умолчанию?

Код, который я использую, приведен ниже:

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

Ответ 1

Перейдите в http://awspolicygen.s3.amazonaws.com/policygen.html Заполните данные, такие как: enter image description here В действии выберите "GetObject" Выберите "Добавить выражение" Затем выберите "Создать политику"

Скопируйте пример текста:

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

Теперь перейдите на консоль AWS S3. На уровне ковша нажмите "Свойства", "Расширить разрешения", затем выберите "Добавить политику корзины". Вставьте указанный выше сгенерированный код в редактор и нажмите "Сохранить".

Все ваши элементы в ведре будут общедоступными по умолчанию.

Ответ 2

Если вы хотите, чтобы все объекты были общедоступными по умолчанию, самый простой способ - сделать это с помощью Bucket Policy вместо списков контроля доступа ( ACL), определенные на каждом отдельном объекте.

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

Вы можете использовать AWS Policy Generator для создания политики ведра для вашего ведра.

Например, следующая политика позволит каждому прочитать каждый объект в вашем ведре 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 - необязательный уникальный идентификатор оператора.

Для политик Buck S3, ARN-ресурсы ресурса принимают форму:

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

Вышеприведенный пример позволяет (Effect: Allow) любому (Principal: *) получить доступ (Action: s3:GetObject) к любому объекту в ведре (Resource: arn:aws:s3:::<bucket-name>/*).