Types of breaking changes #
A “breaking change” is any change that requires an end user to modify a previously-valid configuration after a provider upgrade. In this context, a “valid configuration” is one that:
- Is considered syntactically correct by
terraform validate
- Does not return an error during
terraform apply
- Creates, updates, deletes, or does not modify resources
- Only manages resources that have not been altered with other tools,
such as
gcloud
or Cloud Console.
This document lists many types of breaking changes but may not be entirely comprehensive. Some types of changes that would normally be “breaking” may have specific mitigating circumstances that make them non-breaking.
For more information, see Make a breaking change.
Provider-level breaking changes #
- Changing fundamental provider behavior such as:
- authentication
- environment variable usage
- restricting retry behavior
Resource-level breaking changes #
- Removing or renaming a resource or datasource
- Changing resource ID format
- Terraform uses resource ID to read resource state from the API. Modification of the ID format will break the ability to parse the IDs from any deployments.
- Removing or altering resource import ID formats
- Automation written by end users may rely on specific import formats.
- Changes to default resource behavior
- Changing resource deletion behavior
- In limited cases changes may be permissible if the prior behavior could never succeed.
- Changing resource deletion to skip deleting the resource by default if delete was previously called
- Changing resource deletion to specify a force flag
- Adding a new field with a default different from the API default
- If an API default is expected to change- a breaking change for the API- use
default_from_api
which will avoid sending a value and safely take the server default in Terraform
- If an API default is expected to change- a breaking change for the API- use
Field-level breaking changes #
- Removing or renaming a field
- Changing field output type
- Between primitive types, like changing a String to an Integer
- Between complex types like changing a List to a Set.
- Changing the field type between primitive and complex data types is not possible. For this scenario, field renames are preferred.
- Making an optional field required or adding a new required field
- Making a settable field read-only
- For MMv1 resources, adding
output: true
to an existing field. - For handwritten resources, adding
Computed: true
to a field that does not haveOptional: true
set. - Even if there is no valid scenario where a field can be set, changing it to read-only may be a breaking change for modules that depend on the provider.
- For MMv1 resources, adding
- Removing support for API-side defaults
- For MMv1 resources, removing
default_from_api: true
. - For handwritten resources, altering a field schema with
Computed: true
+Optional: true
to only haveOptional: true
.
- For MMv1 resources, removing
- Adding or changing a default value
Default values in Terraform are used to replace null values in configuration at plan/apply time and do not respect previously-configured values by the user. Even in major releases, these changes are often undesirable, as their impact is extremely broad.
When a default is changed, every user that has not specified an explicit value in their configuration will see Terraform propose changing the value of the field including if the change will destroy and recreate the resource due to changing an immutable value. Default changes in the provider are comparable in impact to default changes in an API, and modifying examples and modules may achieve the intended effect with a smaller blast radius.
- Modifying how field data is stored in state
- For example, changing the case of a value returned by the API in a flattener or decorder
- Removing diff suppression from a field.
- For MMv1 resources, removing
diff_suppress_func
from a field. - For handwritten resources, removing
DiffSuppressFunc
from a field.
- For MMv1 resources, removing
- Removing update support from a field.
Making validation more strict #
- Increasing the minimum number of items in an array
- For MMv1 resources, increasing
min_size
on an Array field. - For handwritten resources, increasing
MinItems
on an Array field.
- For MMv1 resources, increasing
- Decreasing the maximum number of items in an array
- For MMv1 resources, decreasing
max_size
on an Array field. - For handwritten resources, decreasing
MaxItems
on an Array field.
- For MMv1 resources, decreasing
- Adding validation to a field that previously had no validation
- For MMv1 resources, adding
validation
to a field. - For handwritten resources, adding
ValidateFunc
to a field.
- For MMv1 resources, adding