@@ -27,6 +27,7 @@ import (
2727 "sigs.k8s.io/karpenter/pkg/cloudprovider"
2828 "sigs.k8s.io/karpenter/pkg/scheduling"
2929
30+ "github.com/aws/aws-sdk-go-v2/aws"
3031 "github.com/aws/aws-sdk-go-v2/service/ec2"
3132 ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types"
3233 corev1 "k8s.io/api/core/v1"
@@ -159,7 +160,13 @@ func (v *Validation) validateCreateFleetAuthorization(
159160) (reason string , requeue bool , err error ) {
160161 createFleetInput := instance .GetCreateFleetInput (nodeClass , karpv1 .CapacityTypeOnDemand , tags , mockLaunchTemplateConfig ())
161162 createFleetInput .DryRun = lo .ToPtr (true )
162- if _ , err := v .ec2api .CreateFleet (ctx , createFleetInput ); awserrors .IgnoreDryRunError (err ) != nil {
163+ // Adding NopRetryer to avoid aggressive retry when rate limited
164+ if _ , err := v .ec2api .CreateFleet (ctx , createFleetInput , func (o * ec2.Options ) {
165+ o .Retryer = aws.NopRetryer {}
166+ }); awserrors .IgnoreDryRunError (err ) != nil {
167+ if awserrors .IsRateLimitedError (err ) {
168+ return "" , true , nil
169+ }
163170 if awserrors .IgnoreUnauthorizedOperationError (err ) != nil {
164171 // Dry run should only ever return UnauthorizedOperation or DryRunOperation so if we receive any other error
165172 // it would be an unexpected state
@@ -182,7 +189,13 @@ func (v *Validation) validateCreateLaunchTemplateAuthorization(
182189 }
183190 createLaunchTemplateInput := launchtemplate .GetCreateLaunchTemplateInput (ctx , opts [0 ], corev1 .IPv4Protocol , "" )
184191 createLaunchTemplateInput .DryRun = lo .ToPtr (true )
185- if _ , err := v .ec2api .CreateLaunchTemplate (ctx , createLaunchTemplateInput ); awserrors .IgnoreDryRunError (err ) != nil {
192+ // Adding NopRetryer to avoid aggressive retry when rate limited
193+ if _ , err := v .ec2api .CreateLaunchTemplate (ctx , createLaunchTemplateInput , func (o * ec2.Options ) {
194+ o .Retryer = aws.NopRetryer {}
195+ }); awserrors .IgnoreDryRunError (err ) != nil {
196+ if awserrors .IsRateLimitedError (err ) {
197+ return "" , true , nil
198+ }
186199 if awserrors .IgnoreUnauthorizedOperationError (err ) != nil {
187200 // Dry run should only ever return UnauthorizedOperation or DryRunOperation so if we receive any other error
188201 // it would be an unexpected state
@@ -230,11 +243,13 @@ func (v *Validation) validateRunInstancesAuthorization(
230243 Tags : runInstancesInput .TagSpecifications [0 ].Tags ,
231244 },
232245 )
233-
234- if _ , err = v .ec2api .RunInstances (ctx , runInstancesInput ); awserrors .IgnoreDryRunError (err ) != nil {
246+ // Adding NopRetryer to avoid aggressive retry when rate limited
247+ if _ , err = v .ec2api .RunInstances (ctx , runInstancesInput , func (o * ec2.Options ) {
248+ o .Retryer = aws.NopRetryer {}
249+ }); awserrors .IgnoreDryRunError (err ) != nil {
235250 // If we get InstanceProfile NotFound, but we have a resolved instance profile in the status,
236251 // this means there is most likely an eventual consistency issue and we just need to requeue
237- if awserrors .IsInstanceProfileNotFound (err ) {
252+ if awserrors .IsInstanceProfileNotFound (err ) || awserrors . IsRateLimitedError ( err ) {
238253 return "" , true , nil
239254 }
240255 if awserrors .IgnoreUnauthorizedOperationError (err ) != nil {
0 commit comments