使用CDK为已有EventBus创建新Rule时遭遇ResourceAlreadyExistsException错误的解决求助
使用CDK为已有EventBus创建新Rule时遭遇ResourceAlreadyExistsException错误的解决求助
问题描述
我正尝试通过AWS CDK给一个已经存在的EventBus添加新规则,目的是将特定类型的事件转发到一个已有的SQS队列中,我的实现代码如下:
private void CreateNewRuleOnExistingEventBus(IQueue queue) { var rule = new Rule(this, "MyNewRule", new RuleProps { RuleName = "MyNewRule", EventBus = new EventBus(this, "MyExistingEventBus", new EventBusProps { EventBusName = "MyExistingEventBus" }), Description = "New Rule on existing MyExistingEventBus", EventPattern = new EventPattern { Detail = new Dictionary<string, object> { { "Type", new[] {"MY_NEW_TYPE"} } } }, Enabled = true }); rule.AddTarget(new SqsQueue(queue)); // ReSharper disable once ObjectCreationAsStatement new CfnOutput(this, ruleName, new CfnOutputProps { ExportName = ruleName, Value = rule.AttrArn }); }
报错信息
部署时遇到了以下错误:
Deployment failed: Error: Stack Deployments Failed: Error: The stack named ***** failed to deploy: UPDATE_ROLLBACK_COMPLETE: Event bus MyExistingEventBus already exists. (Service: AWSEvents; Status Code: 400; Error Code: ResourceAlreadyExistsException; Request ID: b4605949-3677-4a86-8185-6bb0c8d20fae; Proxy: null) at deployStacks (/opt/hostedtoolcache/node/18.16.0/x64/lib/node_modules/aws-cdk/lib/index.js:330:130558) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async CdkToolkit.deploy (/opt/hostedtoolcache/node/18.16.0/x64/lib/node_modules/aws-cdk/lib/index.js:330:146782) at async exec4 (/opt/hostedtoolcache/node/18.16.0/x64/lib/node_modules/aws-cdk/lib/index.js:385:51296)
解决方案
问题的根源在于你当前的代码是尝试创建一个新的EventBus资源,但这个名称的EventBus已经在你的AWS账户中存在了,所以CDK部署时会抛出资源已存在的错误。
正确的做法是直接引用已有的EventBus,而不是重新创建它,具体修改如下:
修改代码引用已有EventBus
使用CDK提供的EventBus.FromEventBusName静态方法来获取已存在的EventBus实例,替换掉原来创建新EventBus的代码:
private void CreateNewRuleOnExistingEventBus(IQueue queue) { // 引用已有的EventBus,而非创建新资源 var existingEventBus = EventBus.FromEventBusName(this, "MyExistingEventBusRef", "MyExistingEventBus"); var rule = new Rule(this, "MyNewRule", new RuleProps { RuleName = "MyNewRule", EventBus = existingEventBus, // 使用引用的已有EventBus Description = "New Rule on existing MyExistingEventBus", EventPattern = new EventPattern { Detail = new Dictionary<string, object> { { "Type", new[] {"MY_NEW_TYPE"} } } }, Enabled = true }); rule.AddTarget(new SqsQueue(queue)); // 修正输出名称,避免变量未定义问题 new CfnOutput(this, "MyNewRuleArn", new CfnOutputProps { ExportName = "MyNewRuleArn", Value = rule.AttrArn }); }
补充说明
FromEventBusName方法会让CDK生成一个对已有AWS资源的引用,不会触发新资源的创建,完美解决资源已存在的问题。- 同时要确保你的CDK执行角色拥有足够的权限,比如
events:DescribeEventBus(用于读取已有EventBus信息)、events:PutRule(用于创建规则)以及events:PutTargets(用于绑定SQS目标)等权限,避免后续出现权限相关的报错。
备注:内容来源于stack exchange,提问作者user007
相关产品推荐
相关产品推荐

