Amazon web services 在指定的未来时间内,仅调用AWS Lambda函数一次

Amazon web services 在指定的未来时间内,仅调用AWS Lambda函数一次,amazon-web-services,aws-lambda,amazon-cloudwatch,Amazon Web Services,Aws Lambda,Amazon Cloudwatch,我希望能够设置一个调用AWS Lambda函数的时间,然后调用该函数,并且仅在该时间调用该函数。例如,我希望我的Lambda函数在2017年12月19日晚上9:00运行。我不希望它重复,我不希望它现在调用,就在19日晚上9点 我知道CloudWatch提供计划事件,我在想,当输入此提醒的计划时间时,将创建一个CloudWatch计划事件,从现在开始在该时间段内启动(因此,如果您将其计划在晚上8:22运行到晚上9点,则将是38分钟),然后在晚上9点调用Lambda函数,然后删除CloudWatch

我希望能够设置一个调用AWS Lambda函数的时间,然后调用该函数,并且仅在该时间调用该函数。例如,我希望我的Lambda函数在2017年12月19日晚上9:00运行。我不希望它重复,我不希望它现在调用,就在19日晚上9点

我知道CloudWatch提供计划事件,我在想,当输入此提醒的计划时间时,将创建一个CloudWatch计划事件,从现在开始在该时间段内启动(因此,如果您将其计划在晚上8:22运行到晚上9点,则将是38分钟),然后在晚上9点调用Lambda函数,然后删除CloudWatch计划事件。我的问题是,当创建CloudWatch计划事件时,它会立即执行,然后以指定的间隔执行


任何其他想法都将不胜感激,因为我想不出其他解决方案。提前谢谢

您可以使用以下语法计划lambda事件:

cron(年月日分时)

注意:所有字段均为必填字段,时区仅为UTC

详情请参阅此页


感谢通过事件调用lambda函数是异步调用选项。通过使用CloudWatchEvent触发Lambda函数,我们可以使用cron作业,但我们仍然面临问题,因为Lambda函数为同一个cron schedule.PFB链接多次触发:


但这需要在您的帐户中实现Dynamo DB,然后使Lambda函数幂等。

您可以使用DynamoDB
TTL
功能轻松实现此功能,只需执行以下操作:

1-使用
TTL
放置项,即您希望执行或调用lambda函数的确切时间

2-配置
DynamoDB Streams
以在项目的
remove
事件上触发lambda函数

一旦项目/记录即将过期,将调用lambda。您不必删除或清理任何内容,因为dynamodb中的项已经不存在了


注意:然而,该方法易于实施,可扩展性很好,但有一点需要注意;使用
DynamoDB TTL
作为调度机制无法保证精确的时间精度,因为可能存在延迟。计划的任务将在几分钟后执行

如果有人在某个特定的时间和未来的特定数据触发事件,我发现这非常有用


您可以安排一个step函数,该函数可以在使用任意负载调用lambda之前等待到特定的时间点

像这样的

const stepFunctions=new AWS.stepFunctions()
常数有效载荷={
StateMachinern:process.env.SCHEDULED\u LAMBDA\u SF\u ARN,
名称:`${base64.encode(电子邮件)}-${base64.encode(时间戳)}`,//重复数据消除密钥
输入:JSON.stringify({
时间戳,
lambdaName:“myLambdaName”,
lambdaPayload:{
电子邮件,
发起人
},
}),
}
wait stepFunctions.startExecution(有效负载).promise()

我知道现在回答这个问题已经很晚了。但任何想使用CRON表达式触发事件(或调用API)一次的人都可以使用以下示例:

此事件将仅在2025年1月1日-格林威治标准时间12:00:00触发一次

00 12 01 01 ? 2025
对于那些不太了解cron语法的人:

Minutes Hours DayOfMonth Month DayOfWeek Year
我将其与一起使用,结果如下所示:

注意:我不必指定星期几,因为我给了它一个固定的日期,这是显而易见的


也许我误解了文档,但似乎所有针对cron表达式的示例都是重复事件。根据他们的例子,我似乎不想在给定的时间用它调用Lambda函数一次。@EthanHarlig您误解了文档。可以为重复事件和一次性事件设置cron。您必须为任务指定年、月、月日、小时和分钟。@RredCat我明白了!因此,如果我想在12月20日(UTC)下午12:00调用Lambda,我将使用
cron(0 12 20 12*2017)
,这将指定它是2017年12月20日12:00,这与星期几无关?@EthanHarlig我同意RredCat,您可以设置一次,也可以重复。文档不清楚,如果一个日程安排再也不能触发了,它会自动被清理掉吗?把dynamodb和所有这些考虑因素都包含在本质上如此简单的事情上似乎是根本错误的。你真是天才!只要你同意,实际上需要48小时。根据文件:“DynamoDB通常会在过期后48小时内删除过期的项目。过期后项目真正被删除的确切持续时间取决于工作负载的性质和表的大小。已过期但尚未删除的项目仍显示在读取、查询和扫描中。这些项目仍然可以更新,成功更改或删除过期属性的更新将受到尊重。“太好了,谢谢你的主意。这正是我想要的。这是一个非常有趣的方法。我真的很喜欢这样,它也可以将参数传递给Lambda函数,这与cron执行不同。但是,值得考虑的是,手动删除项目也会触发事件。因此,您需要检查Lambda中的ExpirationTime。请记住,每个帐户只能创建100条规则。可以选择请求支持以增加此限制,但这似乎不是为高规模应用而设计的。有谁知道有人在一个账户上使用了10万条这样的规则?