Terraform
Blocks with Computed Fields
Some providers, resources, and data sources include repeatable nested blocks in their attributes. Some blocks contain
fields with Computed: true
, which means that the provider code can define the value or that it could come from the
output of terraform apply (e.g., the ID of an EC2 instance).
This page explains how to migrate computed-only blocks from SDKv2 to the Framework. Refer to Blocks if you are looking for information about migrating blocks that are practitioner configurable.
SDKv2
In SDKv2, blocks are defined by an attribute whose type is either TypeList
or TypeSet
, and whose Elem
field is set to a
schema.Resource
that contains a map of the block's attribute names to corresponding schemaSchema
structs.
map[string]*schema.Schema{
"example": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"nested_example": {
Type: schema.TypeString,
Computed: true,
/* ... */
Framework
In the Framework, when working with protocol version 5, computed blocks are implemented using a ListAttribute
which has an ElementType
of types.ObjectType
.
map[string]schema.Attribute{
"example": schema.ListAttribute{
Computed: true,
ElementType: types.ObjectType{
AttrTypes: map[string]attr.Type{
"nested_example": types.StringType,
/* ... */
In the Framework, when working with protocol version 6, we recommend that you define computed blocks using nested
attributes. This example shows usage of ListNestedAttribute
as this provides configuration references with list index
syntax as is the case when using schema.TypeList
in SDKv2. SingleNestedAttribute
is a good choice for single
underlying objects which results in a breaking change but also allows dropping [0]
in configuration references.
map[string]schema.Attribute{
"example": schema.ListNestedAttribute{
Computed: true,
NestedObject: schema.NestedAttributeObject{
Attributes: map[string]schema.Attribute{
"nested_example": schema.StringAttribute{
Computed: true,
/* ... */
Migration Notes
- When using protocol version 5 specify
ElementType
astypes.ObjectType
when migrating blocks that are computed from SDKv2 to Framework. - When using protocol version 6, use nested attributes when migrating blocks that are computed from SDKv2 to Framework.
Example
SDKv2
The following example shows the implementation of the example_nested_block
with SDKv2.
Schema: map[string]*schema.Schema{
"example_nested_block": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"example_block_attribute": {
Type: schema.TypeString,
Computed: true,
/* ... */
},
Framework
The following shows the same section of provider code after the migration.
This code defines the example_nested_block
block as an attribute on the schema, where the
types.ObjectType
is being used to define the nested block.
map[string]schema.Attribute{
"example_nested_block": schema.ListAttribute{
ElementType: types.ObjectType{
AttrTypes: map[string]attr.Type{
"example_block_attribute": types.StringType,
},
},
Computed: true,
/* ... */