Получение простого Symfony 5 приложения на Amazon AWS в качестве шлюза API / лямбда для Amazon Cognito - PullRequest
0 голосов
/ 25 января 2020

Это может включать слишком много специфических 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%, связана ли проблема с моим кодом или моей конфигурацией. Любая помощь будет оценена!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...