Lambda调用EventBridge执行events:PutEvents无权限问题求助
问题根源
核心错误是区域不匹配,IAM权限校验要求资源ARN的区域字段完全匹配,跨区域授权不会生效:
- 报错提示你要访问的EventBus资源ARN为
arn:aws:events:eu-north-1:120293923901:event-bus/MyApiEventBus,区域为eu-north-1 - Lambda角色的权限策略里,授权的EventBusARN为
arn:aws:events:eu-west-1:120293923901:event-bus/MyApiEventBus,区域为eu-west-1
不匹配的原因:
- Lambda代码里硬编码了EventBridge客户端的区域为
eu-north-1 - CDK栈默认部署区域为
eu-west-1,所以CDK创建的EventBus、IAM策略里的资源ARN默认带eu-west-1区域标识,和代码访问的区域不一致。
解决方法
任选一种方案统一区域即可:
方案1:修改CDK栈部署区域为eu-north-1
在CDK栈初始化时指定区域:
const app = new cdk.App(); new MyStack(app, 'MyStack', { env: { region: 'eu-north-1', account: '120293923901' } });
修改后重新部署CDK,权限策略的ARN区域会自动更新为eu-north-1和代码匹配。
方案2:修改Lambda代码的EventBridge客户端区域
把Lambda代码里的客户端初始化代码改为:
const eventBridge = new EventBridgeClient({ region: 'eu-west-1' });
重新部署Lambda即可。
方案3(更稳妥,避免硬编码):动态传递EventBus配置
CDK侧给Lambda配置环境变量:
const ordersPostFunction = new NodejsFunction(this, `OrdersPostFunction`, { entry: './lambda.ts', handler: 'post', environment: { EVENT_BUS_NAME: bus.eventBusName, EVENT_BUS_REGION: cdk.Stack.of(this).region } });
Lambda侧读取环境变量使用:
const eventBridge = new EventBridgeClient({ region: process.env.EVENT_BUS_REGION }); const event = new PutEventsCommand({ Entries: [{ EventBusName: process.env.EVENT_BUS_NAME, // 其余参数保持不变 }] });
额外优化点:你给Lambda加了三次重复的PutEvents权限(
addToRolePolicy、attachInlinePolicy、grantPutEventsTo),功能完全重复,只保留bus.grantPutEventsTo(ordersPostFunction);一行即可,其余两次授权可以删除避免冗余。
内容的提问来源于stack exchange,提问作者Patrik
相关产品推荐
相关产品推荐

