Во-первых, вам нужно создать функцию, которая изменяет размер изображения, и развернуть ее на AWS Lambda.
- Создайте новый проект Laravel или используйте существующий.
- Установите пакет
aws/aws-sdk-php
с помощью Composer:
composer require aws/aws-sdk-php
- Создайте новую функцию Lambda, определив новый файл PHP, который будет содержать код вашей функции. Например, создайте файл с именем
ResizeImageFunction.php
в каталогеapp/LambdaFunctions
. - Определите функцию
resizeImage
внутриResizeImageFunction.php
. Эта функция будет отвечать за изменение размера изображения и возврат измененного изображения в виде двоичной строки. Вот пример реализации, использующей библиотекуIntervention\Image
:
<?php namespace App\LambdaFunctions; use Intervention\Image\ImageManagerStatic as Image; class ResizeImageFunction { public function __invoke(array $event): array { $s3BucketName = $event['s3BucketName']; $s3Key = $event['s3Key']; $newWidth = $event['newWidth']; $imageContent = file_get_contents("s3://$s3BucketName/$s3Key"); $image = Image::make($imageContent); $image->resize($newWidth, null, function ($constraint) { $constraint->aspectRatio(); }); return [ 'statusCode' => 200, 'headers' => [ 'Content-Type' => 'image/jpeg', ], 'body' => $image->stream(null, 90)->getContents(), 'isBase64Encoded' => true, ]; } }
- Создайте новый слой AWS Lambda, включающий библиотеку
Intervention\Image
. Это позволит вашей лямбда-функции использовать библиотеку без необходимости включать ее в пакет функций. Вы можете создать новый слой с помощью Консоли управления AWS или интерфейса командной строки AWS. Обязательно включите каталогvendor
в слой. - Создайте новую роль IAM с необходимыми разрешениями для доступа к корзине S3 и вызову функции Lambda.
- Используйте Консоль управления AWS или интерфейс командной строки AWS, чтобы создать новую функцию Lambda, используя файл
ResizeImageFunction.php
в качестве кода функции. - Протестируйте свою функцию Lambda, вызвав ее с тестовым событием, которое включает имя корзины S3, ключ S3 исходного изображения и желаемую новую ширину.
- После того, как вы протестировали свою функцию и она работает должным образом, вы можете интегрировать ее в свое приложение Laravel, используя пакет
aws/aws-sdk-php
для вызова функции из кода Laravel. Посмотрите пример кода, как это сделать.
Вот пример фрагмента кода, который демонстрирует, как изменить размер изображения с помощью функции AWS Lambda и сохранить его в S3 с помощью Laravel:
use Aws\Lambda\LambdaClient; use Aws\S3\S3Client; use Illuminate\Http\Request; function resizeImage(Request $request) { $imageSize = $request->input('imageSize'); $lambda = new LambdaClient([ 'version' => 'latest', 'region' => 'us-east-1', ]); $s3 = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1', ]); $result = $lambda->invoke([ 'FunctionName' => 'resizeImageFunction', 'Payload' => json_encode([ 's3BucketName' => 'your-bucket-name', 's3Key' => 'your-original-image-key.jpg', 'newWidth' => $imageSize, ]), ]); $newImageKey = 'resized-image-' . $imageSize . '.jpg'; $s3->putObject([ 'Bucket' => 'your-bucket-name', 'Key' => $newImageKey, 'Body' => $result['Payload'], ]); return response()->json(['message' => 'Image resized and stored in S3']); }
В этом коде мы сначала создаем экземпляры клиентов Lambda и S3, используя AWS SDK для PHP. Затем мы используем клиент Lambda для вызова функции resizeImageFunction, которую мы ранее создали и развернули в AWS Lambda.
Полезная нагрузка, отправляемая в функцию Lambda, содержит имя корзины S3, ключ исходного изображения и желаемую новую ширину изображения. Функция Lambda считывает исходное изображение из S3, изменяет его размер до нужной ширины и возвращает изображение с измененным размером в виде двоичной строки.
После выполнения функции Lambda мы используем клиент S3 для сохранения изображения с измененным размером в том же сегменте с новым ключом, который включает в имя файла желаемый размер изображения. Наконец, мы возвращаем ответ JSON, указывающий, что изображение было изменено и сохранено в S3.
Обратите внимание, что вам потребуется настроить функцию AWS Lambda, которая может изменять размер изображений, а также настроить роль IAM с разрешениями на доступ к корзине S3 и вызов функции Lambda. Вам также необходимо настроить приложение Laravel с учетными данными и регионом AWS.