Search code examples
node.jsamazon-web-servicesaws-lambdahandlerserverless-framework

Serverless AWS Lambda Edge: MalformedHandlerName


I'm following the below example to setup a Lambda Edge function:
https://www.serverless.com/blog/lambda-at-edge-support-added

The code: ./handler.js

// SAME CODE STRUCTURE AS ORIGINAL, JUST ADDING A HEADER TO TEST
'use strict';

exports.handler = (event, context, callback) => {    
    const response = event.Records[0].cf.response;
    const headers = response.headers;
    headers['test-lambda-edge'] = [{ key: 'test-lambda-edge', value: 'working' }]
    callback(null, response);
};

The Config: ./serverless.yml

# SAME CONFIG AS ORIGINAL, JUST CHANGING eventType and origin
service: mylambda
provider:
  name: aws
  runtime: nodejs12.x
  lambdaHashingVersion: 20201221
functions:
  cfLambda:
    handler: functions/handler.cloudfront
    events:
      - cloudFront:
          eventType: origin-response
          origin: https://example.org

The function deploys properly:

$ sls deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading mylambda.zip file to S3 (554 B)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
................
Serverless: Stack update finished...
Service Information
service: mylambda
stage: dev
region: us-east-1
stack: mylambda-dev
resources: 8
api keys:
  None
endpoints:
  CloudFront - ---------------.cloudfront.net
functions:
  cfLambda: mylambda-dev-cfLambda
layers:
  None

I am using the Amazon CloudFront Modify Response Headers test template for testing.

Attempt 1) with the same handlers naming as article
I get the below error, which I can understand as the article seems wrong, the cloudfront function isn't defined:

"errorMessage": "functions/handler.cloudfront is undefined or not exported"

Attempt 2) Trying to fix serverless.yml
I replaced handler: functions/handler.cloudfront with handler: functions/handler to match the code and I get the below error:

{"errorType":"Runtime.MalformedHandlerName","errorMessage":"Bad handler","stack":["Runtime.MalformedHandlerName: Bad handler"," at _splitHandlerString

If I look at the official doc, the handler naming is the same (ie exports.handler = ):
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-edge-how-it-works-tutorial.html

'use strict';
exports.handler = (event, context, callback) => {

Q: How should I name my handler in the code/config?


Solution

  • If the catalog structure that you're using looks like this:

    ├── handler.js
    └── serverless.yml
    

    and the name of the exported handler is handler and lives in handler.js file then the correct config will look like this:

    service: mylambda
    provider:
      name: aws
      runtime: nodejs12.x
      lambdaHashingVersion: 20201221
    functions:
      cfLambda:
        handler: handler.handler
        events:
          - cloudFront:
              eventType: origin-response
              origin: https://example.org
    

    First part is the path to the module and after . you reference specific function exported in that module. For handler: functions/handler.cloudfront to work, you'd have to export cloudfront function in ./functions/handler.js file.