{"record":{"id":"b10c43a6b05e8190","repo":"kubernetes/kops","slug":"removing-targets-for-eventbridge-rule-q-w","errorCode":null,"errorMessage":"removing targets for EventBridge rule %q: %w","messagePattern":"removing targets for EventBridge rule %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/resources/aws/eventbridge.go","lineNumber":68,"sourceCode":"\n\ttargets, err := c.EventBridge().ListTargetsByRule(ctx, &eventbridge.ListTargetsByRuleInput{\n\t\tRule: aws.String(ruleName),\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"listing targets for EventBridge rule %q: %w\", ruleName, err)\n\t}\n\tif len(targets.Targets) > 0 {\n\t\tvar ids []string\n\t\tfor _, target := range targets.Targets {\n\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","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/resources/aws/eventbridge.go#L50-L86","documentation":"kOps wraps the AWS SDK error from eventbridge RemoveTargets while emptying a rule's targets prior to deleting the rule. Listing succeeded, so the rule exists; the failure is in the batch target-removal call. The rule is left (with its targets) in place when this error is returned.","triggerScenarios":"RemoveTargets fails: AccessDenied on events:RemoveTargets, LimitExceededException throttling, ConcurrentModificationException (rule modified by another actor mid-operation), or invalid target IDs.","commonSituations":"Two kOps processes deleting the same cluster simultaneously; IAM policies missing events:RemoveTargets; AWS accounts near EventBridge API rate limits.","solutions":["Re-run the operation — it is idempotent; ConcurrentModificationException usually resolves on retry","Add events:RemoveTargets to the caller's policy if AccessDenied","Avoid concurrent deletions of the same cluster (use a lock or single operator)","Back off and retry if throttled (LimitExceededException)"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// preflight: confirm targets still present right before removal\nout, err := eventsClient.ListTargetsByRule(ctx, &eventbridge.ListTargetsByRuleInput{Rule: aws.String(ruleName)})\nif err != nil { var rnf *types.ResourceNotFoundException; if errors.As(err, &rnf) { return nil }; return err }\nif len(out.Targets) == 0 { /* skip RemoveTargets */ }","typeGuard":"func isConcurrentModification(err error) bool {\n  var cme *types.ConcurrentModificationException\n  return errors.As(err, &cme)\n}","tryCatchPattern":"err := DeleteEventBridgeRule(ctx, cloud, ruleName)\nif isConcurrentModification(err) || awsup.AWSErrorCode(err) == \"LimitExceededException\" {\n  // exponential backoff then retry once\n}","preventionTips":["Retry ConcurrentModificationException with jittered backoff","Avoid two processes deleting the same cluster's rules","Grant events:RemoveTargets in deletion policies","Only call RemoveTargets when targets were actually listed"],"tags":["aws","eventbridge","deletion"],"backgroundTag":"aws-eventbridge-remove-targets-failed","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}