Вызов маршрутов Laravel, размещенных на AWS Lambda, с использованием AWS API Gateway

Я пытаюсь разместить приложение laravel на aws lambda и назвать его маршруты с помощью шлюза aws api. Приложение представляет собой веб-сканер, который выбирает веб-страницы из RSS-каналов.

Когда я выполняю вызов на маршрут laravel, используя URL-адрес, сгенерированный шлюзом API, laravel перенаправляет запрос на путь «/ home». Тем не менее, когда я тестирую его на экземпляре ec2 с помощью «узла отладки», он работает как шарм. Ниже приведены подробности шагов, которые я выполнил.

Я следил за фантастическим блогом, написанным Крис Уайт для размещения приложения Laravel на AWS лямбда.

шаги:

  1. Генерация PHP CGI Binary

    Я использовал экземпляр am2 «amzn-ami-hvm-2016.03.3.x86_64-gp2» для создания моего двоичного файла php-cgi

./ configure —prefix = / tmp / php-7.0.11 / compiled / —without-pear
—enable-shared = нет —enable-static = да —enable-phar —enable-json —disable-all —with-openssl —with-curl —enable-libxml —enable-simplexml — -enable-xml —with-mhash —with-gd —enable-exif —with-freetype-dir —enable-mbstring —enable-сокеты —enable-pdo —with-pdo-mysql — enable-tokenizer —enable-session —enable-filter

  1. Лямбда-функция NodeJS для запуска процесса PHP CGI — php.js файл
process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'];

var parser = require('http-string-parser');
var spawn = require('child_process').spawn;
exports.handler = function(event, context) {

var requestMethod = event.httpMethod || 'GET';
var serverName = event.headers ? event.headers.Host : '';
var requestUri = event.path || '';
var headers = {};

if (event.headers) {
Object.keys(event.headers).map(function(key) {
headers['HTTP_' + key.toUpperCase()] = event.headers[key];
});
}

var request_env = Object.assign({
REDIRECT_STATUS: 1,
REQUEST_METHOD: requestMethod,
SCRIPT_FILENAME: 'api/public/index.php',
SCRIPT_NAME: '/index.php',
PATH_INFO: '/',
SERVER_NAME: serverName,
SERVER_PROTOCOL: 'HTTP/1.1',
REQUEST_URI: requestUri
}, headers);

var php = spawn('./php-cgi', ['api/public/index.php'], {
env: request_env
});

var response = '';

php.stdout.on('data', function(data) {
response += data.toString('utf-8');
});

php.stderr.on('data', function(data) {
console.log("STDERR: " + data.toString());
});

php.on('close', function(code) {

var parsedResponse = parser.parseResponse(response);
context.succeed({
isBase64Encoded: false,
statusCode: parsedResponse.statusCode || 200,
headers: parsedResponse.headers,
body: parsedResponse.body
});

});

}

0

Решение

Я ничего не знаю о Laravel, но вы настроили маршрут для espnheadlinesimage/.... но вы на самом деле звоните по маршруту HelloLambda/espnheadlinesimage/{league}/{channel} через API GW. Значение requestUri (а также event.path) в лямбда-функции будет HelloLambda/espnheadlinesimage/nhl/28 в вашем тестовом вызове API.

1

Другие решения

Эта проблема решена в соответствии с предложением Джек.

Проблема заключалась в том, что URL-адрес API, создаваемый API-шлюзом, был

/ HelloLambda / espnheadlinesimage / {лига} / {канал}

Однако маршрут в моем файле маршрутов Laravel был

/ Espnheadlinesimage / {лига} / {канал}

Мое заблуждение состояло в том, что базовый URL-адрес для лямбда-функции

https: //***.execute-api.us-east-1.amazonaws.com/prod/HelloLambda/

и я должен добавить маршрут после этого пути в мой файл маршрутов laravel, т.е.

/ Espnheadlinesimage / {лига} / {канал}

Тем не менее, путь в моем файле маршрута должен включать ‘/ HelloLambda’, т.е.

/ HelloLambda / espnheadlinesimage / {лига} / {канал}

1