Лямбда-функция AWS возвращает HTTP 403 при отправке файла через POST - PullRequest
1 голос
/ 10 мая 2019

Я перевожу маленькое приложение узла / экспресс-функции в лямбда-функции, используя сервер.

Мое приложение действительно простое. Нет аутентификации. Всего 1 конечная точка, позволяющая получить и отправить. Проблема в том, что GET работает, но я получаю ошибку HTTP 403 при отправке запроса POST при отправке двоичного файла (файл docx)

var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(express.static(path.join(__dirname, 'public')));


/* GET home page. */
app.get('/', function (req, res, next) {
    res.render('index', {title: 'Whatever'});
});

/* POST receive file */
app.post('/', function (req, res, next) {
    // Simplified to the minimum
    return res.json({'msg': 'ok'});   
});

module.exports.handler = serverless(app);

Мой файл serverless.yml выглядит так

service: my_service

provider:
  name: aws
  runtime: nodejs8.10
  stage: dev
  region: eu-west-3

functions:
  app:
    handler: app.handler
    events:
      - http: GET /
      - http: 'ANY {proxy+}'
  post:
    handler: app.handler
    events:
      - http:
          path: /
          method: post
          cors: true

После запуска sls deploy создается Amazon API Gateway и функция развертывается, но не может использовать POST для отправки двоичных файлов в мое приложение.

Вероятно, это проблема API Gateway, но не удалось ее исправить.

EDIT

Первый ответ правильный, с небольшим изменением в файле serverless.yml. Это правильный:

service: my-service

provider:
  name: aws
  runtime: nodejs8.10
  stage: dev
  region: eu-west-3

functions:
  app:
    handler: app.handler
    events:
      - http: GET /
      - http: POST /
      - http: 'ANY {proxy+}'

1 Ответ

1 голос
/ 10 мая 2019

Я думаю, что вы перепутали несколько понятий:

  • У вас есть только одна функция.Я не уверен, почему вы определяете два в вашем serverless.yml файле
  • У вас есть много методов в ОДНОЙ функции, потому что вы делегируете все, что выражать для обработки.
  • Если вы хотите иметь несколько функций, каждая из которых сопоставлена ​​с другим методом HTTP, вам не нужно использовать Express
  • Вы объявляете PROXY, ANY, GET и POST, все в/ (Хотя я не уверен, я думаю, что это корень вашей проблемы, поскольку API Gateway теряется на маршрутах).Вам это не нужно, если вы используете Express, поскольку все, что вам нужно, это прокси-сервер для каждого отдельного вызова.

С учетом всего вышесказанного вам следует соответствующим образом изменить файл serverless.yml:

service: my-service

provider:
  name: aws
  runtime: nodejs8.10
  stage: dev
  region: eu-west-3

functions:
  app:
    handler: app.handler
    events:
      - http: ANY /
      - http: 'ANY {proxy+}'

Я немного изменил ваш файл app.js, но это было только для того, чтобы сделать его немного более понятным для меня, но вы всегда можете использовать его для сравнения с вашим:

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

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

/* GET home page. */
app.get('/', function (req, res, next) {
    res.json({title: 'Whatever'});
});

/* POST receive file */
app.post('/', function (req, res, next) {
    // Simplified to the minimum
    return res.json({'msg': 'ok'});   
});

module.exports.handler = serverless(app);

Если вы сейчас развернете с помощью sls deploy, вы сможете успешно выполнить оба метода.

Я запустил оба примера для вас.

При выдаче GET вы получите:

enter image description here

И выдача POST приводит к:

enter image description here

, который является именно тем, что вы естьожидая.

...