如何使用.NET Core在AWS EventBridge Scheduler中创建定时调度事件?
使用Amazon.Scheduler SDK实现EventBridge Scheduler定时调度事件
1. 安装NuGet包
首先安装官方的Amazon.Scheduler SDK包:
dotnet add package Amazon.Scheduler
或通过NuGet包管理器直接搜索安装Amazon.Scheduler。
2. 初始化Scheduler客户端
使用AWS默认凭证链(环境变量、本地凭证文件、IAM角色等)初始化客户端:
using Amazon.Scheduler; using Amazon.Scheduler.Model; var schedulerClient = new AmazonSchedulerClient();
如需指定区域或自定义凭证配置,可传入参数:
var config = new AmazonSchedulerConfig { RegionEndpoint = Amazon.RegionEndpoint.USWest2 }; var schedulerClient = new AmazonSchedulerClient(config);
3. 创建调度任务
3.1 一次性定时任务(指定时间触发)
创建一个在特定时间触发的任务,目标为Lambda函数:
var createRequest = new CreateScheduleRequest { Name = "OneTimeOrderReminder", // 全局唯一的调度任务名称 ScheduleExpression = "at(2024-10-15T14:30:00)", // UTC时间的ISO8601格式触发时间 Target = new Target { Arn = "arn:aws:lambda:us-west-2:123456789012:function:SendReminderLambda", // 目标资源ARN RoleArn = "arn:aws:iam::123456789012:role/SchedulerInvokeLambdaRole" // 有权限调用目标的IAM角色ARN }, Description = "一次性发送订单提醒的调度任务" }; var createResponse = await schedulerClient.CreateScheduleAsync(createRequest); Console.WriteLine($"调度任务创建成功,ARN: {createResponse.ScheduleArn}");
3.2 周期性定时任务(按规则重复触发)
创建一个每天中午12点(UTC时间)触发的任务,目标为SQS队列:
var recurringRequest = new CreateScheduleRequest { Name = "DailyInventorySync", ScheduleExpression = "cron(0 12 * * ? *)", // Cron表达式,UTC每天12点触发 Target = new Target { Arn = "arn:aws:sqs:us-west-2:123456789012:InventorySyncQueue", RoleArn = "arn:aws:iam::123456789012:role/SchedulerSendSqsRole", Input = "{\"syncType\": \"full\"}" // 发送到SQS的自定义消息内容 }, FlexibleTimeWindow = new FlexibleTimeWindow { Mode = FlexibleTimeWindowMode.OFF } // 关闭弹性窗口,严格按时间触发 }; var recurringResponse = await schedulerClient.CreateScheduleAsync(recurringRequest);
4. 处理调度触发的事件
以Lambda为例,编写处理Scheduler触发请求的逻辑:
using Amazon.Lambda.Core; [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] public class Function { public async Task FunctionHandler(SchedulerEvent input, ILambdaContext context) { context.Logger.LogInformation($"收到Scheduler触发事件:{input.DetailType}"); // 执行自定义业务逻辑,例如发送提醒、同步数据等 await ProcessReminder(input); } private async Task ProcessReminder(SchedulerEvent input) { // 此处编写业务处理代码 } } // Scheduler触发事件的模型类 public class SchedulerEvent { public string DetailType { get; set; } public string Source { get; set; } public string Detail { get; set; } // 可根据实际需求添加其他字段 }
5. 常用操作
更新调度任务
var updateRequest = new UpdateScheduleRequest { Name = "OneTimeOrderReminder", ScheduleExpression = "at(2024-10-16T10:00:00)", // 修改触发时间 Target = new Target { Arn = "arn:aws:lambda:us-west-2:123456789012:function:SendReminderLambda", RoleArn = "arn:aws:iam::123456789012:role/SchedulerInvokeLambdaRole" } }; await schedulerClient.UpdateScheduleAsync(updateRequest);
删除调度任务
var deleteRequest = new DeleteScheduleRequest { Name = "OneTimeOrderReminder" }; await schedulerClient.DeleteScheduleAsync(deleteRequest);
列出所有调度任务
var listRequest = new ListSchedulesRequest { MaxResults = 10 }; var listResponse = await schedulerClient.ListSchedulesAsync(listRequest); foreach (var schedule in listResponse.Schedules) { Console.WriteLine($"调度任务:{schedule.Name},触发规则:{schedule.ScheduleExpression}"); }
关键注意事项
- IAM权限:Scheduler使用的角色必须拥有调用目标资源的权限,例如调用Lambda需
lambda:InvokeFunction权限,发送SQS消息需sqs:SendMessage权限。 - 时间配置:
at表达式需使用UTC时间的ISO8601格式;Cron表达式默认使用UTC时间,如需本地时间可添加时区参数(如cron(0 12 * * ? *) TZ=America/New_York)。 - 弹性时间窗口:若允许任务在指定时间前后一定范围内触发,可设置
FlexibleTimeWindow.Mode = FlexibleTimeWindowMode.FLEXIBLE并指定MaximumWindowInMinutes。
内容的提问来源于stack exchange,提问作者user3172359
相关产品推荐
相关产品推荐

