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

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]-[区域]。

验证方法

  1. 提交代码触发流水线,查看CodeBuild日志,确认npm run build步骤成功生成了dist/文件夹
  2. 登录AWS控制台查看S3资产桶,应该能看到带有哈希值的压缩包(即你的dist产物)
  3. 流水线部署阶段不再抛出NoSuchKey错误,Lambda资源可正常创建

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:45:03