是否可以在lambda上设置多个事件桥规则?

问题描述

我想根据不同的规则触发一个lambda。我可以在Lambda上设置多个事件规则吗?类似于以下内容

mylambda:
    handler: lambdas/mylambda.handler
    description: Reusable lambda 
    iamRoleStatements:
      - Effect: Allow
        Action:
          - events:PutEvents
        Resource:
          - ${ssm:/foo/bar/myEventBus}
    events:
      - eventBridge:
          eventBus: ${ssm:/foo/bar/myEventBusArn}
          pattern:
            source:
              - foo
            detail:
              myKey:
                - bar
      - eventBridge:
          eventBus: ${ssm:/foo/bar/myEventBusArn}
          pattern:
            source:
              - baz
            detail:
              myKey:
                - oof

我发现了这个https://www.serverless.com/framework/docs/providers/aws/events/event-bridge/ 似乎表明这是可能的,但我似乎无法使其正常工作。

我收到以下错误

Failed to create resource. The statement id (mylambda-mylambda-rule) provided already exists. Please provide a new statement id,or remove the existing statement.

解决方法

看起来EventBridge不支持lambda上的多个规则。除非有人知道不同,否则到目前为止我还没有发现任何迹象表明这是可能的。

,

是的,有一点解决方法是可能的。

将规则创建为资源。 将您的 lambda 作为目标添加到创建的规则中。 注意:请确保您拥有最新版本的无服务器框架

functions:

  mylambda:

    handler: lambdas/mylambda.handler

    description: Reusable lambda 

    iamRoleStatements:

      - Effect: Allow

        Action:

          - events:PutEvents

        Resource:

          - ${ssm:/foo/bar/myEventBus}

resources:

  Resources:

    EventbridgeRule1:

      Type: AWS::Events::Rule

      Properties:

        EventBusName: ${ssm:/foo/bar/myEventBusArn}

        EventPattern:

          source:

            - foo

          detail:

            myKey:

              - bar

        Name: rule-1

        Targets:

          - Arn: !GetAtt 

              - MyLambdaLambdaFunction

              - Arn

            Id: MyLambda

    EventbridgeRule2:

      Type: AWS::Events::Rule

      Properties:

        EventBusName: ${ssm:/foo/bar/myEventBusArn}

        EventPattern:

          source:

              - baz

          detail:

            myKey:

              - oof

        Name: rule-2

        Targets:

          - Arn: !GetAtt 

              - MyLambdaLambdaFunction

              - Arn

            Id: MyLambda
,

这会在 EventBridge 上的事件总线中创建规则,但它不会从 lambda 的角度创建 cloud-watch 和 lambda 之间的关联,因此当您将事件放入事件总线时,它永远不会触发 lambda。当您使用默认方式创建 eventbridge 和 lambda 之间的关联时:

 events:
   - eventBridge:
       eventBus: ${env:ORDERS_EVENT_BUS_ARN}
       pattern:
         source:
           - domain.orders

它在 EventBridge 中创建规则,在 lambda 中创建 Cloudwatch 事件关联,您可以在 lambda 配置选项卡中查看。