无服务器 AWS Lambda Edge:MalformedHandlerName

Serverless AWS Lambda Edge: MalformedHandlerName

我正在按照以下示例设置 Lambda Edge 函数:
https://www.serverless.com/blog/lambda-at-edge-support-added

代码: ./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);
};

配置: ./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

函数正确部署:

$ 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

我正在使用 Amazon CloudFront 修改响应 Headers 测试模板进行测试。

尝试 1) 使用与文章
相同的命名处理程序 我收到以下错误,我可以理解,因为文章似乎有误,未定义云端功能:

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

尝试 2) 尝试修复 serverless.yml
我将 handler: functions/handler.cloudfront 替换为 handler: functions/handler 以匹配代码,但出现以下错误:

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

如果我查看官方文档,处理程序命名是相同的(即 exports.handler = ):
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-edge-how-it-works-tutorial.html

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

问:我应该如何在 code/config 中命名我的处理程序?

如果您使用的目录结构如下所示:

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

并且导出的处理程序的名称是 handler 并且存在于 handler.js 文件中,那么正确的配置将如下所示:

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

第一部分是模块的路径,在 . 之后您引用该模块中导出的特定函数。要使 handler: functions/handler.cloudfront 正常工作,您必须在 ./functions/handler.js 文件中导出 cloudfront 函数。