CodePipeline中CodeDeploy部署AWS Lambda失败的配置问题求助
看起来你遇到的两个错误其实是相关的,都是Lambda部署流程中的配置问题导致的,我们逐个拆解解决:
1. 解决CodeDeploy的"BundleType must be either YAML or JSON"错误
这个错误的核心原因是CodeDeploy无法正确识别部署包中的appspec配置文件,可能的触发原因有两个:
原因A:CodeBuild打包未将appspec.yml放在部署包根目录
检查你的buildspec.yml的artifacts配置,确保它将所有项目文件(包括appspec.yml)直接打包到zip的根目录,而非嵌套在子文件夹中。正确的配置示例如下:
version: 0.2 phases: build: commands: # 这里放你的构建命令,比如安装依赖 - npm install artifacts: files: - '**/*' # 打包所有文件到根目录 # 不要设置base-directory,否则文件会被放到子文件夹里
如果你的buildspec设置了base-directory,CodeDeploy会找不到根目录下的appspec.yml,从而误判BundleType。
原因B:CodePipeline中CodeDeploy动作的BundleType配置错误
在CodePipeline的CodeDeploy阶段配置中,确认BundleType选项设置为YAML(因为你的appspec是.yml格式)。如果不小心设置成了JSON,就会触发这个错误。
2. 解决手动部署时的"目标Lambda函数不存在或别名找不到"错误
这个错误的根源是appspec.yml的配置逻辑或Lambda资源的实际状态不匹配,具体检查以下几点:
检查1:确认Lambda别名default确实存在
登录AWS Lambda控制台,找到email_submition函数,查看是否有名为default的别名,且该别名已关联到一个有效的函数版本(不能是$LATEST)。如果别名不存在,需要先创建它。
检查2:修正appspec.yml的版本号配置
你的appspec.yml中硬编码了CurrentVersion: "1"和TargetVersion: "2",这是错误的——Lambda的版本号是每次部署自动生成的递增数字,你无法提前预知TargetVersion的值。正确的做法是让CodeDeploy自动处理版本切换,不需要硬写版本号:
version: 0.0 Resources: - email_submition_deployment: # 这里的逻辑名称可自定义,不影响实际部署 Type: AWS::Lambda::Function Properties: Name: "email_submition" Alias: "default"
CodeDeploy会自动将别名指向CodeBuild构建后的Lambda新版本,无需手动指定版本号。同时注意YAML的缩进规范,避免语法错误导致解析失败。
检查3:手动部署时的资源匹配
手动部署时,确保你选择的CodeDeploy应用程序和部署组是关联到email_submition函数的default别名的。如果部署组配置的函数或别名不对,就会出现找不到资源的错误。
3. 两个错误的关联点
实际上,第一个BundleType错误会导致CodeDeploy无法解析appspec,进而无法定位目标Lambda资源,可能间接引发第二个错误。建议先解决第一个错误(确保appspec被正确识别),再验证第二个错误是否消失。
最后可以做个本地测试:将所有项目文件(appspec.yml、index.js等)压缩成zip,通过CodeDeploy控制台手动上传这个zip包进行部署,这样能快速定位是打包问题还是配置问题。
内容的提问来源于stack exchange,提问作者David Gatti

