如何用AWS CDK将跨账号自定义Event Bus设为Event Rule目标?
问题解决:AWS CDK跨账号Event Rule关联自定义Event Bus报错
错误原因
你直接把跨账号Event Bus的ARN字符串传给eventTarget.EventBus构造函数是错误的——这个构造函数需要接收的是events.IEventBus类型的CDK对象,而非纯ARN字符串,这会导致CDK无法正确识别资源,从而抛出“无法找到长度未定义的资源”的错误。
修正代码
账号A的CDK代码(创建Event Rule并关联跨账号Event Bus)
先通过ARN创建跨账号Event Bus的CDK引用对象,再将其作为目标添加到Event Rule:
// 从传入的ARN生成跨账号Event Bus的CDK引用 const crossAccountEventBus = events.EventBus.fromEventBusArn(this, 'CrossAccountEventBus', props.anotherAccountEventBusArn); const eventRule = new events.Rule(this, 'event-rule', { ruleName: getResourceName(this, 'event-rule', 'rule-name', props.envName), description: 'This rule will be used to capture events', eventPattern: {"source": ['source']}, }); // 将跨账号Event Bus设为规则目标 eventRule.addTarget(new eventTarget.EventBus(crossAccountEventBus));
关键补充:账号B的Event Bus权限配置
仅修改账号A的代码还不够,你需要在账号B的CDK栈中给自定义Event Bus添加权限,允许账号A的Event Rule发送事件过来:
// 账号B中的自定义Event Bus(如果已存在,可改用fromEventBusArn引用) const customEventBus = new events.EventBus(this, 'CustomEventBus', { eventBusName: '你的自定义Event Bus名称', }); // 添加资源策略,允许账号A的Event Rule发送事件 customEventBus.addToResourcePolicy(new iam.PolicyStatement({ effect: iam.Effect.ALLOW, principals: [new iam.ServicePrincipal('events.amazonaws.com')], actions: ['events:PutEvents'], resources: [customEventBus.eventBusArn], conditions: { StringEquals: { 'aws:SourceAccount': '账号A的AWS账号ID', }, ArnLike: { 'aws:SourceArn': 'arn:aws:events:你的区域:账号A的AWS账号ID:rule/你的规则名称前缀*', }, }, }));
说明
events.EventBus.fromEventBusArn方法会创建一个代表已有Event Bus的CDK引用对象,让CDK能正确识别这个跨账号资源。- 账号B的权限策略是必须的,否则账号A的Event Rule会因权限不足无法向账号B的Event Bus发送事件。
内容的提问来源于stack exchange,提问作者Jatin Mehrotra
相关产品推荐
相关产品推荐

