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

如何正确配置Lambda函数provisionedConcurrentExecutions?

问题根因

预置并发未生效的核心原因是请求最终被路由到了Lambda的$LATEST版本。Lambda有明确硬限制:$LATEST版本不支持预置并发,所有命中该版本的请求都会走按需调度逻辑,执行环境闲置10~15分钟就会被回收,再次请求必然触发冷启动,和你观察到的首次请求10秒、后续请求快、间隔久又回到10秒的现象完全吻合。

现有CDK配置存在两个明确问题:

  • 直接使用lambdaFunction.currentVersion引用版本:该属性创建的Lambda版本资源逻辑ID固定,后续修改函数代码、配置时,CloudFormation不会自动创建新版本,且存在CDK资源解析偏差,会导致API Gateway集成默认指向$LATEST而非配置了预置并发的别名。
  • 未显式绑定别名权限与集成目标:CDK自动生成的Lambda集成配置可能出现ARN解析、权限绑定偏差,调用权限被错误绑定到函数本体(即$LATEST),而非配置了预置并发的别名。
修复方案
  1. 替换版本创建逻辑:使用addVersion方法,传入每次部署唯一的后缀(如时间戳、Git提交Hash、代码Hash),确保每次函数更新都会发布新版本,避免发布版本与$LATEST代码不一致。
  2. 显式为别名添加API Gateway调用权限,避免权限被错误绑定到$LATEST版本。
  3. 部署后等待预置并发初始化完成:.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个额度可应对突发按需请求,无需修改。

生效验证步骤

部署完成后按以下步骤校验配置:

  1. 打开Lambda控制台,进入对应函数的别名配置页,确认预置并发状态从Pending变为Ready,数量为2。
  2. 进入API Gateway控制台,找到对应API的POST方法集成请求配置,确认Lambda函数ARN带有:MyLambdaFunctionAl别名后缀,而非无后缀的函数ARN。
  3. 预置并发状态为Ready后发起请求,不会出现10秒级冷启动;间隔1小时以上再次发起请求,请求耗时依然稳定在1秒内,CloudWatch日志中不会出现Init Duration字段,即代表配置生效。

内容的提问来源于stack exchange,提问作者Jesús López

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:48:54