lambda上出现无服务器wsgi错误,但在本地服务器上工作正常

2024-05-15 13:49:24 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,伙计们,我在lambda上部署flask+serverless wsgi和serverless python需求插件并在AWS控制台上测试该功能时遇到了一些问题,我在下面得到了这个错误

不知道为什么要在本地测试中工作

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。这个函数只是返回一些东西

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




    
    
     

这是我的无服务器.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'

有人能帮我吗


Tags: pyimportappwsgis3actionec2resource
1条回答
网友
1楼 · 发布于 2024-05-15 13:49:24

您还必须传递标题道具。如果您使用应用程序邮递员发出请求,它将自动传递该标题道具。否则,您必须显式地传递它

下面是一个可以传递的有效json示例

{
  "requestPath": "",
  "headers": {},
  "body": {
    "username": "some_username",
    "password": "p@ssW0rD"
  }
}

相关问题 更多 >