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"
  }
}