From d347bbec4cc142019ce8a1b34797608392cf21c2 Mon Sep 17 00:00:00 2001 From: Sylvia Moss Date: Fri, 18 Sep 2020 17:05:36 +0200 Subject: [PATCH] Retry fleet creating only on invalid IAM instance profile (#9946) --- .../amazon/common/step_run_spot_instance.go | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/builder/amazon/common/step_run_spot_instance.go b/builder/amazon/common/step_run_spot_instance.go index 940e7c8ac..fae1dc4bc 100644 --- a/builder/amazon/common/step_run_spot_instance.go +++ b/builder/amazon/common/step_run_spot_instance.go @@ -10,7 +10,6 @@ import ( "time" "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/request" "github.com/aws/aws-sdk-go/service/ec2" "github.com/hashicorp/packer/common/random" "github.com/hashicorp/packer/common/retry" @@ -281,7 +280,6 @@ func (s *StepRunSpotInstance) Run(ctx context.Context, state multistep.StateBag) } var createOutput *ec2.CreateFleetOutput - err = retry.Config{ Tries: 11, ShouldRetry: func(err error) bool { @@ -291,40 +289,39 @@ func (s *StepRunSpotInstance) Run(ctx context.Context, state multistep.StateBag) // we can wait on those operations, this can be removed. return true } - return request.IsErrorRetryable(err) + return false }, RetryDelay: (&retry.Backoff{InitialBackoff: 500 * time.Millisecond, MaxBackoff: 30 * time.Second, Multiplier: 2}).Linear, }.Run(ctx, func(ctx context.Context) error { createOutput, err = ec2conn.CreateFleet(createFleetInput) - if err == nil && createOutput.Errors != nil { err = fmt.Errorf("errors: %v", createOutput.Errors) } + // We can end up with errors because one of the allowed availability + // zones doesn't have one of the allowed instance types; as long as + // an instance is launched, these errors aren't important. + if len(createOutput.Instances) > 0 { + if err != nil { + log.Printf("create request failed for some instances %v", err.Error()) + } + return nil + } if err != nil { log.Printf("create request failed %v", err) } return err }) - // Create the request for the spot instance. if err != nil { if createOutput.FleetId != nil { err = fmt.Errorf("Error waiting for fleet request (%s): %s", *createOutput.FleetId, err) - } else { - err = fmt.Errorf("Error waiting for fleet request: %s", err) } - // We can end up with errors because one of the allowed availability - // zones doesn't have one of the allowed instance types; as long as - // an instance is launched, these errors aren't important. if len(createOutput.Errors) > 0 { errString := fmt.Sprintf("Error waiting for fleet request (%s) to become ready:", *createOutput.FleetId) for _, outErr := range createOutput.Errors { errString = errString + aws.StringValue(outErr.ErrorMessage) } err = fmt.Errorf(errString) - state.Put("error", err) - ui.Error(err.Error()) - return multistep.ActionHalt } state.Put("error", err) ui.Error(err.Error())