kubernetes/kops · error

listing targets for EventBridge rule %q: %w

Error message

listing targets for EventBridge rule %q: %w

What it means

kOps wraps the AWS SDK error from eventbridge ListTargetsByRule while deleting an EventBridge rule: targets must be removed before the rule can be deleted. This error aborts DeleteEventBridgeRule before any target removal or rule deletion happens. It uses %w so the underlying eventbridge API error can be inspected with errors.As.

Source

Thrown at pkg/resources/aws/eventbridge.go:55

	data["raw"] = r.Obj
	op.Dump.Resources = append(op.Dump.Resources, data)

	return nil
}

func EventBridgeRuleDeleter(cloud fi.Cloud, r *resources.Resource) error {
	return DeleteEventBridgeRule(cloud, r.Name)
}

func DeleteEventBridgeRule(cloud fi.Cloud, ruleName string) error {
	ctx := context.TODO()
	c := cloud.(awsup.AWSCloud)

	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{

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Check if the rule still exists: `aws events list-targets-by-rule --rule <name>`; if ResourceNotFound, treat as already deleted and re-run
  2. Add events:ListTargetsByRule to the caller's policy if AccessDenied
  3. Back off and retry if throttled
  4. Verify the rule name format (64 chars max, no invalid chars)
Defensive patterns

Strategy: type-guard

Validate before calling

// preflight: check the rule still exists before target listing
_, err := eventsClient.DescribeRule(ctx, &eventbridge.DescribeRuleInput{Name: aws.String(ruleName)})
if err != nil {
  var rnf *types.ResourceNotFoundException
  if errors.As(err, &rnf) { return nil /* already deleted */ }
  return err
}

Type guard

func isRuleNotFound(err error) bool {
  var rnf *types.ResourceNotFoundException
  return errors.As(err, &rnf) || strings.Contains(err.Error(), "Rule does not exist")
}

Try / catch

err := DeleteEventBridgeRule(ctx, cloud, ruleName)
var rnf *types.ResourceNotFoundException
if errors.As(err, &rnf) { return nil /* treat as deleted */ }
if err != nil { return err }

Prevention

When it happens

Trigger: ListTargetsByRule fails: ResourceNotFoundException (rule already deleted by another process), AccessDenied on events:ListTargetsByRule, throttling (LimitExceededException), or the rule name contains invalid characters rejected by the API.

Common situations: Concurrent cluster deletions where one process already removed the rule; IAM policies granting events:DeleteRule but not events:ListTargetsByRule; rules deleted manually between listing and deletion.

Related errors


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