无服务器 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
函数。
我正在按照以下示例设置 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
函数。