AWS SAM构建Lambda TS代码时esbuild无法解析aws-sdk求助
AWS SAM构建TypeScript Lambda时Esbuild无法解析aws-sdk的解决办法
问题情况
执行sam build构建部署到AWS Lambda的TypeScript代码时,出现Esbuild报错,提示无法解析aws-sdk,即使已经执行npm install aws-sdk和npm install --save-dev @types/node,错误依旧。具体错误信息如下:
Building codeuri: D:\AWS\demo-app\hello-world runtime: nodejs16.x metadata: {'BuildMethod': 'esbuild', 'BuildProperties': {'Minify': True, 'Target': 'es2020', 'EntryPoints': ['app.ts']}} architecture: x86_64 functions: HelloWorldFunction Running NodejsNpmEsbuildBuilder:CopySource Running NodejsNpmEsbuildBuilder:NpmInstall Running NodejsNpmEsbuildBuilder:EsbuildBundle Build Failed Error: NodejsNpmEsbuildBuilder:EsbuildBundle - Esbuild Failed: X [ERROR] Could not resolve "aws-sdk" app.ts:2:21: 2 │ import * as AWS from 'aws-sdk'; ╵ ~~~~~~~~~ You can mark the path "aws-sdk" as external to exclude it from the bundle, which will remove this error. 1 error child_process.js:830 throw err; ^ Error: Command failed: C:\Users\AyubJamal\AppData\Roaming\npm\node_modules\esbuild\node_modules\esbuild-windows-64\esbuild.exe app.ts --bundle --platform=node --outdir=D:\AWS\demo-app\.aws-sam\build\HelloWorldFunction --format=cjs --minify --target=es2020 at checkExecSyncError (child_process.js:790:11) at Object.execFileSync (child_process.js:827:15) at Object.<anonymous> (C:\Users\AyubJamal\AppData\Roaming\npm\node_modules\esbuild\bin\esbuild:209:28) at Module._compile (internal/modules/cjs/loader.js:1085:14) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10) at Module.load (internal/modules/cjs/loader.js:950:32) at Function.Module._load (internal/modules/cjs/loader.js:790:12) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12) at internal/main/run_main_module.js:17:47 { status: 1, signal: null, output: [ null, null, null ], pid: 23712, stdout: null, stderr: null }
用户当前的tsconfig.json配置:
{ "compilerOptions": { "target": "es2020", "strict": true, "preserveConstEnums": true, "noEmit": true, "sourceMap": false, "module":"es2015", "moduleResolution":"node", "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, }, "exclude": ["node_modules", "**/*.test.ts"] }
解决步骤
核心原因是Node.js16.x及以下版本的AWS Lambda运行时已经内置了aws-sdk,不需要把它打包进代码包,直接标记为外部依赖即可,具体操作如下:
方法1:修改SAM模板(推荐)
打开你的template.yaml,在对应函数的Metadata.BuildProperties里添加External配置,指定aws-sdk为外部依赖:
Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: hello-world/ Handler: app.lambdaHandler Runtime: nodejs16.x Metadata: BuildMethod: esbuild BuildProperties: Minify: true Target: es2020 EntryPoints: ["app.ts"] External: ["aws-sdk"] # 新增这一行,标记aws-sdk为外部依赖
方法2:使用esbuild配置文件
如果不想修改SAM模板,可以在项目根目录创建esbuild.config.js,配置外部依赖:
module.exports = { bundle: true, platform: 'node', outdir: '.aws-sam/build/HelloWorldFunction', format: 'cjs', minify: true, target: 'es2020', entryPoints: ['hello-world/app.ts'], external: ['aws-sdk'] };
之后重新执行sam build即可。
额外注意事项
- 如果你使用的是Node.js18.x及以上版本,Lambda不再内置旧版
aws-sdk,而是使用新的@aws-sdk/client-xxx系列包,这时需要安装对应服务的SDK包(比如npm install @aws-sdk/client-s3),且不要标记为外部依赖。 - 若之前把
aws-sdk安装到了devDependencies里,建议移到dependencies(不过标记为外部依赖后,这一步可以省略)。
内容的提问来源于stack exchange,提问作者Ayub Jamal
相关产品推荐
相关产品推荐

