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

  1. Re-run the operation — it is idempotent; ConcurrentModificationException usually resolves on retry
  2. Add events:RemoveTargets to the caller's policy if AccessDenied
  3. Avoid concurrent deletions of the same cluster (use a lock or single operator)
  4. 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

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


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/b10c43a6b05e8190. Report an issue: GitHub.