Я пытаюсь разместить приложение laravel на aws lambda и назвать его маршруты с помощью шлюза aws api. Приложение представляет собой веб-сканер, который выбирает веб-страницы из RSS-каналов.
Когда я выполняю вызов на маршрут laravel, используя URL-адрес, сгенерированный шлюзом API, laravel перенаправляет запрос на путь «/ home». Тем не менее, когда я тестирую его на экземпляре ec2 с помощью «узла отладки», он работает как шарм. Ниже приведены подробности шагов, которые я выполнил.
Я следил за фантастическим блогом, написанным Крис Уайт для размещения приложения Laravel на AWS лямбда.
шаги:
Генерация 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
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
});
});
}
Я ничего не знаю о Laravel, но вы настроили маршрут для espnheadlinesimage/....
но вы на самом деле звоните по маршруту HelloLambda/espnheadlinesimage/{league}/{channel}
через API GW. Значение requestUri
(а также event.path
) в лямбда-функции будет HelloLambda/espnheadlinesimage/nhl/28
в вашем тестовом вызове API.
Эта проблема решена в соответствии с предложением Джек.
Проблема заключалась в том, что URL-адрес API, создаваемый API-шлюзом, был
/ HelloLambda / espnheadlinesimage / {лига} / {канал}
Однако маршрут в моем файле маршрутов Laravel был
/ Espnheadlinesimage / {лига} / {канал}
Мое заблуждение состояло в том, что базовый URL-адрес для лямбда-функции
https: //***.execute-api.us-east-1.amazonaws.com/prod/HelloLambda/
и я должен добавить маршрут после этого пути в мой файл маршрутов laravel, т.е.
/ Espnheadlinesimage / {лига} / {канал}
Тем не менее, путь в моем файле маршрута должен включать ‘/ HelloLambda’, т.е.
/ HelloLambda / espnheadlinesimage / {лига} / {канал}