我们已经设置了一个EventBridge,用于触发Lambda。它应该在每天的上午9:30(根据本地时间,对我而言是美国东部标准/夏令时)运行。问题是,EventBridge似乎是按UTC设置日期的。有没有办法使其始终基于特定的时区?例如,无论季节如何,始终在上午9:30运行?
更新时间: 2022年11月
使用EventBridge调度器,您可以按照特定的日期时间和时区安排事件。还支持一次性计划。
介绍Amazon EventBridge Scheduler - AWS博客
原始内容:2021年7月
要么安排另一个事件来调整第一个事件,要么在美国东部标准时间(EST)和美国东部夏令时(EDT)都执行lambda函数,并让lambda函数决定应该运行哪个事件。
在当地时间早上2点和3点分别运行另一个lambda函数,可以调整第一个lambda函数的日光节约时间表。您可以使用lambda语言的实现来决定是否需要调整事件。
您也可以将原始的lambda函数安排在经过夏令时调整和未经过夏令时调整的两个时间点同时运行(即美国东部夏令时对应的UTC时间为14:30,美国东部标准时间对应的UTC时间为13:30)。然后根据日历检查,lambda函数可以决定是否是适当的时间来执行。
我更喜欢第一种选择,因为它清晰地分离了职责。
所有预定事件都使用 UTC时区 ,计划的最小精度为1分钟。
您需要自定义解决方案来实现所需操作。例如,让AWS EventBridge触发lambda函数,该函数基于其将UTC转换为本地时间的结果来评估应触发的其他内容。
正如在另一个答案中所述,可以使用EventBridge Scheduler
实现此功能。 在下面的示例中,我使用CDK在周一至周五的早上6点和8点安排了一个lambda。
// Lambda
const func = new NodejsFunction(this, 'func-id', {
runtime: Runtime.NODEJS_18_X
});
// Role
const role = new Role(this, 'role-id', {
managedPolicies: [{ managedPolicyArn: 'arn:aws:iam::aws:policy/service-role/AWSLambdaRole' }],
assumedBy: new ServicePrincipal('scheduler.amazonaws.com')
});
// EventBridge Schedule
new CfnSchedule(this, 'schedule-id', {
flexibleTimeWindow: {
mode: 'OFF',
},
scheduleExpression: 'cron(0 6,8 ? * MON-FRI *)',
scheduleExpressionTimezone: 'Europe/Amsterdam',
target: {
arn: func.functionArn,
roleArn: role.roleArn,
},
});