在AWS Lambda中运行CDK遇'node未找到'错误,求可行方案
在AWS Lambda中运行AWS CDK的可行方案
我需要频繁更新CloudWatch Dashboards,因此尝试在AWS Lambda中运行CDK以生成CloudFormation模板。但执行构造函数app = cdk.App(outdir="./tmp")时抛出异常,报错信息为[ERROR] FileNotFoundError: [Errno 2] No such file or directory: 'node',完整报错栈如下:
[ERROR] FileNotFoundError: [Errno 2] No such file or directory: 'node' Traceback (most recent call last): File "/var/lang/lib/python3.9/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1030, in _gcd_import File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 680, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 850, in exec_module File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed File "/var/task/app.py", line 2, in <module> import aws_cdk as cdk File "/var/task/aws_cdk/__init__.py", line 1440, in <module> from ._jsii import * File "/var/task/aws_cdk/_jsii/__init__.py", line 13, in <module> import aws_cdk.asset_awscli_v1._jsii File "/var/task/aws_cdk/asset_awscli_v1/_jsii/__init__.py", line 13, in <module> __jsii_assembly__ = jsii.JSIIAssembly.load( File "/var/task/jsii/_runtime.py", line 55, in load _kernel.load(assembly.name, assembly.version, os.fspath(assembly_path)) File "/var/task/jsii/_kernel/__init__.py", line 299, in load self.provider.load(LoadRequest(name=name, version=version, tarball=tarball)) File "/var/task/jsii/_kernel/providers/process.py", line 352, in load return self._process.send(request, LoadResponse) File "/var/task/jsii/_utils.py", line 23, in wrapped stored.append(fgetter(self)) File "/var/task/jsii/_kernel/providers/process.py", line 347, in _process process.start() File "/var/task/jsii/_kernel/providers/process.py", line 260, in start self._process = subprocess.Popen( File "/var/lang/lib/python3.9/subprocess.py", line 951, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "/var/lang/lib/python3.9/subprocess.py", line 1821, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename)Exception ignored in: <function _NodeProcess.__del__ at 0x7f80ae481e50> Traceback (most recent call last): File "/var/task/jsii/_kernel/providers/process.py", line 228, in __del__ self.stop() File "/var/task/jsii/_kernel/providers/process.py", line 291, in stop assert self._process.stdin is not None AttributeError: '_NodeProcess' object has no attribute '_process'
核心原因
AWS CDK基于JSII实现跨语言支持,运行时需要启动Node.js进程。但Lambda的Python官方运行时默认未安装Node.js,因此找不到node可执行文件导致报错。
以下是几种可行的解决方法:
方法1:添加包含Node.js的Lambda层
- 下载与Lambda运行时架构(x86_64或arm64)匹配的Node.js二进制包,解压后将
node可执行文件放在nodejs/bin目录下,打包成ZIP文件。 - 在AWS控制台创建Lambda层,上传该ZIP包,将层附加到你的Lambda函数。
- 在Lambda的环境变量中设置
PATH为/opt/nodejs/bin:/var/lang/bin:/usr/local/bin:/usr/bin/:/bin,确保系统能找到node命令。
方法2:预先生成CloudFormation模板,在Lambda中直接使用
- 不在Lambda内运行CDK构造,而是在本地或CI/CD流水线中提前通过
cdk synth生成CloudFormation模板,将模板上传到S3存储。 - Lambda函数从S3读取模板内容,直接调用CloudFormation API更新资源。这种方式完全避免了在Lambda中运行CDK的依赖问题,性能更优。
方法3:使用自定义Lambda镜像
- 基于Python官方镜像(如
python:3.9-slim)构建自定义镜像,在镜像中安装Node.js和所需的Python依赖(包括aws-cdk-lib等)。 - 将构建好的镜像推送到Amazon ECR,然后配置Lambda函数使用该镜像作为运行环境。这种方式适合需要在Lambda中完整运行CDK工作流的场景。
内容的提问来源于stack exchange,提问作者Renato Ramos Nascimento
相关产品推荐
相关产品推荐

