如何配置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 }; };
工作流程
- 部署Serverless项目时,CloudFormation会创建禁用状态的每日调度规则,以及辅助的
enableSchedule函数。 - 部署完成(触发
CREATE_COMPLETE/UPDATE_COMPLETE状态)时,CloudFormation事件自动触发enableSchedule函数。 enableSchedule函数创建一个一次性EventBridge规则,设置为10天后触发自身。- 10天后,一次性规则触发
enableSchedule函数,函数启用之前创建的每日调度规则。 - 此后
keyRotation函数会按照配置的cron(0 6 * * ? *)每日自动运行。
内容的提问来源于stack exchange,提问作者Alex Pătroi
相关产品推荐
相关产品推荐

