Cloudwatch 自定义事件即使在超过 AWS 计划时间后也会立即触发

Cloudwatch custom event triggered instantly even after passing schedule time AWS

我正在尝试使用 aws cloudwatch 事件在 Node js 中进行任务调度,因此,我为此创建了一个 cloudwatch 事件规则,然后我添加了一个 lambda 函数作为目标。我在这里使用事件模式创建一个 cloudwatch 事件规则而不是计划表达式。现在我想在预定的时间向它添加事件,但是一旦将事件放在 cloudwatch 上,事件就会立即触发。我不知道为什么会这样,我研究了很多但没有找到任何相关的东西。

我使用了这些官方文档作为参考:- https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CloudWatchEvents.html#putEvents-property https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/cloudwatch-examples-sending-events.html

我是 AWS 的新手,请在这里帮助我。

这是执行上述操作的代码。

var params = {
        Name: 'DEMO_EVENT',
        RoleArn: 'iamroleArn',
        EventPattern: JSON.stringify({
            source: ['myapp.events'],
        }),
        State: 'ENABLED'
      };
      
      cwevents.putRule(params, function(err, rule) {
        if (err) {
          console.log("Error", err);
        } else {
          console.log("Success", rule.RuleArn);
          var params = {
            Rule: 'DEMO_EVENT',
            Targets: [
              {
                Arn: 'lambda function arn',
                Id: "default"
              }
            ]
          };
          
          cwevents.putTargets(params, function(err, data) {
            if (err) {
              console.log("Error", err);
            } else {
              console.log("Success", data);
              var params = {
                Entries: [
                  {
                    Detail: JSON.stringify({
                      "meetingNo": "82565852285"
                    }),
                    DetailType: 'meeting',
                    Resources: [
                        rule.RuleArn
                    ],
                    Source: 'myapp.events',
                    Time: new Date("2022-01-07T08:00:00Z"), // here I am sending the schedule time in utc
                  }
                ]
              };
              
              cwevents.putEvents(params, function(err, data) {
                if (err) {
                  console.log("Error", err);
                } else {
                  console.log("Success", data.Entries);
                }
              });
            }
          });
        }
      });

这是预期的行为。 PutEvents 立即放置事件。 Time 参数不是调度机制,而是调用者提供除 PutEvents 调用时间之外的时间戳的选项。

EventBridge(以前称为 CloudWatch 事件)does have support for cron expressions and rate expressions, with the PutRule Command

预定规则按设定的周期性间隔生成事件

EventBridge PutRule scheduling works with regular recurring schedules. For instance, a rule with a 0/15 * * * ? * cron expression 将在启用规则的情况下每天每小时 4 次生成具有通用负载的事件。

有效载荷交付的任意调度的替代方案

如果您希望在任意时间使用自定义详细信息引发事件(例如,在 5 天内对该订单记录执行某些操作;或发送事件每个用户的生日),那么预定的 EventBridge 规则是不够的。对于此类“延迟交付”场景,您可以使用计划的事件规则定期轮询数据存储以查找到期的交付。例如,PollingLambda 可以针对每个即将到来的生日依次引发具有 {type:"HappyBirthday", name:"Zaphod", email:...} 负载的自定义事件,第二条规则会将其发送到 SendBirthdayGreetingLambda.