AWS Lambda如何查找并禁用自身的EventBridge事件源触发器
解决方案
核心原因
你之所以查不到对应事件源UUID,是因为EventBridge规则触发Lambda的关联关系保存在EventBridge侧,不属于Lambda服务定义的「事件源映射」范畴,Lambda的list_event_source_mappings接口确实只支持Kinesis、DynamoDB流、SQS、MSK这几类服务的事件源,没法查到EventBridge的关联。
实现方案
不需要反向遍历所有账号资源,直接操作EventBridge的服务接口即可完成规则禁用,步骤如下:
1. 配置Lambda执行角色权限
先给你的Lambda执行角色添加以下权限(示例IAM策略):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "events:ListRules", "events:ListTargetsByRule", "events:DisableRule" ], "Resource": "*" } ] }
2. 代码实现
分两种场景:
场景1:已知EventBridge规则名称、所属事件总线
直接调用disable_rule接口即可,代码示例:
import boto3 events_client = boto3.client('events', region_name='eu-west-1') # 禁用规则 events_client.disable_rule( Name='TriggerMiddleOfMonth', EventBusName='default' # 自定义总线请替换成对应名称 )
场景2:不知道规则名称,自动查找关联当前Lambda的EventBridge规则
遍历当前区域的EventBridge规则,匹配目标为当前Lambda的规则后禁用:
import boto3 def lambda_handler(event, context): events_client = boto3.client('events', region_name='eu-west-1') current_lambda_arn = context.invoked_function_arn # 分页获取所有规则 paginator = events_client.get_paginator('list_rules') for page in paginator.paginate(EventBusName='default'): for rule in page['Rules']: rule_name = rule['Name'] # 查规则的所有目标 targets = events_client.list_targets_by_rule( Rule=rule_name, EventBusName='default' )['Targets'] # 匹配目标是否为当前Lambda for target in targets: if target['Arn'] == current_lambda_arn: # 找到对应规则,禁用 events_client.disable_rule( Name=rule_name, EventBusName='default' ) print(f"已禁用关联规则:{rule_name}")
注意事项
- EventBridge是区域级服务,调用接口的区域要和规则部署区域一致
- 如果使用了自定义事件总线,需要把代码里的
EventBusName替换成对应总线名称 - 如果你的账号下EventBridge规则数量极多,可以给规则加特定标签,先过滤标签再遍历,减少查询次数
内容的提问来源于stack exchange,提问作者and0r
相关产品推荐
相关产品推荐

