【发布时间】:2021-04-11 23:28:25
【问题描述】:
目前,我的 lambda 函数与附加的一个计划事件一起成功运行。我的 template.yaml 的相关摘录:
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: HelloWorldFunction
Handler: helloworld.App::handleRequest
Runtime: java11
MemorySize: 512
Environment:
Variables:
PARAM1: VALUE
Events:
CronHourlyEvent: # This already works
Type: Schedule
Properties:
Description: Send John Doe
Enabled: True
Schedule: "cron(0 0/1 * * ? *)"
Input: !Sub '{"name": "John Doe"}'
这里每隔一小时触发一次 Lambda,它工作正常。
现在我想添加另一个计划事件,该事件每天中午 12 点触发一次相同的 lambda。一种方法是创建一个单独的 lambda 并将每日计划事件附加到它,但我不想为此创建一个新的 lambda。我希望我可以将两个计划事件附加到同一个 lambda。
我在网上找不到任何将多个计划事件附加到 lambda 的示例,但我认为需要在 template.yaml 文件中添加以下内容:
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: HelloWorldFunction
Handler: helloworld.App::handleRequest
Runtime: java11
MemorySize: 512
Environment:
Variables:
PARAM1: VALUE
Events:
CronHourlyEvent: # this was already present
Type: Schedule
Properties:
Description: Send John Doe
Enabled: True
Schedule: "cron(0 0/1 * * ? *)"
Input: !Sub '{"name": "John Doe"}'
CronDailyEvent: # added this
Type: Schedule
Properties:
Description: Send Jane Doe
Enabled: True
Schedule: "cron(0 12 1/1 * ? *)"
Input: !Sub '{"name": "Jane Doe"}'
我想在本地测试,所以我下载并配置了sam-sdk。但我认为这不支持在本地运行 cron 作业。我能够手动触发事件,但找不到任何根据提供的 cron 表达式自动运行计划作业的规定。
所以我想知道:
- 我们是否可以将 2 个或更多计划/cron 类型的事件附加到 AWS lambda 函数?
- 如果是,我所做的代码更改是否正确?
这将直接投入生产,我似乎无法找到一种在本地测试它的方法。
【问题讨论】:
-
1.是的你可以。 2. 我不确定无服务器框架,但我认为您必须为额外事件创建独立的
AWS::Events::Rule资源。 -
另外,你在这里问是因为你不能做这些改变,因为它会直接投入生产(我什至不会开始解释为什么这个流程是错误的)但你知道你是否可以创建一个带有测试 lambda/rules 的新模板并将其部署到非 prod 以查看它是否有效?
-
只要让规则在整点每小时触发一次 lambda,那么它会在每天中午 12 点触发吗?完全同意上面的评论,你应该有一个测试环境。
-
虽然它是 1 个 lambda,但我不明白,所以当它自动触发时它应该做同样的事情?是因为您将为每个事件发送不同的输入,然后基于此在 lambda 中具有逻辑吗?听起来您可能应该有 2 个单独的 lambda。最好的做法是为小型单一目的执行保留 lambda,它们的启动成本很低。
-
是的,所以从设计的角度来看,我会有 2 个不同的 lambda,唯一的目的是每天清理一次数据库。
标签: amazon-web-services aws-lambda cron serverless-framework serverless