AWS Lambda函数在通过POST发送文件时返回HTTP 403。

13 浏览
0 Comments

AWS Lambda函数在通过POST发送文件时返回HTTP 403。

我正在使用serverless将一个小的node/express应用迁移到lambda函数。我的应用非常简单,没有认证。只有一个端点,允许GET和POST请求。问题是GET请求可以正常工作,但是当我发送一个二进制文件(docx文件)的POST请求时,我收到HTTP错误403。

var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(express.static(path.join(__dirname, 'public')));
/* GET首页 */
app.get('/', function (req, res, next) {
    res.render('index', {title: '无论如何'});
});
/* POST接收文件 */
app.post('/', function (req, res, next) {
    // 简化到最小
    return res.json({'msg': 'ok'});   
});
module.exports.handler = serverless(app);

我的serverless.yml文件如下:

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的问题,但我无法解决它。

编辑:

第一个回答是正确的,只需在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+}'

0
0 Comments

AWS Lambda函数在通过POST发送文件时返回HTTP 403的问题的原因是以下几点:

- serverless.yml文件中定义了两个函数,但实际上只有一个函数。

- 使用Express处理所有请求,所以在一个函数下有多个方法。

- 在serverless.yml文件中将PROXY、ANY、GET和POST都映射到了根路径"/",这导致API Gateway在路由中迷失了方向。

为了解决这个问题,需要对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 }));
app.get('/', function (req, res, next) {
    res.json({title: 'Whatever'});
});
app.post('/', function (req, res, next) {
    return res.json({'msg': 'ok'});   
});
module.exports.handler = serverless(app);

重新部署后,GET和POST方法都能成功执行。

此外,还有一个关于授权的问题,需要将Postman的授权类型设置为AWS Signature,并将区域设置为'eu-west-3',以匹配终端节点区域。

最后,如果出现"message": "No method found matching route / for http method POST."的错误,需要在serverless.yml文件中的events部分添加"http: POST /"。

通过以上修改和配置,问题得到了解决。

0