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

如何构建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安装本地包(更规范)

  1. 在infrastructure/functions/lambda1/requirements.txt中添加本地包路径:
../../../../src/
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:36:23