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

如何在CodeBuild中为AWS Lambda函数添加Python依赖库gspread

解决Lambda无法导入gspread的依赖问题

我来帮你搞定这个头疼的依赖问题——Lambda运行时找不到gspread,本质是因为你安装的依赖没被正确打包到Lambda的部署包里。咱们结合你的CodePipeline+CodeBuild+SAM架构,一步步调整配置:

先理清问题根源

你之前尝试手动上传package文件夹、在Build里跑pip install但没成功,核心原因是:

  • SAM默认只会打包template.yml里CodeUri指定目录的内容(你的是source/),根目录的package文件夹根本没被包含进去
  • 之前的Buildspec里,虽然在source目录安装了依赖,但sam package时用的是原始template.yml,而不是sam build生成的编译后模板,导致依赖没被正确上传

解决方案1:调整Buildspec让SAM自动打包依赖

这个方案最直接,让SAM把source目录里的代码+依赖一起打包:

步骤1:确认template.yml的Lambda配置

确保你的Lambda函数的CodeUri指向source/目录,比如:

Resources:
  PropertyTaxInvoiceFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: source/
      Handler: index.lambda_handler
      Runtime: python3.8
      # 其他配置...

步骤2:修改buildspec.yml

重点调整install和post_build阶段,确保依赖安装到source目录,并且用sam build生成的模板来打包:

version: 0.2
phases:
  install:
    commands:
      - echo "[Install phase]"
      - pip install --upgrade pip
      - pip install --upgrade aws-sam-cli
      - sam --version
      # 切换到source目录,把依赖安装到当前目录(和index.py同层级)
      - cd source
      - pip install --target . gspread oauth2client
      - cd .. # 回到根目录准备构建
  runtime-versions:
    python: 3.8
  build:
    commands:
      # 用--use-container模拟Lambda运行环境,避免本地和AWS的依赖差异
      - sam build --use-container
  post_build:
    commands:
      - echo "[Post-Build phase]"
      - export BUCKET=property-tax-invoice-publisher-deployment
      # 注意:这里要使用sam build生成的编译后模板,路径是.aws-sam/build/template.yaml
      - sam package --template-file .aws-sam/build/template.yaml --s3-bucket $BUCKET --output-template-file outputtemplate.yml
      - echo "SAM packaging completed on `date`"
artifacts:
  files:
    - outputtemplate.yml
  discard-paths: yes
cache:
  paths:
    - '/root/.cache/pip'

解决方案2:用Lambda层管理依赖(更推荐)

如果你的多个Lambda函数都需要用到gspread,用Lambda层可以复用依赖,减少部署包大小:

步骤1:修改buildspec.yml添加层的构建

version: 0.2
phases:
  install:
    commands:
      - echo "[Install phase]"
      - pip install --upgrade pip
      - pip install --upgrade aws-sam-cli
      - sam --version
      # 创建Lambda层的标准目录结构:python/lib/pythonX.X/site-packages
      - mkdir -p layer/python/lib/python3.8/site-packages
      # 把依赖安装到层目录里
      - pip install --target layer/python/lib/python3.8/site-packages gspread oauth2client
  runtime-versions:
    python: 3.8
  build:
    commands:
      - sam build --use-container
  post_build:
    commands:
      - echo "[Post-Build phase]"
      - export BUCKET=property-tax-invoice-publisher-deployment
      - sam package --template-file .aws-sam/build/template.yaml --s3-bucket $BUCKET --output-template-file outputtemplate.yml
      - echo "SAM packaging completed on `date`"
artifacts:
  files:
    - outputtemplate.yml
  discard-paths: yes
cache:
  paths:
    - '/root/.cache/pip'

步骤2:在template.yml里定义层并关联Lambda

Resources:
  # 定义gspread依赖层
  GspreadDependenciesLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: Gspread-OAuth2-Deps
      ContentUri: layer/
      CompatibleRuntimes:
        - python3.8
      RetentionPolicy: Retain # 可选:保留层版本,避免误删

  # 你的Lambda函数
  PropertyTaxInvoiceFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: source/
      Handler: index.lambda_handler
      Runtime: python3.8
      # 引用刚才定义的层
      Layers:
        - !Ref GspreadDependenciesLayer
      # 其他配置...

关键注意事项

  1. Python版本一致:CodeBuild用的python:3.8必须和Lambda运行时的Python版本完全一致,否则依赖的编译版本会不兼容
  2. 用--use-container构建:这个参数会让SAM在容器里模拟Lambda的运行环境,避免本地环境和AWS环境的差异导致依赖问题
  3. 删除手动上传的package文件夹:这个文件夹现在没用了,反而容易混淆,提交代码时可以删掉它

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:22:50