Это может включать слишком много специфических c технологий, чтобы кто-нибудь мог ответить, но я решил попробовать. Я готов ОЧЕНЬ МНОГО учебников и чувствую, что я НАСТОЛЬКО близок ... может быть, я упускаю только одну вещь.
Моя цель здесь состоит из нескольких частей, и насколько я знаю свою проблему на данный момент только с одной частью
- Возьмите простое приложение Symfony (оно использует версию 5) с одним контроллером, поместите его на Amazon AWS в качестве API Шлюз. Я сделал это с помощью bref (https://bref.sh/) и потребовал это в моем Symfony проекте. У меня есть файл serverless.yml, для которого я могу использовать команду развертывания без сервера, чтобы загрузить его как шлюз API в AWS. Он даже тестируется в браузере, без проблем.
- Возьмите этот API-шлюз и свяжите его с AWS лямбда-функцией, чтобы в конечном итоге использовать в качестве лямбда-функции для события, которое запускается при входе в систему. и др c. используя Amazon Cognito. Я добился этого с помощью учебных пособий, я вижу, как он связан со шлюзом API, когда я go в свою функцию Lambda, которая была загружена во время шага 1 с использованием bref.
- Возьмите эту лямбду и свяжите ее с Cognito. Лямбда-триггер для предварительной регистрации. Я сделал это, это очень простая настройка.
Теперь в одном файле PHP примеров того, как использовать bref с AWS, вы получите следующее:
require __DIR__.'/vendor/autoload.php';
lambda(function ($event) {
return $event;
});
Я загрузил это как другую лямбду (здесь ничего не общего с Symfony), установил, что это будет триггером события предварительной регистрации Cognito, и оно работает нормально. Он ничего не дает, но правильно передает информацию туда, где он не вызывает никаких ошибок.
Теперь, когда я пытаюсь сделать то же самое с приложением Symfony, у меня есть IndexController. php в моем каталоге src / Controller это выглядит так:
<?php
namespace App\Controller;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Aws\CloudWatchLogs\CloudWatchLogsClient;
use Maxbanton\Cwh\Handler\CloudWatch;
use Monolog\Logger;
use Monolog\Formatter\JsonFormatter;
class IndexController extends AbstractController
{
/**
* @Route("/", name="index")
*/
public function index(Request $request, LoggerInterface $logger)
{
$this->awsLogger($request);
return new JsonResponse(json_encode($request->query->all()));
}
private function awsLogger(Request $request)
{
/**
* This is only here for now because I couldn't get CloudWatch logging working any better way.
*/
$sdkParams = [
'region' => 'us-east-2',
'version' => 'latest',
'credentials' => [
'key' => 'AKIAIGFNOM3BKSE6HQ6A',
'secret' => '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',
]
];
// Instantiate AWS SDK CloudWatch Logs Client
$client = new CloudWatchLogsClient($sdkParams);
// Log group name, will be created if none
$groupName = 'lambda_symfony_test';
// Log stream name, will be created if none
$streamName = 'dev';
// Days to keep logs, 14 by default. Set to `null` to allow indefinite retention.
$retentionDays = 30;
// Instantiate handler (tags are optional)
$handler = new CloudWatch($client, $groupName, $streamName, $retentionDays, 10000, ['tag' => 'lambda']);
// Optionally set the JsonFormatter to be able to access your log messages in a structured way
$handler->setFormatter(new JsonFormatter());
// Create a log channel
$log = new Logger('channel');
// Set handler
$log->pushHandler($handler);
// Add records to the log
$log->debug(print_r($request->query->all(), true));
}
}
Я полностью понимаю, что это приведет к ошибке как лямбда, потому что JsonResponse - это не то, что Cognito ожидает увидеть назад. Однако я, по крайней мере, надеялся, что нажму на вызов регистратора, чтобы я мог видеть, как выглядит мой объект запроса, и я мог видеть то, с чем я работал, с точки зрения того, что Cognito передает в эту лямбду. Это поможет мне со временем выяснить, что мне нужно вернуть. И, насколько я знаю, я не могу просто использовать «лямбда-оболочку» вокруг метода контроллера, как это было сделано в простом примере, который я упоминал, у меня работал. Однако это даже не заходит так далеко, вместо этого в моих журналах CloudWatch появляется следующее:
21:34:58
Fatal error: Uncaught Exception: The lambda was not invoked via HTTP through API Gateway: this is not supported by this runtime in /var/task/vendor/bref/bref/src/Runtime/PhpFpm.php:120
Итак, мой вопрос: чего мне здесь не хватает? Этот API прекрасно работает через браузер, когда я просто передаю его как запрос GET. Чего мне не хватает в моих настройках? Вот мой файл serverless.yml для приложения Symfony:
service: lambda-test-symfony
provider:
name: aws
region: us-east-2
runtime: provided
environment:
# Symfony environment variables
APP_ENV: prod
plugins:
- ./vendor/bref/bref
package:
exclude:
- node_modules/**
- tests/**
functions:
lambdatest:
handler: public/index.php
layers:
- ${bref:layer.php-72-fpm}
events:
- http: 'ANY /'
- http: 'ANY /{proxy+}'
Вот также некоторые скриншоты из моих конфигураций Lambda на AWS:
https://i.stack.imgur.com/TDMZj.png
https://i.stack.imgur.com/ciehT.png
А вот некоторые из настроек шлюза API:
https://i.stack.imgur.com/RL7D9.png
https://i.stack.imgur.com/LPcsh.png
https://i.stack.imgur.com/RVNwN.png
https://i.stack.imgur.com/4bs0u.png
Я все еще новичок во всем, что касается AWS / без сервера, поэтому я мог упустить что-то действительно очевидное здесь. Я не уверен на 100%, связана ли проблема с моим кодом или моей конфигурацией. Любая помощь будет оценена!