Skip to content

Commit bd03200

Browse files
committed
Fix ReservationCapacityExceeded error in aws_instance (#32458)
1 parent dd99384 commit bd03200

File tree

1 file changed

+47
-9
lines changed

1 file changed

+47
-9
lines changed

internal/service/ec2/ec2_instance.go

+47-9
Original file line numberDiff line numberDiff line change
@@ -1666,17 +1666,19 @@ func resourceInstanceUpdate(ctx context.Context, d *schema.ResourceData, meta in
16661666
// Only one attribute can be modified at a time, else we get
16671667
// "InvalidParameterCombination: Fields for multiple attribute types specified"
16681668
if d.HasChange("instance_type") {
1669-
log.Printf("[INFO] Modifying instance type %s", d.Id())
1669+
if !d.HasChange("capacity_reservation_specification.0.capacity_reservation_target.0.capacity_reservation_id") {
1670+
log.Printf("[INFO] Modifying instance type %s", d.Id())
16701671

1671-
input := &ec2.ModifyInstanceAttributeInput{
1672-
InstanceId: aws.String(d.Id()),
1673-
InstanceType: &ec2.AttributeValue{
1674-
Value: aws.String(d.Get("instance_type").(string)),
1675-
},
1676-
}
1672+
input := &ec2.ModifyInstanceAttributeInput{
1673+
InstanceId: aws.String(d.Id()),
1674+
InstanceType: &ec2.AttributeValue{
1675+
Value: aws.String(d.Get("instance_type").(string)),
1676+
},
1677+
}
16771678

1678-
if err := modifyInstanceAttributeWithStopStart(ctx, conn, input); err != nil {
1679-
return sdkdiag.AppendErrorf(diags, "updating EC2 Instance (%s) type: %s", d.Id(), err)
1679+
if err := modifyInstanceAttributeWithStopStart(ctx, conn, input); err != nil {
1680+
return sdkdiag.AppendErrorf(diags, "updating EC2 Instance (%s) type: %s", d.Id(), err)
1681+
}
16801682
}
16811683
}
16821684

@@ -1943,12 +1945,30 @@ func resourceInstanceUpdate(ctx context.Context, d *schema.ResourceData, meta in
19431945
if d.HasChange("capacity_reservation_specification") && !d.IsNewResource() {
19441946
if v, ok := d.GetOk("capacity_reservation_specification"); ok && len(v.([]interface{})) > 0 && v.([]interface{})[0] != nil {
19451947
if v := expandCapacityReservationSpecification(v.([]interface{})[0].(map[string]interface{})); v != nil && (v.CapacityReservationPreference != nil || v.CapacityReservationTarget != nil) {
1948+
if err := StopInstance(ctx, conn, d.Id(), InstanceStopTimeout); err != nil {
1949+
return sdkdiag.AppendErrorf(diags, "stopping EC2 Instance (%s): %w", d.Id(), err)
1950+
}
1951+
1952+
if d.HasChange("capacity_reservation_specification.0.capacity_reservation_target.0.capacity_reservation_id") && d.HasChange("instance_type") {
1953+
input := &ec2.ModifyInstanceAttributeInput{
1954+
InstanceId: aws.String(d.Id()),
1955+
InstanceType: &ec2.AttributeValue{
1956+
Value: aws.String(d.Get("instance_type").(string)),
1957+
},
1958+
}
1959+
1960+
if _, err := conn.ModifyInstanceAttributeWithContext(ctx, input); err != nil {
1961+
return sdkdiag.AppendErrorf(diags, "modifying EC2 Instance (%s) attribute: %w", d.Id(), err)
1962+
}
1963+
}
1964+
19461965
input := &ec2.ModifyInstanceCapacityReservationAttributesInput{
19471966
CapacityReservationSpecification: v,
19481967
InstanceId: aws.String(d.Id()),
19491968
}
19501969

19511970
log.Printf("[DEBUG] Modifying EC2 Instance capacity reservation attributes: %s", input)
1971+
19521972
_, err := conn.ModifyInstanceCapacityReservationAttributesWithContext(ctx, input)
19531973

19541974
if err != nil {
@@ -1958,6 +1978,24 @@ func resourceInstanceUpdate(ctx context.Context, d *schema.ResourceData, meta in
19581978
if _, err := WaitInstanceCapacityReservationSpecificationUpdated(ctx, conn, d.Id(), v); err != nil {
19591979
return sdkdiag.AppendErrorf(diags, "waiting for EC2 Instance (%s) capacity reservation attributes update: %s", d.Id(), err)
19601980
}
1981+
1982+
// Reference: https://github.com/hashicorp/terraform-provider-aws/issues/16433.
1983+
_, err = tfresource.RetryWhenAWSErrMessageContains(ctx, ec2PropagationTimeout,
1984+
func() (interface{}, error) {
1985+
return conn.StartInstancesWithContext(ctx, &ec2.StartInstancesInput{
1986+
InstanceIds: aws.StringSlice([]string{d.Id()}),
1987+
})
1988+
},
1989+
errCodeInvalidParameterValue, "LaunchPlan instance type does not match attribute value",
1990+
)
1991+
1992+
if err != nil {
1993+
return sdkdiag.AppendErrorf(diags, "starting EC2 Instance (%s): %w", d.Id(), err)
1994+
}
1995+
1996+
if _, err := WaitInstanceStarted(ctx, conn, d.Id(), InstanceStartTimeout); err != nil {
1997+
return sdkdiag.AppendErrorf(diags, "waiting for EC2 Instance (%s) start: %w", d.Id(), err)
1998+
}
19611999
}
19622000
}
19632001
}

0 commit comments

Comments
 (0)