使用AWS CodeCommit与CodeBuild部署Lambda失败:函数未创建
问题:AWS CodePipeline部署Lambda失败且依赖未安装
我通过AWS CodeCommit和AWS CodeBuild部署AWS Lambda函数,流水线执行顺序正常、构建任务成功,但部署阶段出现错误,Lambda函数未按代码定义创建。此外,创建新Lambda函数时,requirements.txt中的Python依赖也未完成安装。
配置文件
buildspec.yml
version: 0.2 env: variables: S3_BUCKET: deployment phases: install: runtime-versions: python: 3.11 commands: - pip install aws-sam-cli build: commands: - sam build post_build: commands: - sam package --s3-bucket $S3_BUCKET --output-template-file packaged.yaml artifacts: files: - packaged.yaml
template.yml
AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Resources: MyLambdaFunction: Type: 'AWS::Serverless::Function' Properties: Handler: lambda_handler.lambda_handler Runtime: python3.11 CodeUri: s3://deployment/packaged.yaml MemorySize: 1024 Timeout: 100 Environment: Variables: PARAM1: "value1" Policies: - AWSLambdaBasicExecutionRole
错误信息
调用CreateFunction操作时发生错误(InvalidParameterValueException):CodeUri无效。S3错误:指定的键不存在。
解决方案
修正template.yml的CodeUri配置
原配置中CodeUri直接写死S3路径是错误的。SAM package会自动将CodeUri替换为打包后上传到S3的实际对象路径,因此template.yml里的CodeUri应指向本地代码目录(比如代码在项目根目录就写./):MyLambdaFunction: Type: 'AWS::Serverless::Function' Properties: Handler: lambda_handler.lambda_handler Runtime: python3.11 CodeUri: ./ # 修改为本地代码路径 MemorySize: 1024 Timeout: 100 Environment: Variables: PARAM1: "value1" Policies: - AWSLambdaBasicExecutionRole确保依赖自动安装
SAM build会自动读取项目根目录的requirements.txt并将依赖安装到构建产物中,只需确保requirements.txt和Lambda代码文件(如lambda_handler.py)在同一目录下即可。若需验证,可在buildspec.yml的build阶段添加命令:- ls .aws-sam/build/MyLambdaFunction/查看输出是否包含依赖包。
检查权限配置
- 确认CodeBuild服务角色拥有目标S3桶的读写权限,能正常上传打包后的代码。
- 确认部署阶段(CloudFormation执行角色)拥有创建Lambda函数、读取S3代码包的权限。
验证packaged.yaml生成
确保SAM package命令成功生成packaged.yaml,且该文件被正确标记为构建产物输出,保证CodePipeline部署阶段能获取到该文件。
内容的提问来源于stack exchange,提问作者Mohil
相关产品推荐
相关产品推荐

