You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 09:45:42