Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't get lambda event in serverless wsgi handler

My goal is I want to access claims from authorizer. I used serverless framework to work with lambda. In javascript I can easily get evt.requestContext.authorizer.claims like this.

module.exports = async (evt, ctx) => {
 
  const authorizer = evt.requestContext.authorizer;
  console.log(authorizer.claims)

}

With python handler using serverless-wsgi I don't know how to get event context in flask API. From document => https://www.npmjs.com/package/serverless-wsgi show me like this.

from flask import Flask, request
app = Flask(__name__)


@app.route("/")
def index():
    print(request.environ['serverless.context'])
    print(request.environ['serverless.event'])

But I got this error. How to fix it.

KeyError: 'serverless.event' // Werkzeug Debugger

Here is my serverless.yml

service: python-service

projectDir: ../

plugins:
  - serverless-wsgi
  - serverless-python-requirements
  - serverless-plugin-resource-tagging

variablesResolutionMode: 20210326
useDotenv: true
provider:
  apiGateway: ${file(../serverless.common.yml):apiGateway}
  name: aws
  runtime: python3.7
  stage: ${opt:stage, 'dev'}
  region: ap-southeast-1
  versionFunctions: false
  memorySize: 1024
  timeout: 30
  logRetentionInDays: 14
  stackName: ${self:service}-${self:provider.stage}
  deploymentBucket: ${file(../serverless.common.yml):deploymentBucket}
  environment:
    NODE_ENV: ${self:provider.stage}
  vpc: ${file(../serverless.common.yml):vpc.${self:provider.stage}}
  iamRoleStatements:
    - ${file(../serverless.common.yml):iamGetSecretValue}
    - ${file(../serverless.common.yml):iamInvokeFunction}
     
functions:
  testDrive:
    handler: wsgi_handler.handler
    provisionedConcurrency: 1
    fileSystemConfig:
      arn: !GetAtt AccessPointResource.Arn
      localMountPath: /mnt/efs
    events:
      - http:
          path: testDrive/go
          method: post
          cors: ${file(../serverless.common.yml):cors.preflight.${self:provider.stage}}
          authorizer: ${file(../serverless.common.yml):authorizer}
  
package:
  exclude:
    - node_modules/**
    - .pytest_cache/**
    - __pychache__/**
    - lib/**
    - venv/**

custom:
  wsgi:
    app: handler.app
    packRequirements: false
  pythonRequirements:
    dockerizePip: 'non-linux'

like image 980
Bunpot Darawankul Avatar asked Jan 29 '26 08:01

Bunpot Darawankul


1 Answers

If you try to run it correctly in both naive flask and serverless-wsgi, you should use the dict.get(key, default_value) instead of dict[key].

In your case, just modified your code like this:

from flask import Flask, request
app = Flask(__name__)


@app.route("/")
def index():
    print(request.environ.get('serverless.context'))
    print(request.environ.get('serverless.event'))
    return 'here is content of web page'
like image 181
NicoNing Avatar answered Feb 01 '26 14:02

NicoNing



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!