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

如何使用.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:05:07