部署AWS Lambda Stack时遇Cannot Find Asset错误求助
AWS CDK部署Lambda函数时出现Cannot Find Asset错误的解决方案
问题背景
尝试部署包含Lambda函数的AWS CDK栈,Lambda运行代码位于source目录下的services文件夹中,但执行cdk synth时触发Cannot Find Asset错误,调整文件位置、添加.js后缀均未解决。
相关代码
CDK栈代码(TypeScript)
import { Stack, StackProps } from "aws-cdk-lib"; import { Construct } from "constructs"; import { Code, Function as LambdaFunction, Runtime, } from "aws-cdk-lib/aws-lambda"; import { join } from "path"; export class LambdaStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); new LambdaFunction(this, "getBooksLambda", { runtime: Runtime.NODEJS_18_X, handler: "getBooks.main", code: Code.fromAsset(join(__dirname, "..", "..", "services", "getBooks")), }); } }
Lambda函数代码(JavaScript)
exports.main = async function(event, context) { return { statusCode: 200, body: JSON.stringify({ message: "Hello from Lambda" }) } }
报错信息
Error: Cannot find asset at C:\Users\User\Documents\Bookeroo\bookeroo-cdk\src\services\getBooks at new AssetStaging (C:\Users\User\Documents\Bookeroo\bookeroo-cdk\node_modules\aws-cdk-lib\core\lib\asset-staging.js:1:2119) at new Asset (C:\Users\User\Documents\Bookeroo\bookeroo-cdk\node_modules\aws-cdk-lib\aws-s3-assets\lib\asset.js:1:1141) at AssetCode.bind (C:\Users\User\Documents\Bookeroo\bookeroo-cdk\node_modules\aws-cdk-lib\aws-lambda\lib\code.js:5:3487) at new Function (C:\Users\User\Documents\Bookeroo\bookeroo-cdk\node_modules\aws-cdk-lib\aws-lambda\lib\function.js:1:10003) at new LambdaStack (C:\Users\User\Documents\Bookeroo\bookeroo-cdk\src\infra\stacks\LambdaStack.ts:13:32) at Object.<anonymous> (C:\Users\User\Documents\Bookeroo\bookeroo-cdk\src\infra\Launcher.ts:12:1) at Module._compile (node:internal/modules/cjs/loader:1241:14) at Module.m._compile (C:\Users\User\Documents\Bookeroo\bookeroo-cdk\node_modules\ts-node\src\index.ts:1618:23) at Module._extensions..js (node:internal/modules/cjs/loader:1295:10) at Object.require.extensions.<computed> [as .ts] (C:\Users\User\Documents\Bookeroo\bookeroo-cdk\node_modules\ts-node\src\index.ts:1621:12)
问题分析与解决步骤
从报错路径C:\Users\User\Documents\Bookeroo\bookeroo-cdk\src\services\getBooks可以看出,CDK尝试在src目录下查找services文件夹,但你明确说明代码位于source目录下——路径计算错误是核心问题。
1. 修正Asset路径
当前CDK代码中,__dirname指向的是CDK栈文件所在的src/infra/stacks目录,join(__dirname, "..", "..", "services", "getBooks")会定位到src/services/getBooks,但实际代码在项目根目录下的source/services/getBooks。
调整路径计算,从当前栈文件往上回溯到项目根目录,再指向source目录:
code: Code.fromAsset(join(__dirname, "../../../source/services/getBooks")),
2. 验证路径正确性
可以在代码中临时添加路径打印,确认计算后的路径是否匹配实际文件位置:
const lambdaCodePath = join(__dirname, "../../../source/services/getBooks"); console.log("Lambda代码路径:", lambdaCodePath); // 运行时查看输出是否正确
3. 确认文件/目录存在
- 确保
source/services/getBooks目录(或getBooks.js文件,如果是单个文件的话)确实存在于项目根目录,与src目录同级。 - 如果
getBooks是单个文件而非目录,路径需要指向具体的.js文件:code: Code.fromAsset(join(__dirname, "../../../source/services/getBooks.js")),
内容的提问来源于stack exchange,提问作者Roy Craver
相关产品推荐
相关产品推荐

