{"record":{"id":"60cf2460f555d4cc","repo":"kubernetes/kops","slug":"listing-targets-for-eventbridge-rule-q-w","errorCode":null,"errorMessage":"listing targets for EventBridge rule %q: %w","messagePattern":"listing targets for EventBridge rule %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/resources/aws/eventbridge.go","lineNumber":55,"sourceCode":"\tdata[\"raw\"] = r.Obj\n\top.Dump.Resources = append(op.Dump.Resources, data)\n\n\treturn nil\n}\n\nfunc EventBridgeRuleDeleter(cloud fi.Cloud, r *resources.Resource) error {\n\treturn DeleteEventBridgeRule(cloud, r.Name)\n}\n\nfunc DeleteEventBridgeRule(cloud fi.Cloud, ruleName string) error {\n\tctx := context.TODO()\n\tc := cloud.(awsup.AWSCloud)\n\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{","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/resources/aws/eventbridge.go#L37-L73","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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)"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"// preflight: check the rule still exists before target listing\n_, err := eventsClient.DescribeRule(ctx, &eventbridge.DescribeRuleInput{Name: aws.String(ruleName)})\nif err != nil {\n  var rnf *types.ResourceNotFoundException\n  if errors.As(err, &rnf) { return nil /* already deleted */ }\n  return err\n}","typeGuard":"func isRuleNotFound(err error) bool {\n  var rnf *types.ResourceNotFoundException\n  return errors.As(err, &rnf) || strings.Contains(err.Error(), \"Rule does not exist\")\n}","tryCatchPattern":"err := DeleteEventBridgeRule(ctx, cloud, ruleName)\nvar rnf *types.ResourceNotFoundException\nif errors.As(err, &rnf) { return nil /* treat as deleted */ }\nif err != nil { return err }","preventionTips":["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"],"tags":["aws","eventbridge","deletion"],"backgroundTag":"aws-eventbridge-list-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"}