首页 > 编程问答 >带有 CDK 的 Lambda 无法启动 - JSONDecodeError 和 BrokenPipeError

带有 CDK 的 Lambda 无法启动 - JSONDecodeError 和 BrokenPipeError

时间:2024-07-25 07:18:36浏览次数:15  
标签:python aws-lambda aws-cdk

我正在尝试部署一个基于图像的 Python Lambda,其中包含 AWS CDK 库。 当我尝试在 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" ]

这会在我的本地计算机上使用 Docker 启动并运行得很好。 它可以很好地部署到 AWS,但是当调用该函数时,我在日志中看到这些消息:

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 函数试图在执行期间导入和使用 aws-cdk 库。 aws-cdk 库用于 定义 的基础设施,而不是在 Lambda 函数内 运行时 。在 Lambda 函数中包含 CDK 会导致大型部署工件和不必要的依赖项,最终导致看到 JSONDecodeError BrokenPipeError 错误,因为 NodeJS 运行时无法在初始化阶段正确启动。

以下是如何解决此问题的步骤:

  1. 从 Lambda 函数代码中删除 aws-cdk
  2. 从的 requirements.txt 文件中删除 aws-cdk
  3. 从的 Dockerfile 中删除 RUN npm install -g aws-cdk 行。
  4. 确保的 Lambda 函数代码本身不导入或使用 aws-cdk 中的任何内容。

  5. 使用 CDK 单独部署的基础设施:

  6. 使用 CDK 定义的 Lambda 函数以及的任何其他基础设施(例如,API 网关、DynamoDB 表等)。
  7. 使用 cdk deploy 将的基础设施部署到 AWS。

  8. 将 CDK 生成的 Lambda 函数代码与的业务逻辑分开:

  9. CDK 将生成一个包含的 Lambda 函数定义的 Python 文件(例如, lambda.py )。将此文件与的 CDK 代码分开保存。
  10. 将的业务逻辑放入一个单独的文件(例如, main.py )中。
  11. lambda.py 中,导入 main.py 并调用的处理程序函数。

示例:

lambda.py (由 CDK 生成):

from aws_cdk import (
    aws_lambda as _lambda,
)
import path as path

# ... 其他 CDK 构造 ...

# 定义 Lambda 函数
my_lambda = _lambda.Function(self, 'MyLambda',
    runtime=_lambda.Runtime.PYTHON_3_12,
    handler='main.lambda_handler',
    code=_lambda.Code.from_asset(path.join(__dirname, 'lambda_code')),
)

lambda_code/main.py (的 Lambda 函数逻辑):

import json

def lambda_handler(event, context):
    # 的业务逻辑在这里...

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

Dockerfile:

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

RUN pip install -r lambda_code/requirements.txt
CMD [ "main.lambda_handler" ]

通过这种方式,将 CDK 用于基础设施管理,并将的 Lambda 函数代码与其分离,从而避免不必要的依赖项和错误。

标签:python,aws-lambda,aws-cdk
From: 78790622

相关文章

  • Python multiprocessing.connection.Connection 的行为不符合规范
    根据python规范,recv()pythonConnection的方法,(从multiprocessing.Pipe()返回,当管道为空且管道的另一端关闭时抛出EOFError(这里参考:https://docs.python.org/3.9/library/multiprocessing.html#multiprocessing.connection.Connection.re......
  • 使用 python Flask 发送邮件中的图像
    我想发送一封包含html代码和图像的电子邮件但在gmail中它说图像已附加,我不想要这样,我只想要电子邮件正文中的图像。html_content=f"<imgsrc="cid:banner"alt=""style="width:80%;">"msg=MIMEMultipart('related')html_part=MIMEText(html_c......
  • 在 python requests modul 中,如何检查页面是否使用“POST”方法或“GET”方法
    如何使用python“requests”模块检查页面是否使用“GET”方法或“POST”方法。我期望输出为True或False,或者GET或Post预期代码:importrequestsurl=f"www.get_example.com"response=requests.get(url)ifresponse.check_get==True:print("get")你......
  • VS Code Python - 如果括号(括号、大括号等)未关闭,内联建议不起作用
    我遇到的问题是,当我在未闭合的括号或方括号“内部”开始变量名称时,VSCode将不会显示任何建议。但是,如果在键入变量名称之前闭合括号,则建议效果很好。如果我可以避免它,我宁愿不将自动完成括号关闭设置为True也不使用TabOut扩展。第一个屏幕截图显示建议在闭括号/方......
  • 在 Azure 上部署代码时使用 Python 的多处理模块是否有意义?
    我们的团队在Azure机器学习(AML)上部署了一个Python脚本来处理存储在Azure存储帐户上的文件。我们的管道由一个ForEach活动组成,该活动调用每个或列出的文件的Python脚本。从Azure数据工厂(ADF)运行它会触发多个单独的管道同时运行......
  • 我已成功安装 pypdf2 但无法将其导入到我的 python 文件中
    我已经成功安装了pypdf2模块,但在导入它时,我发现该模块丢失了。我尝试使用fromPyPDF2importPdfReader导入,但它不起作用此问题的各种解决方案是什么?在尝试导入PyPDF2时遇到问题。以下是可能导致此问题的一些常见原因和解决方案:安......
  • Python3打开图片时请求ConnectionResetError(10054)
    我试图从'http://xxx.jpg'之类的网站下载图片。代码:headers={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/66.0.3359.139Safari/537.36'}url='http://xxx.jpg'resp......
  • Jupyter Notebook 环境中的 Python 版本不匹配
    我遇到Jupyter笔记本启动横幅中报告的Python版本与我在笔记本中查询python--version时显示的版本之间的差异。启动横幅指示Python3.11.9,但是当我运行!python--version时,它返回Python3.11.7。我所做的步骤:basecondahas3.11.7versio......
  • Python XML 解析:字符串中的“<”被阻塞
    我有一个使用ET.XMLParser来解析CppCheckXML报告文件的Python模块。当尝试解析字符串中包含“<”的XML元素中的属性之一时,它会令人窒息,它会将其解释为格式错误的XML,例如:<errormsg="Includefile<iostream>notfound.">(注意字符和“iostream”之间的空格必须放......
  • 任意几行代码要成为Python中的函数需要什么?
    我正在上一门计算机科学课,我的任务是创建一个程序来实现一个带有参数的函数。我的老师告诉我,下面的代码不是一个函数,这让我很困惑,对于将某些代码行归类为“函数”所需的条件,我感到很困惑。defgame(numbers,max_turns,pfl,tgl):turns=0flag=Falseprint("You......