AWS SAM中EventBridge未触发Lambda函数问题求助
问题分析和修复方案
主要问题1:EventBridge规则的匹配模式写错了
你的SAM模板里的规则模式有两处错误,导致S3上传事件根本匹配不上:
- 桶名字段路径错了:S3发给EventBridge的事件里,桶名存在
detail.bucket.name里,不是你写的detail.requestParameters.bucketName——这个路径是CloudTrail事件里的格式,和S3直接发EventBridge的事件格式不一样。 - 事件名称配置混乱:你在SAM里写的是
PutObject这类具体操作,但实际生成的规则变成了Object Created。其实Object Created是事件的大类(对应detail-type字段),而PutObject是具体操作(对应detail.eventName字段),你需要把这两个字段区分开配置。
主要问题2:目标S3桶没开EventBridge事件通知
默认情况下S3不会主动把事件发给EventBridge,必须给桶开启这个功能才行,要么手动在控制台开,要么在SAM里配置。
改好后的SAM代码示例
TimeFunction: Type: AWS::Serverless::Function Properties: FunctionName: cc-dummy-eventbridge-lambda Handler: lambda_function.lambda_handler Runtime: python3.9 CodeUri: ./TimeZone Role: !FindInMap - StagesMap - Ref: Environments - RoleEnv Events: GetEvent: Type: EventBridgeRule Properties: Pattern: source: - "aws.s3" detail-type: - "Object Created" # 匹配事件的大类 detail: eventName: - "PutObject" - "PutObjectAcl" - "CopyObject" bucket: name: - !FindInMap [StagesMap, !Ref Environments, SOURCEBUCKET] # 新增:给目标桶开启EventBridge事件通知 MyS3Bucket: Type: AWS::S3::Bucket Properties: BucketName: !FindInMap [StagesMap, !Ref Environments, SOURCEBUCKET] NotificationConfiguration: EventBridgeConfiguration: EventBridgeEnabled: true
额外要注意的点
- 确保Lambda的IAM角色有
events:InvokeFunction权限,让EventBridge能调用它。如果是SAM自动生成的角色一般没问题,但要是你用了自定义角色,得手动加这个权限。 - 要是桶是已经存在的,没法通过SAM配置的话,就用CLI命令开启:
aws s3api put-bucket-notification-configuration --bucket dummy-dev --notification-configuration '{"EventBridgeConfiguration": {"EventBridgeEnabled": true}}'
- 可以去EventBridge的事件总线里看一下实际的S3事件结构,确认字段路径是不是对的。
内容的提问来源于stack exchange,提问作者Bilal Yousaf
相关产品推荐
相关产品推荐

