EventBridge规则配置正常,为何未触发Lambda函数?
问题排查:EventBridge规则未触发Lambda捕获CloudTrail资源修改事件
我配置了一条EventBridge规则,用于捕获CloudTrail中的所有资源修改事件,但手动修改资源后未触发关联的Lambda函数。手动用CloudTrail事件测试Lambda时功能正常,Lambda的基于资源的策略配置正确,怀疑问题出在EventBridge规则上,请求协助排查。
事件模式
{ "source": ["aws.*"], "detail-type": ["AWS API Call via CloudTrail"], "detail": { "eventSource": ["*.amazonaws.com"], "eventName": ["Create*", "Delete*", "Update*", "Put*", "Attach*", "Detach*", "Modify*", "Set*"] } }
CloudFormation模板
AWSTemplateFormatVersion: '2010-09-09' Description: CloudFormation template for EventBridge rule 'infrastructure-drift' Resources: EventRule0: Type: AWS::Events::Rule Properties: EventBusName: default EventPattern: source: - aws.* detail-type: - AWS API Call via CloudTrail detail: eventSource: - '*.amazonaws.com' eventName: - Create* - Delete* - Update* - Put* - Attach* - Detach* - Modify* - Set* Name: infrastructure-drift State: ENABLED Targets: - Id: xxx Arn: arn:aws:lambda:eu-west-1:xxx:function:InfrastructureDrift
Lambda函数代码
import json import http.client def format_json(json_data): """ Helper function to format JSON data into a pretty-printed string """ return json.dumps(json_data, indent=4) def lambda_handler(event, context): try: # Extract basic information about the event user_identity = event.get('userIdentity', {}).get('arn', 'Unknown user') event_name = event.get('eventName', 'Unknown event') event_time = event.get('eventTime', 'Unknown time') # Detailed description of the change from requestParameters and responseElements request_details = format_json(event.get('requestParameters', {})) response_details = format_json(event.get('responseElements', {})) # Construct the message to be sent to Teams message = (f"**Event Time:**\n{event_time}\n\n" f"**User:**\n{user_identity}\n\n" f"**Action:**\n{event_name}\n\n" f"**Request Details:**\n```\n{request_details}\n```\n\n" f"**Response Details:**\n```\n{response_details}\n```") # Teams webhook URL webhook_url = 'xxx' conn = http.client.HTTPSConnection("xxx.webhook.office.com") headers = {'Content-type': 'application/json'} payload = json.dumps({ "title": "AWS Resource Change Alert", "text": message }) conn.request("POST", webhook_url, payload, headers) response = conn.getresponse() data = response.read() return data.decode("utf-8") except Exception as e: # Handle generic exceptions and print error details print(f"Error processing event: {str(e)}") return str(e)
排查方向
- CloudTrail事件投递配置检查
- 确认对应区域的CloudTrail是否启用了向Amazon EventBridge发送事件:进入CloudTrail控制台,查看对应跟踪的设置,确保该选项已开启。
- 在CloudTrail事件历史中搜索手动修改资源的操作,确认事件已生成,且
eventName、eventSource等字段符合规则中的匹配模式。
- EventBridge规则模式匹配验证
- 使用EventBridge控制台的测试事件模式功能,导入CloudTrail中实际生成的事件,验证是否能匹配当前规则。
- 尝试将
source字段改为具体服务名(比如["aws.ec2", "aws.s3"])测试,排除通配符aws.*的匹配问题。 - 确认
detail.eventSource的实际值(如ec2.amazonaws.com)是否能被*.amazonaws.com通配符正确匹配。
- 权限与目标配置检查
- 检查Lambda的基于资源的策略,确认
Principal包含events.amazonaws.com,且资源字段为该Lambda的ARN,确保EventBridge有触发权限。 - 确认规则目标的
Id唯一,避免因重复ID导致目标未正确关联。
- 检查Lambda的基于资源的策略,确认
- 区域一致性验证
- 确认CloudTrail事件生成区域、EventBridge规则部署区域、Lambda所在区域一致。若修改的资源在其他区域,而规则仅部署在
eu-west-1,则无法捕获跨区域事件(需配置跨区域事件总线或全局CloudTrail)。
- 确认CloudTrail事件生成区域、EventBridge规则部署区域、Lambda所在区域一致。若修改的资源在其他区域,而规则仅部署在
- 规则状态与日志排查
- 再次确认EventBridge规则状态为
ENABLED。 - 为规则配置CloudWatch日志组,记录规则的匹配与投递日志,查看是否有事件匹配失败或投递错误的信息。
- 再次确认EventBridge规则状态为
内容的提问来源于stack exchange,提问作者pantheon12
相关产品推荐
相关产品推荐

