CDK Pipeline部署Lambda报错S3 NoSuchKey:问题排查与解决
CDK Pipeline部署Lambda时S3资产缺失的解决方法
问题本质
你踩了CDK Pipeline的典型坑:流水线运行在AWS的CodeBuild环境里,只会拉取你Git仓库的代码,本地的dist/构建产物不会自动同步过去。你本地用lambda.Code.fromAsset('dist/')能正常运行是因为本地有构建文件,但流水线里没执行构建步骤,自然没有产物供CDK上传到S3资产桶。
具体修复步骤
1. 给流水线添加构建阶段
首先确保你的package.json里配置了Webpack构建脚本:
{ "scripts": { "build": "webpack --mode production" } }
然后在Pipeline定义中,把构建命令整合到Synth步骤里——CDK Pipeline的Synth步骤本身就是CodeBuild任务,正好可以用来执行代码构建:
import { CodeBuildStep, CodePipeline, CodePipelineSource } from 'aws-cdk-lib/pipelines'; const pipeline = new CodePipeline(this, 'MyPipeline', { synth: new CodeBuildStep('SynthStep', { input: CodePipelineSource.gitHub('你的用户名/你的仓库名', '主分支名'), installCommands: ['npm install'], commands: [ 'npm run build', // 先执行Webpack生成dist/产物 'npx cdk synth' // 再让CDK合成模板,此时会自动把dist/作为资产上传到S3 ] }) });
2. 确认资产路径正确性
lambda.Code.fromAsset('dist/')的路径必须相对于你执行cdk synth的目录(也就是项目根目录,假设Webpack配置是把产物输出到根目录的dist/)。如果只需要特定的代码文件,也可以直接指定单个文件来减少打包体积:
lambda.Code.fromAsset('dist/lambdas-bundle.js')
3. 不要提交dist文件夹到Git
把dist/加入.gitignore,流水线会在构建阶段重新生成产物,避免本地与仓库的产物版本不一致。
4. 权限检查(可选)
默认CDK自举的流水线角色已经拥有S3资产桶的读写权限,但若你使用了自定义角色,需要确保角色具备s3:PutObject、s3:GetObject权限,目标桶为cdk-hnb659fds-assets-[账户ID]-[区域]。
验证方法
- 提交代码触发流水线,查看CodeBuild日志,确认
npm run build步骤成功生成了dist/文件夹 - 登录AWS控制台查看S3资产桶,应该能看到带有哈希值的压缩包(即你的dist产物)
- 流水线部署阶段不再抛出
NoSuchKey错误,Lambda资源可正常创建
内容的提问来源于stack exchange,提问作者RustyTheBoyRobot
相关产品推荐
相关产品推荐

