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

基于镜像的Python Lambda集成CDK启动失败:JSONDecodeError与BrokenPipeError

问题描述

尝试部署包含AWS CDK库的镜像版Python Lambda函数,本地Docker运行正常,部署到AWS后调用启动失败。

使用的Dockerfile:

FROM amazon/aws-lambda-python:3.12
COPY * ${LAMBDA_TASK_ROOT}/

RUN dnf update -y
RUN dnf install -y git
RUN curl -sL https://rpm.nodesource.com/setup_20.x | bash -
RUN dnf install -y nodejs
RUN npm install -g aws-cdk

RUN --mount=type=secret,id=gitconfig,target=/root/.gitconfig pip install -r requirements.txt
CMD [ "main.lambda_handler" ]

调用时的日志错误:

INIT_REPORT Init Duration: 10005.00 ms  Phase: init Status: timeout

[ERROR] JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Traceback (most recent call last):
  File "/var/lang/lib/python3.12/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 995, in exec_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "/var/task/main.py", line 5, in <module>
    import aws_cdk as cdk
  File "/var/lang/lib/python3.12/site-packages/aws_cdk/__init__.py", line 1519, in <module>
    from ._jsii import *
  File "/var/lang/lib/python3.12/site-packages/aws_cdk/_jsii/__init__.py", line 21, in <module>
    __jsii_assembly__ = jsii.JSIIAssembly.load(
  File "/var/lang/lib/python3.12/site-packages/jsii/_runtime.py", line 55, in load
    _kernel.load(assembly.name, assembly.version, os.fspath(assembly_path))
  File "/var/lang/lib/python3.12/site-packages/jsii/_kernel/__init__.py", line 299, in load
    self.provider.load(LoadRequest(name=name, version=version, tarball=tarball))
  File "/var/lang/lib/python3.12/site-packages/jsii/_kernel/providers/process.py", line 354, in load
    return self._process.send(request, LoadResponse)
  File "/var/lang/lib/python3.12/site-packages/jsii/_kernel/providers/process.py", line 332, in send
    self._next_message(), _ProcessResponse
  File "/var/lang/lib/python3.12/site-packages/jsii/_kernel/providers/process.py", line 251, in _next_message
    return json.loads(self._process.stdout.readline(), object_hook=ohook)
  File "/var/lang/lib/python3.12/json/__init__.py", line 359, in loads
    return cls(**kw).decode(s)
  File "/var/lang/lib/python3.12/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/var/lang/lib/python3.12/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None

Exception ignored in atexit callback: <bound method _NodeProcess.stop of <jsii._kernel.providers.process._NodeProcess object at 0x7f7608954da0>>

Traceback (most recent call last):

File "/var/lang/lib/python3.12/site-packages/jsii/_kernel/providers/process.py", line 295, in stop

self._process.stdin.close()

BrokenPipeError: [Errno 32] Broken pipe

INIT_REPORT Init Duration: 111268.11 ms Phase: invoke   Status: error   Error Type: Runtime.Unknown

START RequestId: 6930a835-0ac0-55be-aa00-f72e6fd53c01 Version: $LATEST

Unknown application error occurred
Runtime.Unknown

END RequestId: 6930a835-0ac0-55be-aa00-f72e6fd53c01

猜测可能是NodeJS运行时未正常启动,但无法进一步排查。

解决方案
  • 调整Lambda初始化超时时间:默认初始化超时为10秒,日志显示首次初始化已超时(10005ms),后续甚至达到111秒。在Lambda控制台或部署配置中,将初始化超时设置为最大值300秒(5分钟),给足够时间加载CDK依赖和启动JSII Node进程。
  • 移除不必要的全局AWS CDK安装:Python的aws_cdk包已经包含JSII运行所需的组件,全局安装aws-cdk CLI完全多余,会增加镜像大小和初始化时间。修改Dockerfile,删除RUN npm install -g aws-cdk这一步。
  • 确保Node环境在Lambda中可访问:Lambda的执行环境PATH可能不包含全局npm包路径,但这里我们只需要Node运行时。可以在Dockerfile中添加ENV PATH="/usr/local/bin:$PATH"确保Node可被JSII找到,或者在Lambda初始化时打印环境变量和Node版本,确认Node正常可用。
  • 优化镜像构建步骤:合并Dockerfile中的RUN命令,减少镜像层数,同时清理无用缓存。比如将更新和安装包合并:
RUN dnf update -y && dnf install -y git nodejs && dnf clean all

这样可以减小镜像体积,加快部署和初始化速度。

  • 添加调试日志排查Node问题:在main.py开头添加调试代码,捕获Node运行状态:
import os
import subprocess

# 打印Node版本和PATH
node_version = subprocess.run(['node', '--version'], capture_output=True, text=True)
print(f"Node version output: {node_version.stdout}")
print(f"Node error (if any): {node_version.stderr}")
print(f"Current PATH: {os.environ['PATH']}")

查看Lambda日志,确认Node是否能正常执行,是否有隐藏报错。

内容的提问来源于stack exchange,提问作者ZacD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:35:56