Как сделать все объекты в корзине 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;
}
condo1234
источник

Ответы:

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. На уровне сегмента нажмите «Свойства», «Развернуть разрешения», затем выберите «Добавить политику сегмента». Вставьте сгенерированный выше код в редактор и нажмите «Сохранить».

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

jaxxbo
источник
8
Это правильный ответ. В отличие от предыдущего ответа, этот пост также научил меня, как создавать политики и что они делают. Прочитав это, я могу написать политику вручную.
Джейсон Челадин
2
Я проголосовал за этот ответ по той же причине, что и @liyicky, подробные инструкции были хорошим введением, а не просто получили ответ.
Брендо
Тоже самое. AWS иногда бывает непрозрачным и, вероятно, по очень веской причине. Эта форма ответа полезна с нуля.
Джером
Это работает, когда вы добавляете новые файлы в корзину, но мне нужно изменить файлы, уже существующие в корзине, чтобы быть публичными.
Раденко Зец
137

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

Для S3 Bucket Policies ресурсные ARN принимают форму:

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

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

dcro
источник
Есть ли способ с панелью управления?
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/*"
        }
    ]
}
Сергей Попов
источник