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

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

不匹配的原因:

  1. Lambda代码里硬编码了EventBridge客户端的区域为eu-north-1
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:15:03