如何正确配置Lambda函数provisionedConcurrentExecutions?
问题根因
预置并发未生效的核心原因是请求最终被路由到了Lambda的$LATEST版本。Lambda有明确硬限制:$LATEST版本不支持预置并发,所有命中该版本的请求都会走按需调度逻辑,执行环境闲置10~15分钟就会被回收,再次请求必然触发冷启动,和你观察到的首次请求10秒、后续请求快、间隔久又回到10秒的现象完全吻合。
现有CDK配置存在两个明确问题:
- 直接使用
lambdaFunction.currentVersion引用版本:该属性创建的Lambda版本资源逻辑ID固定,后续修改函数代码、配置时,CloudFormation不会自动创建新版本,且存在CDK资源解析偏差,会导致API Gateway集成默认指向$LATEST而非配置了预置并发的别名。 - 未显式绑定别名权限与集成目标:CDK自动生成的Lambda集成配置可能出现ARN解析、权限绑定偏差,调用权限被错误绑定到函数本体(即
$LATEST),而非配置了预置并发的别名。
修复方案
- 替换版本创建逻辑:使用
addVersion方法,传入每次部署唯一的后缀(如时间戳、Git提交Hash、代码Hash),确保每次函数更新都会发布新版本,避免发布版本与$LATEST代码不一致。 - 显式为别名添加API Gateway调用权限,避免权限被错误绑定到
$LATEST版本。 - 部署后等待预置并发初始化完成:.NET 6 runtime冷启动耗时较长,2个预置实例通常需要3~5分钟完成初始化,等控制台显示预置并发状态为
Ready后再发起测试。
首先需要在文件头部补充IAM相关依赖导入:
import { ServicePrincipal } from 'aws-cdk-lib/aws-iam';
将configureLambda方法内的版本、别名、集成逻辑替换为如下代码:
private configureLambda(api: RestApi, methodName: string, path: string, memorySize: number = 256): void { const lambdaFunction = new lambda.Function(this, `${methodName}LambdaFunction`, { runtime: lambda.Runtime.DOTNET_6, handler: `ApiGatewayLambda::ApiGatewayLambda.Functions::${methodName}`, code: lambda.Code.fromAsset('ApiGatewayLambda'), timeout: Duration.seconds(30), memorySize: memorySize, reservedConcurrentExecutions: 4 }); // 每次部署生成唯一版本,时间戳作为逻辑ID后缀保证版本强制更新 const version = lambdaFunction.addVersion(`v-${Date.now()}`); const alias = new lambda.Alias(this, `${methodName}Al`, { aliasName: `${methodName}Al`, version: version, provisionedConcurrentExecutions: 2 }); // 显式为别名授予API Gateway调用权限,避免权限绑定到$LATEST alias.addPermission('ApiGatewayInvokeAccess', { principal: new ServicePrincipal('apigateway.amazonaws.com'), sourceArn: api.arnForExecuteApi('POST', `/${path}`) }); const lambdaFunctionIntegration = new LambdaIntegration(alias, { integrationHttpMethod: 'POST' }); const resource = api.root.addResource(path); resource.addMethod('POST', lambdaFunctionIntegration); }
原有配置中reservedConcurrentExecutions: 4的设置是合理的,2个预置并发会从这4个预留并发额度中分配,剩余2个额度可应对突发按需请求,无需修改。
生效验证步骤
部署完成后按以下步骤校验配置:
- 打开Lambda控制台,进入对应函数的别名配置页,确认预置并发状态从
Pending变为Ready,数量为2。 - 进入API Gateway控制台,找到对应API的POST方法集成请求配置,确认Lambda函数ARN带有
:MyLambdaFunctionAl别名后缀,而非无后缀的函数ARN。 - 预置并发状态为
Ready后发起请求,不会出现10秒级冷启动;间隔1小时以上再次发起请求,请求耗时依然稳定在1秒内,CloudWatch日志中不会出现Init Duration字段,即代表配置生效。
内容的提问来源于stack exchange,提问作者Jesús López
相关产品推荐
相关产品推荐

