Настройка разрешений для корзины AWS S3

У меня есть ведро s3 (например, mybucket), для которого в настоящее время установлены следующие разрешения:

Block all public access
On
 |
 |_Block public access to buckets and objects granted through new access control lists (ACLs)
 | On
 |
 |_Block public access to buckets and objects granted through any access control lists (ACLs)
 | On
 |
 |_Block public access to buckets and objects granted through new public bucket or access point policies
 | On
 |
 |_Block public and cross-account access to buckets and objects through any public bucket or access point policies
   On

Внутри этого ведра есть две папки:

 images  (e.g. https://mybucket.s3.us-west-2.amazonaws.com/images/puppy.jpg)
 private (e.g. https://mybucket.s3.us-west-2.amazonaws.com/private/mydoc.doc)

Я хочу, чтобы папка изображений была общедоступной, чтобы я мог отображать изображения на моем сайте

Я хочу, чтобы личная папка была ограничена и могла быть доступна только с использованием учетной записи IAM программно

Как мне установить эти разрешения? Я попытался отключить указанные выше разрешения, я также щелкнул изображения и действия под заголовком, щелкнул «сделать общедоступным». Затем я пытаюсь загрузить следующее:

   $image = Image::make($file->getRealPath())->resize(360, 180);
   Storage::disk('s3')->put($filePath, $image->stream());

Файл загружается, но когда я пытаюсь отобразить изображение следующим образом, я получаю ошибку 403:

   <img src="{{ Storage::disk('s3')->url($file->path) }}" /> 

А для загрузки личных документов у меня есть следующее:

    $response =  [
        'Content-Type' => $file->mime_type,
        'Content-Length' => $file->size,
        'Content-Description' => 'File Transfer',
        'Content-Disposition' => "attachment; filename={$file->name}",
        'Content-Transfer-Encoding' => 'binary',
    ];


    return Response::make(Storage::disk('s3')->get($file->path), 200, $response);

Как правильно настроить эти разрешения?

Прежде чем кто-нибудь начнет кричать, что я новичок в хранилище S3, пожалуйста, потерпите меня.

Любая помощь и руководство будут оценены.


person adam78    schedule 24.01.2020    source источник


Ответы (1)


Amazon S3 Block Public Access - это конфигурация на уровне корзины, которая не позволит вам сделать какие-либо объекты в этой корзине общедоступными. Итак, если вы хотите сделать один или несколько объектов общедоступными, например images/*, то вам нужно отключить S3 Заблокируйте общий доступ для этого сегмента.

Само по себе это, конечно, не сделает ни один из ваших объектов общедоступным. По умолчанию сегменты S3 являются частными. Чтобы сделать объекты в images/ общедоступными, вам необходимо настроить политику корзины S3, например:

{
  "Id": "id101",
  "Statement": [
    {
      "Sid": "publicimages",
      "Action": "s3:GetObject",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::mybucket/images/*",
      "Principal": "*"
    }
  ]
}
person jarmod    schedule 24.01.2020
comment
Спасибо за это. Кажется, это работает. Как защитить личную папку с помощью политики, доступ к которой имеют только пользователь IAM и пользователь учетной записи. Нужен ли он мне, раз уж вы упомянули, что публичный доступ к ведру не делает ни одного объекта общедоступным? - person adam78; 24.01.2020
comment
Эта политика корзины разрешает неаутентифицированный (т. Е. Общедоступный) доступ к images/* и ни к чему другому. Независимо, если у вас есть пользователи IAM с разрешениями, которые охватывают этот сегмент (например, s3: * для всех сегментов), то они могут получить доступ к сегменту, независимо от этой политики сегмента. - person jarmod; 24.01.2020