Маршрутизация в лямбда-функции без API-шлюза - PullRequest
1 голос
/ 10 июля 2019

У меня есть экспресс-приложение, которое развернуто через сервер. Мой стек - просто лямбда-функция + API-шлюз. Это работает, и это доступно на Почтальоне или httpxmlrequest. Но если я возьму часть API-шлюза из стека, можно ли по-прежнему вызывать эту лямбда-функцию с помощью AWS SDK / cli, каким-то образом выполнять маршрутизацию, передавая path (eg: /books) и method (eg: POST) вместе с полезной нагрузкой?

Я новичок в экосистеме AWS ... только начал использовать безсерверный + узел.

Скажем, у меня есть простое приложение-экспресс, например:

const serverless = require('serverless-http');
const express = require('express');
const bodyParser = require('body-parser');

const helpersRoute = require('./routes');
const booksRoute = require('./routes/books');

const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use('/', helpersRoute);
app.use('/books', booksRoute);

module.exports.handler = serverless(app);

А это мой бессерверный конфиг:

service: service-test

provider:
  name: aws
  runtime: nodejs8.10
  stage: dev

functions:
  app:
    handler: index.handler

1 Ответ

1 голос
/ 10 июля 2019

Да, это возможно с помощью Lambda SDK.Поскольку вы выполняете свою функцию за экспресс-сервером, вам нужно будет передать событие, которое выглядит точно так же, как и API-шлюз, поэтому с точки зрения вызванной Lambda это будет просто вызов API-шлюза.

Выможете проверить docs , чтобы увидеть, как выглядит событие API Gateway, но, по сути, вам нужны только path и body (в случае POST, PUT, PATCH) запросов.Если вам нужны параметры запроса и т. Д., Вы также можете передать их.

Убедитесь, что для InvocationType установлено значение RequestResponse

Вот пример в Node.js:

const lambda = new AWS.Lambda();

await lambda
    .invoke({
      FunctionName: 'FunctionName',
      InvocationType: 'RequestResponse',
      Payload: JSON.stringify({
        path: '/your_path',
      }),
    })
    .promise();

РЕДАКТИРОВАНИЕ: У OP возникли проблемы с тем, как данные поступают из заданной функции Lambda в функцию Lambda на основе Express, поэтому я решил добавить свою собственную конфигурацию для сравнения:

const serverless = require('serverless-http');
const express = require('express');
const cors = require('cors');

const app = express();
const bodyParser = require('body-parser');
const routes = require('./routes');

app.use(cors());

app.use(bodyParser.json({ strict: false }));

app.use('/api', routes);

module.exports.handler = serverless(app);

Пример метода контроллера:

const fetchOne = async (req, res) =>
  res
    .status(200)
    .json(await MyService.doSomething(req.body.someField));
...