问题描述
我想根据不同的规则触发一个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 配置选项卡中查看。