diff --git a/builtin/providers/aws/resource_aws_spot_instance_request.go b/builtin/providers/aws/resource_aws_spot_instance_request.go index a2783eeaa..73563f62f 100644 --- a/builtin/providers/aws/resource_aws_spot_instance_request.go +++ b/builtin/providers/aws/resource_aws_spot_instance_request.go @@ -116,7 +116,25 @@ func resourceAwsSpotInstanceRequestCreate(d *schema.ResourceData, meta interface // Make the spot instance request log.Printf("[DEBUG] Requesting spot bid opts: %s", spotOpts) - resp, err := conn.RequestSpotInstances(spotOpts) + + var resp *ec2.RequestSpotInstancesOutput + err = resource.Retry(15*time.Second, func() *resource.RetryError { + var err error + resp, err = conn.RequestSpotInstances(spotOpts) + // IAM instance profiles can take ~10 seconds to propagate in AWS: + // http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#launch-instance-with-role-console + if isAWSErr(err, "InvalidParameterValue", "Invalid IAM Instance Profile") { + log.Printf("[DEBUG] Invalid IAM Instance Profile referenced, retrying...") + return resource.RetryableError(err) + } + // IAM roles can also take time to propagate in AWS: + if isAWSErr(err, "InvalidParameterValue", " has no associated IAM Roles") { + log.Printf("[DEBUG] IAM Instance Profile appears to have no IAM roles, retrying...") + return resource.RetryableError(err) + } + return resource.NonRetryableError(err) + }) + if err != nil { return fmt.Errorf("Error requesting spot instances: %s", err) }