我不能只使用Serverless-framework 1.20.2部署一个函数

时间:2017-08-27 16:39:33

标签: deployment aws-lambda serverless-framework

我想关注these tips

并重新部署我的功能,因为serverless.yml尚未更改。

但是,它只挂在Serverless: Uploading function阶段。永远,显然。

整个部署(使用sls deploy)可以正常工作,但速度很慢。

如何调试这个,因为显然没有错误消息?

修改

当我使用sls deploy时,我的项目需要大约4分钟和15秒才能部署。

对我而言似乎相当长,所以我认为我会使用sls deploy function -f myFunction代替,这应该会更快。

但是,当我尝试sls deploy function -f myFunction时,它似乎只会挂在Serverless: Uploading function: myFunction上。

我不知道如何调试它。

似乎使用' verbose',Serverless: Uploading function: myFunction --verbose没有区别,返回的消息是相同的。

我将尝试等待,看看最终功能部署是否完成......

好吧,我等了,它没有:大约8分30秒后我收到以下错误信息:

  

无服务器错误---------------------------------------       连接在120000ms后超时       得到支持 - - - - - - - - - - - - - - - - - - - - - -        文档:docs.serverless.com        错误:github.com/serverless/serverless/issues        论坛:forum.serverless.com        聊天:gitter.im/serverless/serverless       您的环境信息-----------------------------        操作系统:linux        节点版本:7.10.0        无服务器版本:1.20.2

另一个奇怪的是:挂起时,它写着:

  

无服务器:上传功能:myFunction(12.05 MB)......

但是函数本身只有3.2 kB,并且不包含任何包。

当我使用sls deploy时,显示的大小相同:

  

无服务器:将服务.zip文件上传到S3(12.05 MB)...

我的功能部署有什么问题?

编辑2

正如@dashmug暗示的那样,serverless.yml中存在配置问题。

在我的无服务器项目的functions目录中,我希望有一个共同的package.jsonnode_modules。然后每个函数都可以根据需要导入模块。

我试图关注the official guide

我的serverless.yml就像这样:

functions:
  myFunction:
    package:
      exclude:
        - 'functions/node_modules/**'
        - '!functions/node_modules/module1_I_want_to_include/**'
        - '!functions/node_modules/module2_I_want_to_include/**'

现在我得到sls deploy

  

无服务器:将服务.zip文件上传到S3(31.02 MB)......

并且该功能有效:)

然而,对于sls deploy function -f myFunction,我得到:

  

无服务器:上传功能:发送(1.65 MB)...

它会在合理的时间内上传,但该功能现在会出现以下错误:

  

无法导入模块' functions / myFunction':错误

3 个答案:

答案 0 :(得分:5)

我要看的东西:

  1. 尝试比较两者之间的情况:

    $ SLS_DEBUG=true sls deploy --verbose

    $ SLS_DEBUG=true sls deploy function -f myFunction --verbose

  2. 根据项目结构检查无服务器配置(打包等)。一个红旗是功能部署与服务部署一样大。这可能是一个配置错误的问题。

  3. 使用serverless package查看如何压缩包裹。它可以提供一些线索。

  4. 您使用的是哪些插件可能改变了您的包的创建方式吗?

  5. 您有多少个node_modules目录?您是否只有一个服务或每个功能一个?

答案 1 :(得分:2)

通过将--verbose参数传递给deploy函数,可以使部署过程更加详细。

sls deploy --verbosesls deploy -v都可以解决问题。

答案 2 :(得分:2)

我无法弄清楚为什么功能部署(而不是服务部署)会挂起。我可能错误配置了我的serverless.yml文件。

但没什么大不了的:我可以不用sls deploy function -myFunction

因为我的期望是错误的。我认为部署一个函数会比部署一个服务更快,不管怎样都不会重新部署node_modules目录。

但AWS中没有部分功能部署:部署功能时,必须部署所有必需的节点模块,以使该功能正常工作。

serverless doc中所述:

  

Framework将目标AWS Lambda函数打包成一个zip文件。

     

Framework获取已上传的函数.zip文件的哈希值,并将其与本地.zip文件哈希值进行比较。

     

如果两个哈希值相同,则框架终止。

     

该zip文件使用与前一个函数相同的名称上传到您的S3存储桶,CloudFormation堆栈指向该文件。

我(天真地)希望只有更新的处理程序才能上传到S3。 但是,由于函数在部署之前打包,它确实需要所有模块和依赖项。

所以我认为,只有当服务具有多个功能,并且服务功能不使用许多常见的nodejs模块时,功能部署才能节省时间(而不是服务部署)。如果sls deploy function -f myFunction没有挂起,那就是:)

因此,为了提高开发速度,诀窍是使用serverless offline

等工具使用离线模拟

serverless offline提供本地服务器,通过调用Postman中的myFunction或浏览器

,可以在本地访问lambda函数http://localhost:3000/myFunction

在大多数情况下,sls deploy只能在处理程序完全脱机测试后调用一次。