You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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导致目标未正确关联。
  • 区域一致性验证
    • 确认CloudTrail事件生成区域、EventBridge规则部署区域、Lambda所在区域一致。若修改的资源在其他区域,而规则仅部署在eu-west-1,则无法捕获跨区域事件(需配置跨区域事件总线或全局CloudTrail)。
  • 规则状态与日志排查
    • 再次确认EventBridge规则状态为ENABLED。
    • 为规则配置CloudWatch日志组,记录规则的匹配与投递日志,查看是否有事件匹配失败或投递错误的信息。

内容的提问来源于stack exchange,提问作者pantheon12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 13:54:59