【问题标题】:Cloudwatch custom event triggered instantly even after passing schedule time AWSCloudwatch 自定义事件即使在经过预定时间 AWS 后也会立即触发
【发布时间】:2022-01-07 08:43:22
【问题描述】:

我正在尝试使用 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);
                }
              });
            }
          });
        }
      });

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda aws-sdk amazon-cloudwatch


    【解决方案1】:

    这是预期的行为。 PutEvents 立即放置事件。 Time 参数不是一种调度机制,而是一种可供调用方提供时间戳而非PutEvents 调用时间的选项。

    EventBridge(以前称为 CloudWatch Events)does have support for cron expressions and rate expressions,带有 PutRule Command

    预定规则以固定的周期性间隔生成事件

    EventBridge PutRule 调度与定期重复调度一起使用。例如,具有0/15 * * * ? *cron expression 的规则将在启用该规则的情况下每天以每小时 4 倍的速度生成具有通用负载的事件。

    任意调度有效载荷传递的替代方案

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

    【讨论】:

    • 很好的建议@fedonev,但是Putrule有一个限制,我们一次只能有300条规则,有什么解决方案吗?由于这个限制,我认为我可以创建一个规则并向其添加多个事件。
    • A rule 要么 (A) 按计划将事件发送到目标(每周二 10 点运行我的 lambda)或 (B) 将事件转发到传入事件与规则模式匹配时的目标(如果从 Lambda A 接收到带有StatusNew Order 的事件,则运行 Lambda B)。在场景 (A) 中,EventBridge 本身引发事件。在 (B) 中,EventBridge 对其他 AWS 服务或PutEvents 发送给它的传入事件采取行动。
    • 我不确定您实际上要解决什么问题。也许编辑您的帖子以添加示例。
    • 我得到了向我的帐户添加更多 cloudwatch 事件规则的解决方案,但仍然感谢您解决了与事件模式相关的事件混淆。这件事在文档中没有明确提到。
    • 在将此答案标记为正确之前,我想再问一件事,有没有办法在单个 cloudwatch 规则中安排多个预定事件?
    猜你喜欢
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    相关资源
    最近更新 更多