如何构建AWS CDK应用,实现Lambda导入同根目录Python包?
问题描述
项目目录结构
. ├── infrastructure │ ├── app.py │ ├── stacks │ ├── batch │ └── long_running │ ├── Dockerfile │ ├── app.py │ └── functions │ └── lambda1 │ ├── Dockerfile │ ├── app.py │ └── requirements.txt ├── pyproject.toml └── src ├── myprogram │ ├── __init__.py │ └── core.py
需求
我希望在infrastructure/functions/lambda1/app.py中导入myprogram.core的代码,示例代码如下:
from myprogram.core import SomeClass def lambda_handler(event, context): foo = SomeClass() ...
请问如何配置才能让myprogram包可被我的AWS CDK基础设施应用导入?
解决方法
要让Lambda函数能正常导入myprogram包,需要从本地开发环境和CDK部署打包两个维度配置:
1. 本地开发环境配置(让IDE和本地运行正常识别包)
在项目根目录的pyproject.toml中添加包路径配置,明确myprogram的位置:
[project] name = "your-project-name" version = "0.1.0" packages = [{ include = "myprogram", from = "src" }] [tool.setuptools.package-data] myprogram = ["*.py"]
配置完成后,在项目根目录执行pip install -e .,将myprogram以可编辑模式安装到当前Python环境,此时本地开发时lambda1/app.py就能正常导入包了。
2. Lambda Docker镜像打包配置(确保部署时包含本地包)
因为你的Lambda用Docker镜像部署,需要修改infrastructure/functions/lambda1/Dockerfile,把本地myprogram包纳入镜像:
方法一:直接复制源码到镜像(简单直接)
修改Dockerfile:
# 选用对应版本的Lambda官方基础镜像 FROM public.ecr.aws/lambda/python:3.12 # 复制Lambda函数代码到任务根目录 COPY app.py ${LAMBDA_TASK_ROOT} # 复制本地myprogram包到镜像的Python可识别路径 COPY ../../../../src/myprogram ${LAMBDA_TASK_ROOT}/myprogram # 安装依赖 COPY requirements.txt . RUN pip install -r requirements.txt --target "${LAMBDA_TASK_ROOT}" # 指定Lambda处理程序 CMD ["app.lambda_handler"]
方法二:通过pip安装本地包(更规范)
- 在
infrastructure/functions/lambda1/requirements.txt中添加本地包路径:
../../../../src/
- 修改Dockerfile,确保构建时能访问到项目根目录的
src:
FROM public.ecr.aws/lambda/python:3.12 WORKDIR ${LAMBDA_TASK_ROOT} # 复制依赖清单 COPY requirements.txt . # 复制项目src目录到镜像临时目录 COPY ../../../../src /tmp/src # 安装本地包和其他依赖 RUN pip install -r requirements.txt --target "${LAMBDA_TASK_ROOT}" # 复制Lambda函数代码 COPY app.py . CMD ["app.lambda_handler"]
3. CDK构建上下文配置(确保Docker能找到src目录)
在CDK栈定义文件(比如infrastructure/stacks/xxx-stack.py)中,指定Lambda镜像构建时的上下文为项目根目录,这样Dockerfile能正确访问到上级目录的src:
from aws_cdk import aws_lambda as lambda_ from aws_cdk import DockerImageCode lambda_fn = lambda_.Function( self, "Lambda1", code=DockerImageCode.from_image_asset( "infrastructure/functions/lambda1", # 指定项目根目录为构建上下文,解决路径层级问题 context="../.." ), handler=lambda_.Handler.FROM_IMAGE, runtime=lambda_.Runtime.FROM_IMAGE )
完成以上配置后,不管是本地开发调试,还是部署到AWS,Lambda函数都能正常导入myprogram.core中的代码。
内容的提问来源于stack exchange,提问作者spitfiredd
相关产品推荐
相关产品推荐

