在AWS Amplify部署自定义CDK Lambda时遇S3桶不存在错误
解决Amplify+CDK部署Lambda时S3资产桶不存在的问题
问题核心
你遇到的是CDK自动生成的资产桶未被正确创建导致的Lambda部署失败。使用lambda.Code.fromAsset加载本地代码时,CDK会默认创建名为cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}的桶来存放打包后的代码,但Amplify的自定义CDK资源流程可能未触发这个桶的创建步骤,导致CloudFormation部署时找不到目标桶。
解决方案
1. 手动触发CDK资产桶创建
进入你的自定义CDK资源目录(比如amplify/backend/custom/your-custom-resource),执行以下命令:
cdk bootstrap aws://<你的AWS账号ID>/<部署区域>
这个命令会自动创建CDK所需的资产桶,以及配套的IAM角色和权限配置,确保后续打包的Lambda代码能正确上传到桶中。
2. 重新部署Amplify资源
回到项目根目录,重新执行部署命令:
amplify push
此时CDK会将你的Lambda代码打包并上传到刚创建的资产桶,CloudFormation就能正常找到S3对象,不会再报NoSuchBucket错误。
额外排查要点
- 升级Amplify CLI:确保使用最新稳定版,旧版本可能存在CDK集成的兼容性问题,升级命令:
npm install -g @aws-amplify/cli - 验证本地代码目录:确认
../myfunction/目录存在,且包含正确的index.js(或TypeScript编译后的产物),避免打包失败导致资产未上传 - 清理手动创建的桶:如果之前手动创建过同名的S3桶,先删除它——CDK需要自行管理这个桶的配置和权限,手动创建的桶可能不符合要求
代码与报错参考
你的Lambda定义代码:
import * as cdk from 'aws-cdk-lib'; import * as AmplifyHelpers from '@aws-amplify/cli-extensibility-helper'; import { Construct } from 'constructs'; import * as lambda from 'aws-cdk-lib/aws-lambda'; import path from "path" export class cdkStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps, amplifyResourceProps?: AmplifyHelpers.AmplifyResourceProps) { super(scope, id, props); new cdk.CfnParameter(this, 'env', { type: 'String', description: 'Current Amplify CLI env name', }); const amplifyProjectInfo = AmplifyHelpers.getProjectInfo(); const funcResourceNamePrefix = `func-${amplifyProjectInfo.projectName}`; const func = new lambda.Function(this, 'MyFunction', { runtime: lambda.Runtime.NODEJS_16_X, handler: 'index.handler', code: lambda.Code.fromAsset(path.join(__dirname, '../myfunction/')), functionName: `${funcResourceNamePrefix}-${cdk.Fn.ref('env')}`, }); } }
CloudFormation中Lambda指向的资产桶定义:
"MyFunction3BAA72D1": { "Type": "AWS::Lambda::Function", "Properties": { "Code": { "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, "S3Key": "c4b0207499ed4bf5fa0062eeeab46178e1968835fa4a82c11da08a81bdcad438.zip" }, "Role": { "Fn::GetAtt": [ "MyFunctionServiceRole3C357FF2", "Arn" ] }, "FunctionName": { "Fn::Join": [ "", [ "func-testapp-", { "Ref": "env" } ] ] }, "Handler": "index.handler", "Runtime": "nodejs16.x" } }
内容的提问来源于stack exchange,提问作者wasilewitz
相关产品推荐
相关产品推荐

