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

如何使用CDK与TypeScript解决Lambda冷启动(预热)问题

解决方案总览

针对Lambda冷启动问题,结合并发支持、成本控制的需求,有两类落地性极强的方案,无需第三方插件,直接通过CDK原生能力即可实现:


方案1:原生预置并发(适合流量稳定场景)

这是AWS官方提供的冷启动解决方案,无需维护额外业务逻辑,直接在CDK中配置即可实现固定数量的Lambda实例持续处于热启动状态,天然支持并发。

  • 优缺点:无需额外开发,稳定性高,但预置的实例即使空闲也会计费,成本高于自定义预热方案
  • CDK配置示例:
const lambda = new aws.lambda.Function("mylambda", {
    code: lambda.Code.fromAsset("/src"),
    handler: "handler",
    timeout: 30
});

// 发布固定版本,预置并发仅支持绑定版本/别名
const lambdaVersion = lambda.currentVersion;
// 配置对应数量的预置并发,数值根据业务峰值并发需求调整
new aws.lambda.Alias(this, 'ProdAlias', {
  aliasName: 'prod',
  version: lambdaVersion,
  provisionedConcurrentExecutions: 5
});

方案2:自定义定时预热(适合流量波动大、成本敏感场景)

即你询问的定时调用Lambda的实现方式,通过CDK自带的EventBridge Scheduler实现定时触发,成本极低(EventBridge定时触发有免费额度,单次Lambda预热调用耗时极短,费用可忽略),可自定义并发预热数量。

  • 配置逻辑:每间隔固定时间触发一次Lambda,同时启动指定数量的实例保持热状态,Lambda内部识别预热请求直接返回,不执行业务逻辑
  • 第一步:CDK新增定时触发配置
import * as scheduler from 'aws-cdk-lib/aws-scheduler';
import * as iam from 'aws-cdk-lib/aws-iam';

// 授予Scheduler调用Lambda的权限
lambda.addPermission('AllowSchedulerInvoke', {
  principal: new iam.ServicePrincipal('scheduler.amazonaws.com'),
  action: 'lambda:InvokeFunction'
});

// 配置预热规则,示例为每3分钟触发一次
new scheduler.CfnSchedule(this, 'LambdaWarmupSchedule', {
  flexibleTimeWindow: { mode: 'OFF' },
  scheduleExpression: 'rate(3 minutes)',
  target: {
    arn: lambda.functionArn,
    roleArn: new iam.Role(this, 'SchedulerExecutionRole', {
      assumedBy: new iam.ServicePrincipal('scheduler.amazonaws.com'),
      inlinePolicies: {
        invokeLambda: new iam.PolicyDocument({
          statements: [
            new iam.PolicyStatement({
              actions: ['lambda:InvokeFunction'],
              resources: [lambda.functionArn]
            })
          ]
        })
      }
    }).roleArn,
    // 传入预热标识与需要预热的并发数
    input: JSON.stringify({ warmup: true, concurrency: 3 })
  }
});
  • 第二步:Lambda代码新增预热逻辑判断
import { Lambda } from 'aws-sdk';
const lambda = new Lambda();

export const handler = async (event: any) => {
  // 识别预热请求,直接返回不执行业务逻辑
  if (event.warmup) {
    // 启动指定数量的并发实例预热
    if (event.concurrency && event.concurrency > 1) {
      const invokes = Array.from({length: event.concurrency - 1}, () => 
        lambda.invoke({
          FunctionName: process.env.AWS_LAMBDA_FUNCTION_NAME!,
          InvocationType: 'Event',
          Payload: JSON.stringify({ warmup: true })
        }).promise()
      );
      await Promise.all(invokes);
    }
    return { statusCode: 200, body: 'warmed' };
  }

  // 原有业务逻辑保留在此处
};

方案选择建议

  • 业务流量稳定、对冷启动容忍度极低的场景优先选择原生预置并发
  • 流量波动大、非工作时段请求量极低的场景优先选择定时预热方案,成本仅为预置并发的1/10不到
  • 可两种方案混合使用,高峰时段开启预置并发,低峰时段切换为定时预热,进一步控制成本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:06:07