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


我想跟随 这些提示

并且只需重新部署我的功能 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

我不知道如何调试。

似乎使用'详细',用 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.json 和 node_modules。然后每个函数可以根据需要导入模块。

我试着跟着 官方指南

我的 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':错误


1653
2017-08-27 16:39


起源

没有足够的回复保证答案,但我强烈建议切换到 顶尖?我已经使用它近一年了,并且只有很少的问题,而这些问题完全来自于我黑客攻击我想要的功能。 :) - John Jones
好的,谢谢,我会试一试 - Manube


答案:


我要看的东西:

  1. 尝试比较两者之间发生的事情:

    $ SLS_DEBUG=true sls deploy --verbose

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

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

  3. 使用 serverless package 看看包装是如何拉链的。它可以提供一些线索。

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

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


5
2017-08-31 21:32



1.没有帮助,因为'仅功能'部署只是挂起 - Manube
2.你肯定在做某事:它可能是yaml中的包配置问题 - Manube
是的,我可以看到两个大包:一个叫做'serverless.zip',另一个叫'myFunction.zip' - Manube
4.不,没有特别的插件用于包装/包装 - Manube
5.我的目标是只为所有功能提供一个包,并希望使用exclude / include来获取每个功能所需的模块 - Manube


通过传递,可以使部署过程更加冗长 --verbose 部署函数的参数。

sls deploy --verbose 要么 sls deploy -v 会做的伎俩。


2
2017-08-28 22:42



谢谢@JustDanyul。我的意思是:部署整个项目需要一段时间,所以我想我只会上传我更新的功能。我会编辑问题以使其更清晰...... - Manube


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

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

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

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

如中所述 无服务器的文档

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

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

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

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

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

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


因此,为了提高开发速度,诀窍是使用类似工具的离线仿真 无服务器离线

无服务器离线 提供本地服务器和lambda函数 myFunction 通过呼叫在本地访问 http://localhost:3000/myFunction 在 邮差 或浏览器

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


2
2017-09-02 10:00