跨账号SAM应用Lambda缺失依赖:CodeBuild如何打包依赖?
Lambda依赖打包与SAM打包报错解决方法
问题背景
通过sam init创建的SAM应用,搭建跨账号AWS CodePipeline流水线后,可正常部署资源,但Lambda函数缺失requests、aws_lambda_powertools等依赖,测试时报错:
"errorMessage": "Unable to import module 'app': No module named 'aws_lambda_powertools'"
同时使用sam package命令时触发参数冲突错误:
Error: Cannot use both --resolve-s3 and --s3-bucket parameters. Please use only one.
解决方案
1. 正确打包Lambda依赖
原构建命令中pip install -r requirements.txt仅将依赖安装到CodeBuild环境,未打包进Lambda部署包。需将依赖安装到Lambda函数目录内,再执行打包:
- 切换到Lambda函数目录(即
hello_world目录) - 使用
pip install将依赖安装到当前目录,指定兼容Lambda运行时的平台参数:
cd hello_world pip install --target . -r requirements.txt --platform manylinux2014_x86_64 --only-binary=:all: cd ..
注:
--platform参数确保安装的依赖兼容AWS Lambda的x86_64运行环境,避免因本地架构差异导致的兼容性问题。
2. 修复SAM打包参数冲突报错
SAM CLI新版本默认启用--resolve-s3参数(自动创建/选择S3存储桶),与显式指定的--s3-bucket冲突。二选一即可:
- 方案A:使用自动存储桶:移除
--s3-bucket参数,让SAM自动处理存储桶:
sam package --template-file template.yaml --output-template-file packaged-template.yml --region $AWS_REGION
- 方案B:指定已有存储桶:添加
--no-resolve-s3参数,禁用自动存储桶功能:
sam package --template-file template.yaml --s3-bucket $ArtifactBucket --output-template-file packaged-template.yml --region $AWS_REGION --no-resolve-s3
修改后的完整buildspec.yaml示例
version: 0.2 phases: build: commands: - echo "Starting SAM packaging `date` in `pwd`" - pip install --upgrade pip - pip install awscli aws-sam-cli # 安装依赖到Lambda函数目录 - cd hello_world - pip install --target . -r requirements.txt --platform manylinux2014_x86_64 --only-binary=:all: - cd .. # 使用SAM打包(二选一) # 方案A:自动存储桶 - sam package --template-file template.yaml --output-template-file packaged-template.yml --region $AWS_REGION # 方案B:指定已有存储桶 # - sam package --template-file template.yaml --s3-bucket $ArtifactBucket --output-template-file packaged-template.yml --region $AWS_REGION --no-resolve-s3 artifacts: files: - packaged-template.yml
内容的提问来源于stack exchange,提问作者Crerem
相关产品推荐
相关产品推荐

