@@ -1666,17 +1666,19 @@ func resourceInstanceUpdate(ctx context.Context, d *schema.ResourceData, meta in
1666
1666
// Only one attribute can be modified at a time, else we get
1667
1667
// "InvalidParameterCombination: Fields for multiple attribute types specified"
1668
1668
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 ())
1670
1671
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
+ }
1677
1678
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
+ }
1680
1682
}
1681
1683
}
1682
1684
@@ -1943,12 +1945,30 @@ func resourceInstanceUpdate(ctx context.Context, d *schema.ResourceData, meta in
1943
1945
if d .HasChange ("capacity_reservation_specification" ) && ! d .IsNewResource () {
1944
1946
if v , ok := d .GetOk ("capacity_reservation_specification" ); ok && len (v .([]interface {})) > 0 && v .([]interface {})[0 ] != nil {
1945
1947
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
+
1946
1965
input := & ec2.ModifyInstanceCapacityReservationAttributesInput {
1947
1966
CapacityReservationSpecification : v ,
1948
1967
InstanceId : aws .String (d .Id ()),
1949
1968
}
1950
1969
1951
1970
log .Printf ("[DEBUG] Modifying EC2 Instance capacity reservation attributes: %s" , input )
1971
+
1952
1972
_ , err := conn .ModifyInstanceCapacityReservationAttributesWithContext (ctx , input )
1953
1973
1954
1974
if err != nil {
@@ -1958,6 +1978,24 @@ func resourceInstanceUpdate(ctx context.Context, d *schema.ResourceData, meta in
1958
1978
if _ , err := WaitInstanceCapacityReservationSpecificationUpdated (ctx , conn , d .Id (), v ); err != nil {
1959
1979
return sdkdiag .AppendErrorf (diags , "waiting for EC2 Instance (%s) capacity reservation attributes update: %s" , d .Id (), err )
1960
1980
}
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
+ }
1961
1999
}
1962
2000
}
1963
2001
}
0 commit comments