kubernetes/kops · error
removing targets for EventBridge rule %q: %w
Error message
removing targets for EventBridge rule %q: %w
What it means
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.
Source
Thrown at pkg/resources/aws/eventbridge.go:68
targets, err := c.EventBridge().ListTargetsByRule(ctx, &eventbridge.ListTargetsByRuleInput{
Rule: aws.String(ruleName),
})
if err != nil {
return fmt.Errorf("listing targets for EventBridge rule %q: %w", ruleName, err)
}
if len(targets.Targets) > 0 {
var ids []string
for _, target := range targets.Targets {
ids = append(ids, aws.ToString(target.Id))
}
klog.V(2).Infof("Removing EventBridge Targets for rule %q", ruleName)
_, err = c.EventBridge().RemoveTargets(ctx, &eventbridge.RemoveTargetsInput{
Ids: ids,
Rule: aws.String(ruleName),
})
if err != nil {
return fmt.Errorf("removing targets for EventBridge rule %q: %w", ruleName, err)
}
}
klog.V(2).Infof("Deleting EventBridge rule %q", ruleName)
request := &eventbridge.DeleteRuleInput{
Name: aws.String(ruleName),
}
_, err = c.EventBridge().DeleteRule(ctx, request)
if err != nil {
return fmt.Errorf("deleting EventBridge rule %q: %w", ruleName, err)
}
return nil
}
func ListEventBridgeRules(cloud fi.Cloud, vpcID, clusterName string) ([]*resources.Resource, error) {
ctx := context.TODO()
c := cloud.(awsup.AWSCloud)
View on GitHub (pinned to 4c8573c808)
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)
Defensive patterns
Strategy: retry
Validate before calling
// preflight: confirm targets still present right before removal
out, err := eventsClient.ListTargetsByRule(ctx, &eventbridge.ListTargetsByRuleInput{Rule: aws.String(ruleName)})
if err != nil { var rnf *types.ResourceNotFoundException; if errors.As(err, &rnf) { return nil }; return err }
if len(out.Targets) == 0 { /* skip RemoveTargets */ } Type guard
func isConcurrentModification(err error) bool {
var cme *types.ConcurrentModificationException
return errors.As(err, &cme)
} Try / catch
err := DeleteEventBridgeRule(ctx, cloud, ruleName)
if isConcurrentModification(err) || awsup.AWSErrorCode(err) == "LimitExceededException" {
// exponential backoff then retry once
} Prevention
- 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
When it happens
Trigger: RemoveTargets fails: AccessDenied on events:RemoveTargets, LimitExceededException throttling, ConcurrentModificationException (rule modified by another actor mid-operation), or invalid target IDs.
Common situations: Two kOps processes deleting the same cluster simultaneously; IAM policies missing events:RemoveTargets; AWS accounts near EventBridge API rate limits.
Related errors
- listing targets for EventBridge rule %q: %w
- deleting EventBridge rule %q: %w
- error terminating instances: %v
- error deleting KeyPair %q: %v
- error deleting EgressOnlyInternetGateway %q: %v
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/b10c43a6b05e8190.
Report an issue: GitHub.