{"record":{"id":"50255d48574252d9","repo":"kubernetes/kops","slug":"deleting-eventbridge-rule-q-w","errorCode":null,"errorMessage":"deleting EventBridge rule %q: %w","messagePattern":"deleting EventBridge rule %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/resources/aws/eventbridge.go","lineNumber":78,"sourceCode":"\t\t\tids = append(ids, aws.ToString(target.Id))\n\t\t}\n\t\tklog.V(2).Infof(\"Removing EventBridge Targets for rule %q\", ruleName)\n\t\t_, err = c.EventBridge().RemoveTargets(ctx, &eventbridge.RemoveTargetsInput{\n\t\t\tIds:  ids,\n\t\t\tRule: aws.String(ruleName),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"removing targets for EventBridge rule %q: %w\", ruleName, err)\n\t\t}\n\t}\n\n\tklog.V(2).Infof(\"Deleting EventBridge rule %q\", ruleName)\n\trequest := &eventbridge.DeleteRuleInput{\n\t\tName: aws.String(ruleName),\n\t}\n\t_, err = c.EventBridge().DeleteRule(ctx, request)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"deleting EventBridge rule %q: %w\", ruleName, err)\n\t}\n\treturn nil\n}\n\nfunc ListEventBridgeRules(cloud fi.Cloud, vpcID, clusterName string) ([]*resources.Resource, error) {\n\tctx := context.TODO()\n\tc := cloud.(awsup.AWSCloud)\n\n\tklog.V(2).Infof(\"Listing EventBridge rules\")\n\tclusterNamePrefix := awsup.GetClusterName40(clusterName)\n\n\t// rule names start with the cluster name so that we can search for them\n\trequest := &eventbridge.ListRulesInput{\n\t\tEventBusName: nil,\n\t\tLimit:        nil,\n\t\tNamePrefix:   aws.String(clusterNamePrefix),\n\t}\n\tresponse, err := c.EventBridge().ListRules(ctx, request)","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/resources/aws/eventbridge.go#L60-L96","documentation":"kOps wraps the AWS SDK error from eventbridge DeleteRule, the final step of DeleteEventBridgeRule after targets were removed. At this point the rule should be deletable, so failures here are permission, throttling, or concurrent-modification issues rather than dependency violations. Uses %w so callers can match on the underlying smithy error.","triggerScenarios":"DeleteRule fails: AccessDenied on events:DeleteRule, ResourceNotFoundException (rule deleted concurrently after target removal), ConcurrentModificationException, or LimitExceededException throttling.","commonSituations":"Concurrent operators deleting the same cluster; IAM policies that allow listing/removing targets but not DeleteRule; org-level SCPs denying events:DeleteRule.","solutions":["If ResourceNotFound, the rule is already gone — re-run the delete; it will succeed or skip","Add events:DeleteRule to the caller's policy if AccessDenied","Retry after backoff for ConcurrentModificationException/LimitExceededException","Ensure only one deletion process runs per cluster"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"// preflight: rule must exist and have no targets\nout, err := eventsClient.ListTargetsByRule(ctx, &eventbridge.ListTargetsByRuleInput{Rule: aws.String(ruleName)})\nif err == nil && len(out.Targets) > 0 { return fmt.Errorf(\"rule %s still has targets\", ruleName) }","typeGuard":"func isAlreadyDeleted(err error) bool {\n  var rnf *types.ResourceNotFoundException\n  return errors.As(err, &rnf)\n}","tryCatchPattern":"err := DeleteEventBridgeRule(ctx, cloud, ruleName)\nvar rnf *types.ResourceNotFoundException\nif errors.As(err, &rnf) { return nil /* rule already gone */ }\nif err != nil { return err }","preventionTips":["Ensure targets are removed before DeleteRule (kOps ordering already does this)","Grant events:DeleteRule explicitly — list/remove permissions alone are insufficient","Handle ResourceNotFoundException as success for idempotent cleanup","Check org SCPs if AccessDenied persists across retries"],"tags":["aws","eventbridge","deletion"],"backgroundTag":"aws-eventbridge-delete-rule-failed","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}