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

无需执行sam build,实现sam local start-api自动加载变更并依赖可用

问题描述

通过以下命令初始化SAM应用:

sam init --app-template hello-world-powertools-python --name sam-app --package-type Zip --runtime python3.12 --no-tracing

在hello_world函数目录内创建虚拟环境管理依赖,目录结构如下:

(venv) $ la hello_world/
total 16
-rw-r--r--  1 xxx  staff     0B Mar 28 14:51 __init__.py
-rw-r--r--  1 xxx  staff   1.2K Mar 28 15:56 app.py
-rw-r--r--@ 1 xxx  staff    47B Mar 28 15:28 requirements.txt
drwxr-xr-x  6 xxx  staff   192B Mar 28 15:07 venv

遇到的矛盾:

  • 执行sam build && sam local start-api时依赖正常加载,但代码变更无法自动同步;
  • 删除.aws_sam目录后直接运行sam local start-api可自动加载代码变更,但出现依赖导入错误:
Invalid lambda response received: Invalid API Gateway Response Keys: {'errorType', 'stackTrace', 'errorMessage', 'requestId'} in {'errorMessage': "Unable to import 
module 'app': No module named 'requests'", 'errorType': 'Runtime.ImportModuleError', 'requestId': 'c2921e8a-34bc-43b4-9c74-b6b434f5c346', 'stackTrace': []} 

需求:不将依赖与源码放在同一目录的前提下,实现代码热加载+依赖正常可用。

解决方案

方法一:热加载模式配合容器构建(快速生效)

  1. 激活虚拟环境并安装依赖:
source hello_world/venv/bin/activate
pip install -r hello_world/requirements.txt
deactivate
  1. 执行以下命令启动本地API,同时开启热加载:
sam build --use-container && sam local start-api --watch
  • --use-container:确保依赖是针对Lambda运行环境构建的,避免本地环境与Lambda环境的依赖兼容性问题;
  • --watch:开启代码热加载,修改hello_world目录下的代码后,SAM会自动重新构建并更新服务。

方法二:配置PYTHONPATH指向虚拟环境

  1. 修改template.yaml中HelloWorldFunction的配置,添加环境变量指定依赖搜索路径:
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.12
      Environment:
        Variables:
          PYTHONPATH: "/var/task:/var/task/venv/lib/python3.12/site-packages"
  1. 直接启动带热加载的本地API:
sam local start-api --watch

注意:必须保证虚拟环境的Python版本与Lambda运行时版本(python3.12)完全一致,否则可能出现依赖无法识别的问题。

方法三:Lambda层管理依赖(长期项目推荐)

将依赖打包成独立的Lambda层,与代码分离,既能满足依赖不与源码同目录的要求,又能实现热加载:

  1. 创建层目录并安装依赖:
mkdir -p layers/python/lib/python3.12/site-packages
source hello_world/venv/bin/activate
pip install -r hello_world/requirements.txt -t layers/python/lib/python3.12/site-packages
deactivate
  1. 修改template.yaml,添加层资源并关联到函数:
Resources:
  DependenciesLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: HelloWorldDependencies
      ContentUri: layers/
      CompatibleRuntimes:
        - python3.12
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.12
      Layers:
        - !Ref DependenciesLayer
  1. 启动带热加载的本地API:
sam build --watch && sam local start-api
  • 层的目录结构必须遵循python/lib/<runtime>/site-packages格式,SAM才能正确识别;
  • 修改依赖时只需更新层目录内容并重新构建,代码变更依然会被自动热加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:44:51