lambda 上的无服务器 wsgi 错误但在本地工作正常
Serverless wsgi error on lambda but working fine on local
大家好,当我在 lambda 上部署并在 AWS 控制台上测试此功能时,我遇到了 flask + serverless-wsgi 和 serverless-python-requirements 插件的一些问题,我在下面收到此错误。
不知道为什么本地测试可以。
Response
{
"errorMessage": "'headers'",
"errorType": "KeyError",
"stackTrace": [
" File \"/var/task/wsgi_handler.py\", line 110, in handler\n return serverless_wsgi.handle_request(wsgi_app, event, context)\n",
" File \"/var/task/serverless_wsgi.py\", line 170, in handle_request\n return handle_lambda_integration(app, event, context)\n",
" File \"/var/task/serverless_wsgi.py\", line 308, in handle_lambda_integration\n headers = Headers(event[u\"headers\"])\n"
]
}
在我遇到这个问题之前,我发现没有 werkzeug 模块错误,所以我降级了我的 requirements.txt 但它仍然无法正常工作。
flask==1.0.2
werkzeug==1.0.0
这是我的 handler.py 这个函数只是 return 东西。
import os
import sys
import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
env = os.environ
from flask import Flask, request, Response
app = Flask(__name__)
@app.route('/toro',methods = ['POST'])
def toro():
data = {
'name': 'Toro'
}
js = json.dumps(data)
response = Response(js, status=200, mimetype='application/json')
return response
这是我的 serverless.yml
service: my-service
plugins:
- serverless-aws-documentation
- serverless-s3-deploy
- serverless-domain-manager
- serverless-plugin-warmup
- serverless-offline
- serverless-wsgi
- serverless-python-requirements
provider:
name: aws
runtime: python3.7
stage: dev
region: ap-southeast-1
versionFunctions: false
profile: default
memorySize: 1024
timeout: 30
logRetentionInDays: 14
logs:
restApi: true
environment:
NODE_ENV: ${self:provider.stage}
vpc:
securityGroupIds:
- sg-xxxxxxxxxxxxx
subnetIds:
- subnet-xxxxxxxxxxx
iamRoleStatements:
- Effect: "Allow"
Action:
- "secretsmanager:GetSecretValue"
Resource:
- "*"
- Effect: "Allow"
Action:
- "s3:PutObject"
- "s3:PutObjectAcl"
- "s3:GetObject"
- "s3:ListBucket"
- "s3:DeleteObject"
Resource:
- "*"
- Effect: "Allow"
Action:
- "logs:CreateLogGroup"
- "logs:CreateLogStream"
- "logs:PutLogEvents"
- "ec2:CreateNetworkInterface"
- "ec2:DescribeNetworkInterfaces"
- "ec2:DeleteNetworkInterface"
- "ec2:AssignPrivateIpAddresses"
- "ec2:UnassignPrivateIpAddresses"
Resource:
- "*"
- Effect: "Allow"
Action:
- "elasticfilesystem:ClientMount"
- "elasticfilesystem:ClientRootAccess"
- "elasticfilesystem:ClientWrite"
- "elasticfilesystem:DescribeMountTargets"
Resource:
- "*"
functions:
toro:
handler: wsgi_handler.handler
reservedConcurrency: 10
events:
- http:
path: /toro
method: post
cors:
origin: "*"
custom:
wsgi:
app: handler.app
packRequirements: false
pythonRequirements:
dockerizePip: 'non-linux'
这里有没有人可以帮助我。
您还必须传递 headers 道具。如果您使用应用程序 Postman 发出请求,它将自动传递 header 属性。否则,您必须明确传递它。
这是一个有效的例子json你可以通过
{
"requestPath": "",
"headers": {},
"body": {
"username": "some_username",
"password": "p@ssW0rD"
}
}
大家好,当我在 lambda 上部署并在 AWS 控制台上测试此功能时,我遇到了 flask + serverless-wsgi 和 serverless-python-requirements 插件的一些问题,我在下面收到此错误。
不知道为什么本地测试可以。
Response
{
"errorMessage": "'headers'",
"errorType": "KeyError",
"stackTrace": [
" File \"/var/task/wsgi_handler.py\", line 110, in handler\n return serverless_wsgi.handle_request(wsgi_app, event, context)\n",
" File \"/var/task/serverless_wsgi.py\", line 170, in handle_request\n return handle_lambda_integration(app, event, context)\n",
" File \"/var/task/serverless_wsgi.py\", line 308, in handle_lambda_integration\n headers = Headers(event[u\"headers\"])\n"
]
}
在我遇到这个问题之前,我发现没有 werkzeug 模块错误,所以我降级了我的 requirements.txt 但它仍然无法正常工作。
flask==1.0.2
werkzeug==1.0.0
这是我的 handler.py 这个函数只是 return 东西。
import os
import sys
import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
env = os.environ
from flask import Flask, request, Response
app = Flask(__name__)
@app.route('/toro',methods = ['POST'])
def toro():
data = {
'name': 'Toro'
}
js = json.dumps(data)
response = Response(js, status=200, mimetype='application/json')
return response
这是我的 serverless.yml
service: my-service
plugins:
- serverless-aws-documentation
- serverless-s3-deploy
- serverless-domain-manager
- serverless-plugin-warmup
- serverless-offline
- serverless-wsgi
- serverless-python-requirements
provider:
name: aws
runtime: python3.7
stage: dev
region: ap-southeast-1
versionFunctions: false
profile: default
memorySize: 1024
timeout: 30
logRetentionInDays: 14
logs:
restApi: true
environment:
NODE_ENV: ${self:provider.stage}
vpc:
securityGroupIds:
- sg-xxxxxxxxxxxxx
subnetIds:
- subnet-xxxxxxxxxxx
iamRoleStatements:
- Effect: "Allow"
Action:
- "secretsmanager:GetSecretValue"
Resource:
- "*"
- Effect: "Allow"
Action:
- "s3:PutObject"
- "s3:PutObjectAcl"
- "s3:GetObject"
- "s3:ListBucket"
- "s3:DeleteObject"
Resource:
- "*"
- Effect: "Allow"
Action:
- "logs:CreateLogGroup"
- "logs:CreateLogStream"
- "logs:PutLogEvents"
- "ec2:CreateNetworkInterface"
- "ec2:DescribeNetworkInterfaces"
- "ec2:DeleteNetworkInterface"
- "ec2:AssignPrivateIpAddresses"
- "ec2:UnassignPrivateIpAddresses"
Resource:
- "*"
- Effect: "Allow"
Action:
- "elasticfilesystem:ClientMount"
- "elasticfilesystem:ClientRootAccess"
- "elasticfilesystem:ClientWrite"
- "elasticfilesystem:DescribeMountTargets"
Resource:
- "*"
functions:
toro:
handler: wsgi_handler.handler
reservedConcurrency: 10
events:
- http:
path: /toro
method: post
cors:
origin: "*"
custom:
wsgi:
app: handler.app
packRequirements: false
pythonRequirements:
dockerizePip: 'non-linux'
这里有没有人可以帮助我。
您还必须传递 headers 道具。如果您使用应用程序 Postman 发出请求,它将自动传递 header 属性。否则,您必须明确传递它。
这是一个有效的例子json你可以通过
{
"requestPath": "",
"headers": {},
"body": {
"username": "some_username",
"password": "p@ssW0rD"
}
}