Чтение / запись образа S3 из веб-приложения Beanstalk / EC2 - PullRequest
0 голосов
/ 29 июня 2018

У меня есть веб-приложение (PHP под управлением Elastic Beanstalk на экземпляре Linux EC2), которое позволяет пользователю загружать изображения.

Меня беспокоит то, что если я загружу свой код, мне сначала нужно будет загрузить все изображения, а затем повторно загрузить их с моим новым кодом, если они останутся на EC2. Таким образом, очевидное решение, кажется, состоит в том, чтобы переместить каталог изображений на S3.

Подходы, которые я нашел до сих пор, - это подключенный диск или SDK. Я обнаружил, что для обоих подходов Elastic Beanstalk работает в дисководе с защитой от записи, что не позволяет мне получить доступ к другим подходам.

Например, для смонтированного диска я не могу набрать достаточно каталогов для доступа к смонтированному диску. Beanstalk работает в / var / app / current /, а смонтированный диск находится в / var / s3- {имя монтирования в ведро}. Если я пытаюсь получить к нему доступ (../../s3-ndombucket mount name}), он ищет его в той же папке, что и мое приложение.

Когда я следовал инструкциям для SDK, я установил его в ec2-user. Так что он находится в /home/ec2-user/vendor/autoload.php и, как и раньше, я не могу получить доступ и к этой папке (даже из оператора require)!

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

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Похоже, это сработало, и мне это нравится намного лучше, чем другие решения:

Я использую политику разрешений корзины, разрешающую доступ только к определенному URL, как найдено: https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-4

Это позволяет мне ограничить доступ к моим изображениям (по крайней мере, насколько я мог попытаться), за исключением тех, которые приходят с моего веб-хостинга. Я все еще буду использовать API для записи файлов, и если по какой-то причине я нахожу, мне нужно перечислить каталог.

Что касается моей части о включении файла composer.json, я начал загружать его, вместо того чтобы пытаться ссылаться на файл autoload.php из моего кода. И использовал DIR для путей включения. Обе эти вещи были критически важными, о которых я бы не подумал без помощи Кристиана.

0 голосов
/ 01 июля 2018

Я не совсем уверен, что понимаю, что вы имеете в виду, когда понимаете, что он находится в той же папке, что и ваше приложение, но вот мой подход к чтению / записи файла S3 из веб-приложения на основе PHP:

1) Создайте новый контейнер для вашего приложения. Это ведро может быть отделено от ведра, которое управляет вашим проектом Elastic Beanstalk.

2) В вашей корзине перейдите в раздел permissions-> bucket policy и добавьте эту политику, чтобы сделать ваши изображения общедоступными. Важное замечание: Замените BUCKET_NAME на фактическое имя вашего сегмента

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

Источник

3) Создайте файл composer.json с помощью Amazon SDK и замените его любой версией. Поместите composer.json в корень папки вашего проекта. (Когда вы загружаете свой код проекта, Elastic Beanstalk делает свое волшебство за вас и устанавливает все пакеты композитора).

{
    "require": {
        "aws/aws-sdk-php": "3.27.1",
    }
}

4) Включите это в начало файла PHP, который обрабатывает загрузку файла.

require __DIR__ . '/vendor/autoload.php';
use Aws\S3\S3Client;

5) Создайте объект S3Client с помощью AWS PHP SDK. Замените YOUR_KEY, YOUR_SECRET и YOUR_BUCKET_REGION на правильные значения. Снова добавьте это в тот же файл.

$client = S3Client::factory(
     [
         'credentials' =>
          [
                 'key'    => 'YOUR_KEY',
                 'secret' => 'YOUR_SECRET'
             ],
          'region' => 'YOUR_BUCKET_REGION',
          'version' => 'latest'
         ]
);

6) Теперь, наконец, после всей этой забавной настройки, вот как вы можете поместить объект изображения в S3, когда пользователь загружает файл. Замените BUCKET_NAME точным именем вашего сегмента, FILE_NAME.JPG - именем файла назначения на S3, а PATH / TO / TEMP_FILE.JPG - временным путем, в котором изображение хранится на вашем сервере Elastic Beanstalk.

$client->putObject([
                    'Bucket' => 'BUCKET_NAME',
                    'Key' => 'FILE_NAME.JPG',
                    'Body' => fopen('PATH/TO/TEMP_FILE.JPG', 'rb'),
                    'ACL' => 'public-read'
                   ]);

7) Хорошо, так что обрабатывает запись в файл. Теперь, когда вы хотите показать пользователю загруженный файл, вы можете сделать это с помощью обычного тега. Снова, заменяя все заглавные поля их правильными значениями:

<img src="https://s3-YOUR_BUCKET_REGION.amazonaws.com/BUCKET_NAME/FILE_NAME.JPG" alt="My S3 image"> 

8) Теперь у вас должно быть веб-приложение с возможностью записи / чтения изображений в Amazon S3.

...