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
- Check if the rule still exists: `aws events list-targets-by-rule --rule <name>`; if ResourceNotFound, treat as already deleted and re-run
- Add events:ListTargetsByRule to the caller's policy if AccessDenied
- Back off and retry if throttled
- 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
- Check rule existence before deleting to short-circuit races
- Grant events:ListTargetsByRule alongside events:DeleteRule
- Serialize cluster deletions to avoid ConcurrentModification/NotFound races
- Match on %w-wrapped types.ResourceNotFoundException with errors.As
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
- removing 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/60cf2460f555d4cc.
Report an issue: GitHub.