Триггеры Amazon AWS Cognito Lambda не работают с простой функцией PHP BREF
Недавно я начал экспериментировать с использованием пакета bref (https://bref.sh/docs/) для использования PHP для функций Lambda на Amazon AWS. Я отлично могу использовать этот пакет для загрузки простой лямбда-функции, настолько простой, насколько это возможно:
<?php
require __DIR__.'/vendor/autoload.php';
lambda(function ($event) {
return $event;
});
Затем я беру эту лямбда-функцию и начинаю назначать ее триггерам Cognito. Он отлично работает с триггером предварительной регистрации, при создании новой учетной записи из панели администратора в Cognito никаких проблем не возникает.
Однако когда я беру тот же самый триггер и добавляю его к триггеру Cognito предварительной аутентификации, затем тестирую его с помощью простого локального приложения Symfony, которое действует как простой механизм аутентификации с использованием Cognito (разработано с использованием этого руководства: https://tech.mybuilder.com/managing-authentication-in-your-symfony-project-with-aws-cognito/), он сразу же возвращает ошибку:
Error executing "AdminInitiateAuth" on "https://cognito-idp.us-east-2.amazonaws.com"; AWS HTTP error: Client error: `POST https://cognito-idp.us-east-2.amazonaws.com` resulted in a `400 Bad Request` response:
{"__type":"InvalidLambdaResponseException","message":"Unrecognizable lambda output"}
InvalidLambdaResponseException (client): Unrecognizable lambda output - {"__type":"InvalidLambdaResponseException","message":"Unrecognizable lambda output"}
Когда я отключаю указанную выше лямбду, она сразу же начинает работать без ошибок, так что проблема не в моем приложении Symfony, а в какой-то лямбде (даже если она просто возвращает событие, которое ему задано, и работает для других триггеров, как указано выше).
Даже когда я заменяю это простой лямбдой, которая практически эквивалентна в Node, она работает нормально:
exports.handler = async (event) => {
return event;
};
Кто-нибудь знает, почему лямбда PHP, похоже, не работает с триггером предварительной аутентификации Cognito? Я бы предпочел сделать это на PHP, если это возможно.
2 ответа
Проблема в преобразовании $event в JSON. Лямбда для этих двух событий ожидает:
"response": {}
и брат возвращается
"response": []
Это недопустимый ответ для AWS. Так что взломать. Самый быстрый способ - установить
$event['response'] = ['property' => 'name']
чтобы заставить брафа вернуться:
"respose": {"property":"name"}
Для меня это сработало следующим образом:
public function handle($event, Context $context): mixed
{
...
//hack, because bref lambda trigger doesn't support 'response' key as an array
$event['response'] = (object) [];
return $event;
}