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

如何配置Serverless定时任务:部署10天后开始每日执行

实现部署10天后启动Lambda每日调度的方案

可以实现,但无法直接通过Serverless.yml中静态的schedule事件配置完成——因为cron表达式是静态规则,无法动态基于部署时间计算启动延迟。以下是可行的落地方案:

核心思路

先创建一个禁用状态的每日调度规则,再通过一个辅助Lambda函数,在部署完成后设置10天延迟触发逻辑,到期后自动启用该调度规则。

具体配置步骤

1. 修改Serverless.yml配置

provider:
  name: aws
  runtime: nodejs18.x # 根据你的Lambda运行时调整
  iamRoleStatements:
    - Effect: Allow
      Action:
        - events:PutRule
        - events:PutTargets
        - events:EnableRule
        - events:RemoveTargets
        - events:DeleteRule
      Resource: "*"

functions:
  prerequisites:
    handler: prerequisites.prerequisites
  keyRotation:
    handler: iamKeyRotation.main
  enableSchedule:
    handler: enableSchedule.handler
    events:
      - cloudwatchEvent:
          event:
            source:
              - "aws.cloudformation"
            detail-type:
              - "CloudFormation Stack Status Change"
            detail:
              stack-name:
                - ${self:service}-${self:provider.stage}
              status-details:
                status:
                  - "CREATE_COMPLETE"
                  - "UPDATE_COMPLETE"

resources:
  Resources:
    KeyRotationScheduleRule:
      Type: AWS::Events::Rule
      Properties:
        ScheduleExpression: cron(0 6 * * ? *) # 你原有的每日6点调度规则
        State: DISABLED # 初始设置为禁用状态
        Targets:
          - Arn: !GetAtt KeyRotationLambdaFunction.Arn
            Id: KeyRotationTarget

2. 编写辅助Lambda函数(enableSchedule.handler)

创建enableSchedule.js文件,实现延迟启用调度的逻辑:

const AWS = require('aws-sdk');
const events = new AWS.EventBridge();

exports.handler = async (event) => {
  // 处理CloudFormation部署完成的触发请求
  if (event.source === 'aws.cloudformation') {
    // 计算10天后的时间点
    const tenDaysLater = new Date();
    tenDaysLater.setDate(tenDaysLater.getDate() + 10);
    const scheduleTime = tenDaysLater.toISOString().slice(0, 19).replace('T', ' ');
    
    // 创建一次性触发规则,10天后执行本函数
    const oneTimeRuleName = `EnableKeyRotation-${Date.now()}`;
    await events.putRule({
      Name: oneTimeRuleName,
      ScheduleExpression: `at(${scheduleTime})`,
      State: 'ENABLED'
    }).promise();

    // 将本函数设置为一次性规则的触发目标
    await events.putTargets({
      Rule: oneTimeRuleName,
      Targets: [{
        Id: 'EnableScheduleTarget',
        Arn: process.env.AWS_LAMBDA_FUNCTION_ARN
      }]
    }).promise();
  }

  // 处理10天后的一次性触发请求
  if (event.source === 'aws.events') {
    // 启用每日调度规则
    await events.enableRule({
      Name: 'KeyRotationScheduleRule'
    }).promise();

    // 清理一次性规则(避免资源残留)
    const oneTimeRuleName = event.resources[0].split('/').pop();
    await events.removeTargets({
      Rule: oneTimeRuleName,
      Ids: ['EnableScheduleTarget']
    }).promise();
    await events.deleteRule({
      Name: oneTimeRuleName
    }).promise();
  }

  return { statusCode: 200 };
};

工作流程

  1. 部署Serverless项目时,CloudFormation会创建禁用状态的每日调度规则,以及辅助的enableSchedule函数。
  2. 部署完成(触发CREATE_COMPLETE/UPDATE_COMPLETE状态)时,CloudFormation事件自动触发enableSchedule函数。
  3. enableSchedule函数创建一个一次性EventBridge规则,设置为10天后触发自身。
  4. 10天后,一次性规则触发enableSchedule函数,函数启用之前创建的每日调度规则。
  5. 此后keyRotation函数会按照配置的cron(0 6 * * ? *)每日自动运行。

内容的提问来源于stack exchange,提问作者Alex Pătroi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:20:56