功能错误初始化失败 AWS Lambda

21

我最近添加了很酷的lambda功能-预置并发

在几次成功的部署之后,我现在面临这个问题

无服务器错误 ---------------------------------------

ServerlessError:发生错误: GraphqlPrivateProvConcLambdaAlias-预配置的并发 配置未能应用。原因: FUNCTION_ERROR_INIT_FAILURE。 at C:\Users\theod\AppData\Roaming\npm\node_modules\serverless\lib\plugins\aws\lib\monitorStack.js:125:33 From previous event: at AwsDeploy.monitorStack (C:\Users\theod\AppData\Roaming\npm\node_modules\serverless\lib\plugins\aws\lib\monitorStack.js:28:12) at C:\Users\theod\AppData\Roaming\npm\node_modules\serverless\lib\plugins\aws\lib\updateStack.js:107:28 From previous event: at AwsDeploy.update

这是我的示例 serverless.yml 文件

service: backend-api

parameters:
  region: ap-southeast-2
  path: &path /

provider:
  name: aws
  runtime: nodejs12.x
  stage: ${env:STAGE, 'staging'}
  region: ap-southeast-2
  versionFunctions: true

plugins:
  - serverless-webpack
  - serverless-pseudo-parameters
  - serverless-prune-plugin
  # - serverless-offline-scheduler
  - serverless-offline

functions:
  # GRAPHQL APIs
  graphqlPrivate:
    handler: src/graphql/private/index.handler
    memorySize: 256
    timeout: 30
    name: ${self:service}-gqlPrivate-${self:provider.stage}
    vpc: ${file(./serverless/vpc.yml)}
    events:
        - http:
            path: /graphql/private
            method: ANY
            cors: true
            authorizer:
              arn: arn:aws:cognito-idp:#{AWS::Region}:#{AWS::AccountId}:userpool/${self:custom.cognitoArns.private.${self:provider.stage}}
    provisionedConcurrency: 10


package:
  individually: true

custom:
  webpack:
    keepOutputDirectory: true
    serializedCompile: true
    webpackConfig: 'webpack.config.js'
    packager: 'npm'
  stage: ${opt:stage, self:provider.stage}

  prune:
    automatic: true
    number: 1

有人能够解决这个问题吗?

  Your Environment Information ---------------------------
     Operating System:          win32
     Node Version:              12.11.0
     Framework Version:         1.61.3
     Plugin Version:            3.2.7
     SDK Version:               2.3.0
     Components Core Version:   1.1.2
     Components CLI Version:    1.4.0
1个回答

40

FUNCTION_ERROR_INIT_FAILURE 意味着我尝试部署的函数处理程序/代码存在问题,导致预配的 Lambda 无法启动/初始化。

解决方法是首先测试不使用预配并发选项。一旦您能够推送 lambda,错误信息将会流入 CW 日志中。最好的方法是使用 serverless-offline 插件或 serverless invoke 在本地测试您的 lambda,如果它正常工作,则可以排除代码问题。

您也可以打包应用程序,并使用 serverless cli 调用以检测打包问题。

在我的情况下,存在运行时错误,我的代码包正在寻找不在包中的 require

截至现在(2020 年 1 月 29 日),AWS Lambda 尚未对此进行文档化。


1
当调用Lambda函数时正常工作,但在初始化期间失败时,我该怎么办? - Daniil Volkov
@DaniilVolkov 你可能正在调用一个过时的 Lambda,因为上面的错误是在部署阶段出现的。这意味着你最新的 Lambda 没有成功部署。所以你应该先尝试解决这个问题。在本地调用可能有效,但当你部署时情况就不同了,因为你的代码可能在打包过程中出错,而且你必须考虑在生产环境中可能出现的问题,比如缺少 ENV 变量、缺少 Lambda 权限等。 - Theo
我也发现这个错误促使我编写单元/集成测试,因为整个部署过程的等待时间太长了,如果是代码语法错误,那么对开发时间的惩罚就非常大。 - Shawn
@ShaungCheng 对的。通过自动化尽快捕捉错误以克服开发时间惩罚将非常酷。 - Theo
对我来说,我缺少了一个 IAM 角色... Lambda 无法获取密钥。 - rjdkolb
谢谢你的回答,确实有效;因为我的代码中有一些错误,在移除库后它就可以工作了,并且有时会抱怨并发设置... - Frank Guo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接