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

如何解决CDK部署AWS Lambda时的‘Cannot use import statement outside a module’错误

解决AWS Lambda Node.js v20中ES6模块语法错误(SyntaxError: Cannot use import statement outside a module)

核心原因

Lambda运行时未识别你的代码为ES模块,可能是部署包中缺少模块类型配置,或CDK打包时未正确输出ES模块格式。

解决方案

1. 使用NodejsFunction构造并配置ES模块打包

AWS CDK的NodejsFunction(基于esbuild)是处理Node.js Lambda最便捷的方式,需明确配置打包输出为ES模块,并指定目标runtime版本:

修改lib/my-stack.js中的Lambda定义:

import { Stack, StackProps } from 'aws-cdk-lib';
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
import { Runtime } from 'aws-cdk-lib/aws-lambda';
import { OutputFormat } from 'aws-cdk-lib/aws-lambda-nodejs';
import { Construct } from 'constructs';

export class MyStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const myLambda = new NodejsFunction(this, 'MyLambda', {
      runtime: Runtime.NODEJS_20_X,
      entry: './src/index.js',
      bundling: {
        // 指定输出为ES模块格式
        format: OutputFormat.ESMODULE,
        // 针对Node.js 20打包
        target: 'node20',
        // 排除AWS SDK(Lambda运行时自带)
        externalModules: ['@aws-sdk/*'],
      },
    });
  }
}

2. 确保ES模块导入路径完整

Node.js ES模块要求导入时必须带完整文件后缀,检查src/index.js中的导入语句:

// 正确写法(带.js后缀)
import { foo } from './foo-service.js';

同时确保foo-service.js也位于src目录下,且采用ES模块语法(用export导出)。

3. 验证部署包中的模块配置

如果坚持在src目录添加package.json,确保其内容为:

{
  "type": "module"
}

NodejsFunction默认会打包entry所在目录的所有文件,所以这个package.json会被包含进部署包,让Lambda识别该目录下的文件为ES模块。

4. 避免混用CommonJS与ES模块

确保项目中所有文件都采用ES模块语法(用import/export),不要出现require()语句,避免模块类型冲突。

验证步骤

  1. 运行cdk synth查看生成的CloudFormation模板,确认Lambda的Runtime为nodejs20.x。
  2. 部署后,在Lambda控制台查看部署包内容,确认src目录的文件(包括package.json如果有的话)已正确打包。
  3. 手动触发Lambda测试,检查CloudWatch日志是否仍有语法错误。

内容的提问来源于stack exchange,提问作者adam.shaleen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:00:13