【问题标题】:Serverless AWS Lambda Edge: MalformedHandlerName无服务器 AWS Lambda 边缘:MalformedHandlerName
【发布时间】:2021-06-21 03:30:28
【问题描述】:

我正在按照以下示例设置 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 Modify Response Headers 测试模板进行测试。

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

"errorMessage": "functions/handler.cloudfront 是否未定义 出口”

尝试 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) => {

问:我应该如何在代码/配置中命名我的处理程序?

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda handler serverless-framework


    【解决方案1】:

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

    ├── 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 函数。

    【讨论】:

      猜你喜欢
      • 2021-06-28
      • 1970-01-01
      • 2019-01-21
      • 2018-03-19
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多