AWS Lambda函数在通过POST发送文件时返回HTTP 403。
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+}'
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 /"。
通过以上修改和配置,问题得到了解决。