AWS EventBridge规则未触发:NotAuthorizedForSourceException权限问题
解决SageMaker批量转换作业触发EventBridge规则的权限问题
问题根源
NotAuthorizedForSourceException 报错的本质是两个权限缺失:
- SageMaker服务没有权限向你的EventBridge默认事件总线发送事件
- EventBridge规则没有权限将事件写入目标CloudWatch日志组
具体配置步骤
1. 给默认事件总线添加资源策略
要让SageMaker能把状态变化事件推送到EventBus,得给默认事件总线加一条允许策略。在Serverless.yml的resources区块里添加:
resources: Resources: SageMakerEventBusPolicy: Type: AWS::Events::EventBusPolicy Properties: EventBusName: default StatementId: AllowSageMakerPutEvents Action: events:PutEvents Principal: sagemaker.amazonaws.com Condition: StringEquals: events:source: aws.sagemaker
这个策略明确允许sagemaker.amazonaws.com服务调用events:PutEvents动作,限定事件源为aws.sagemaker。
2. 创建EventBridge规则的执行角色
EventBridge需要一个角色来完成向CloudWatch日志组写日志的操作,这个角色必须由events.amazonaws.com扮演,并且拥有日志写入权限。同样在resources里配置:
resources: Resources: # 接上面的SageMakerEventBusPolicy,继续添加 EventBridgeLogRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: events.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: WriteToCloudWatchLogs PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - logs:CreateLogStream - logs:PutLogEvents Resource: "arn:aws:logs:<你的AWS区域>:<你的AWS账号ID>:log-group:<你的目标日志组名>:*"
3. 关联角色到EventBridge规则
在定义EventBridge规则的时候,指定上面创建的执行角色,同时确保事件匹配规则正确:
# 示例:在Serverless的functions区块下配置事件 functions: # 无函数需求时可仅保留events配置 events: - eventBridge: eventBus: default pattern: source: - aws.sagemaker detail-type: - "SageMaker Batch Transform Job State Change" target: arn: "arn:aws:logs:<你的AWS区域>:<你的AWS账号ID>:log-group:<你的目标日志组名>" roleArn: !GetAtt EventBridgeLogRole.Arn
验证方法
- 部署更新后的Serverless配置
- 启动一个SageMaker批量转换作业,等待状态变化(比如从Starting到Completed)
- 检查目标CloudWatch日志组,应该能看到对应的事件日志
如果问题仍存在,排查以下几点:
- 事件总线策略是否生效(到EventBridge控制台的事件总线页面查看资源策略)
- 执行角色的权限是否覆盖了目标日志组的完整ARN
- 规则的事件pattern是否和SageMaker输出的事件完全匹配(可去EventBridge的事件历史里查看实际事件结构)
内容的提问来源于stack exchange,提问作者Or Shemtov
相关产品推荐
相关产品推荐

