AWS Lambda运行报错Cannot find module 'stripe'问题排查
问题现象
Amplify托管的后端应用调用Lambda函数时抛出模块找不到错误:
Error: Cannot find module 'stripe'
Require stack:
- /var/task/index.js
- /var/runtime/UserFunction.js
- /var/runtime/index.js
- 已在项目根目录安装stripe包,根目录依赖列表可查,但目标Lambda函数目录的依赖中无stripe
- 尝试在functions文件夹下安装stripe后问题未解决
- 当前环境版本:React 17.0.2,stripe 9.6.0
关联代码
Lambda函数源码
const aws = require('aws-sdk'); const ddb = new aws.DynamoDB({apiVersion: '2012-10-08'}); const stripe = require('stripe')('secret key'); /** * @type {import('@types/aws-lambda').APIGatewayProxyHandler} */ exports.handler = async (event) => { try { const tableName = process.env.tableName const {username, email} = event.arguments.input const account = await stripe.accounts.create({ type: 'express', email: `${email}`, metadata: {user: `${username}`} }); console.log("Account creation response: ", account) console.log("Account id: ", account.id) // 存储Stripe账号ID到DynamoDB let ddbParams = { Item: { 'stripe_id': `${account.id}` }, TableName: tableName } try { await ddb.putItem(ddbParams).promise() console.log("Successfully updated stripe_id field") } catch (err) { console.log("Storing to DB error: ", err) } const accountId = account.id const accountLink = await stripe.accountLinks.create({ account: accountId, // 上线时替换为正式站点地址 refresh_url: 'http://localhost:3000/profile', return_url: 'http://localhost:3000/listingform', type: 'account_onboarding', }); console.log('Account link response :', accountLink) return accountLink } catch (err) { throw new Error(err) } };
初始函数package.json配置
函数目录初始未声明stripe依赖,配置如下:
{ "name": "createStripeConnectAccount", "version": "2.0.0", "description": "Lambda function generated by Amplify", "main": "index.js", "license": "Apache-2.0", "devDependencies": { "@types/aws-lambda": "^8.10.92" } }
问题更新
已将stripe添加到函数目录的dependencies依赖中,仍触发相同报错,更新后的package.json如下:
{ "name": "createStripeConnectAccount", "version": "2.0.0", "description": "Lambda function generated by Amplify", "main": "index.js", "license": "Apache-2.0", "devDependencies": { "@types/aws-lambda": "^8.10.92" }, "dependencies": { "save": "^2.5.0", "stripe": "^9.6.0" } }
修复步骤
问题根源是Amplify对Lambda函数的依赖打包逻辑:Amplify只会读取、打包单个函数专属目录下的依赖,项目根目录、functions总目录下安装的依赖不会被打包进Lambda部署包,且旧的部署缓存会导致新安装的依赖不生效。按以下步骤操作即可修复:
- 进入目标函数的专属本地目录,路径格式为
amplify/backend/function/createStripeConnectAccount/ - 删除该目录下的
node_modules文件夹和package-lock.json文件,执行npm install重新安装所有依赖,安装完成后确认当前目录下node_modules内存在stripe文件夹 - 返回项目根目录,执行
amplify push --force强制跳过缓存重新打包部署所有资源 - 如果仍报错,执行
amplify update function,选择对应函数,进入高级配置项,确认已开启「打包本地node_modules依赖」选项,保存后重新推送即可
内容的提问来源于stack exchange,提问作者Zio-4
相关产品推荐
相关产品推荐

