Serverless - Lambda Layers "Cannot find module 'request'"
当我使用以下方式部署无服务器 API 时:
1 | serverless deploy |
创建了 lambda 层,但是当我运行该函数时,出现此错误:
1 | "Cannot find module 'request'" |
但如果我通过控制台手动上传 .zip 文件(与我部署时上传的完全相同的文件),它可以正常工作。
有人知道为什么会这样吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | environment: SLS_DEBUG:"*" provider: name: aws runtime: nodejs8.10 stage: ${opt:api-type, 'uat'}-${opt:api, 'payment'} region: ca-central-1 timeout: 30 memorySize: 128 role: ${file(config/prod.env.json):ROLE} vpc: securityGroupIds: - ${file(config/prod.env.json):SECURITY_GROUP} subnetIds: - ${file(config/prod.env.json):SUBNET} apiGateway: apiKeySourceType: HEADER apiKeys: - ${file(config/${opt:api-type, 'uat'}.env.json):${opt:api,"payment"}-APIKEY} functions: - '${file(src/handlers/${opt:api,"payment"}.serverless.yml)}' package: # individually: true exclude: - node_modules/** - nodejs/** plugins: - serverless-offline - serverless-plugin-warmup - serverless-content-encoding custom: contentEncoding: minimumCompressionSize: 0 # Minimum body size required for compression in bytes layers: nodejs: package: artifact: nodejs.zip compatibleRuntimes: - nodejs8.10 allowedAccounts: -"*" |
这就是我的无服务器 yaml 脚本的样子。
如果有人遇到类似的问题
请注意,如果您有以下声明:
1 2 3 4 5 6 | package: exclude: - './**' - '!node_modules/**' - '!dist/**' - '.git/**' |
一旦您部署了 lambda 函数(使用无服务器框架),它将在运行时导致完全相同的错误。只是,确保删除可能在您的依赖项之间产生冲突的那些
确保在部署之前在层内运行
1 | cd ~/repos/repo-name/layers/utilityLayer/nodejs && npm install |
否则,您的层将在没有
在使用显式
我的错误(为了网络搜索)是这样的:
我觉得这是一个临时解决方案 b/c 我想像你一样明确定义我的层,但它不起作用,所以它看起来像一个错误。
我为这个问题在无服务器中创建了一个错误报告。如果其他人遇到同样的问题,他们可以在那里进行跟踪。
解决方案
我根据 AWS 的这些文档在无服务器论坛中关注了这篇文章。
我将我的
然后我没有使用层的显式定义,而是使用
1 2 3 4 | layers: test: package: artifact: test.zip |
在功能层是这样称呼的:
1 2 3 4 5 | functions: function1: handler: index.handler layers: - { Ref: TestLambdaLayer } |
我正在使用带有
当我从
切换时
1 | const myModule = require('./src/myModule'); |
到
1 | import myModule from './src/myModule'; |
错误消失了。当我使用
时,似乎
PS: 移除