Serverless配置带时区的定时Lambda:添加method:scheduler后无触发
配置代码
runDailyBatch: handler: src/handlerRunDailyBatch.handler timeout: 20 reservedConcurrency: 1 memorySize: 128 events: # Min, Hr, Day-of-month, Month, Day-of-week, Year - schedule: name: "api-data_pipeline_runner-${opt:stage}-daily" method: scheduler rate: cron(*/3 * * * ? *) # TODO: rate: cron(10 2 * * 1-6 *) timezone: Europe/London input: cause: 'daily' alarms: - name: functionErrors nameTemplate: "$[functionName]_function_errors" iamRoleStatements: - Effect: Allow Action: - states:StartExecution Resource: ${self:resources.Outputs.RunBatchStateMachine.Value} lambdaInsights: true
问题描述
移除method: scheduler和timezone元素后,函数可正常运行,但进入夏令时(DST)时执行时间会出错,不符合需求(当前每3分钟执行仅为测试用例)。按照Serverless官方文档配置使用AWS::Scheduler::Schedule后,仅能在EventBridge中看到调度记录,Lambda无触发且从未执行。请问遗漏了什么配置项?是否是权限问题?若为权限问题,为何没有任何报错信息?
权限缺失是核心原因:使用AWS Scheduler(而非旧版EventBridge Schedule)时,Scheduler服务需要单独的权限来触发Lambda函数。当前配置的IAM角色仅允许调用Step Functions状态机,没有赋予Scheduler调用Lambda的权限。另外,Scheduler的权限问题默认不会在Lambda的日志中显示,需要到Scheduler控制台查看执行记录,或者检查CloudWatch中对应的Scheduler日志组才能发现错误。
需补充的IAM规则:iamRoleStatements: - Effect: Allow Action: - lambda:InvokeFunction Resource: ${self:functions.runDailyBatch.arn}也可以用CloudFormation引用方式:
!GetAtt [runDailyBatchLambdaFunction, Arn],确保资源路径正确指向当前Lambda函数的ARN。确认Scheduler目标配置正确性:启用
method: scheduler后,Serverless会生成AWS::Scheduler::Schedule资源,需检查CloudFormation控制台中该资源的TargetArn字段是否正确指向你的Lambda函数ARN。若变量引用错误,会导致Scheduler无法找到目标函数,自然不会触发执行。保留时区配置的必要性:旧版EventBridge Schedule的时区处理逻辑存在夏令时适配问题,而AWS Scheduler对时区的支持更完善,因此必须保留
method: scheduler和timezone配置才能解决夏令时执行时间错误的问题。
内容的提问来源于stack exchange,提问作者Richard Wheeldon

