github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/website/docs/internals/json-format.mdx (about)

     1  ---
     2  page_title: 'Internals: JSON Output Format'
     3  description: >-
     4    Terraform provides a machine-readable JSON representation of state,
     5    configuration and plan.
     6  ---
     7  
     8  # JSON Output Format
     9  
    10  -> **Note:** This format is available in Terraform 0.12 and later.
    11  
    12  When Terraform plans to make changes, it prints a human-readable summary to the terminal. It can also, when run with `-out=<PATH>`, write a much more detailed binary plan file, which can later be used to apply those changes.
    13  
    14  Since the format of plan files isn't suited for use with external tools (and likely never will be), Terraform can output a machine-readable JSON representation of a plan file's changes. It can also convert state files to the same format, to simplify data loading and provide better long-term compatibility.
    15  
    16  Use `terraform show -json <FILE>` to generate a JSON representation of a plan or state file. See [the `terraform show` documentation](/terraform/cli/commands/show) for more details.
    17  
    18  The output includes a `format_version` key, which as of Terraform 1.1.0 has
    19  value `"1.0"`. The semantics of this version are:
    20  
    21  - We will increment the minor version, e.g. `"1.1"`, for backward-compatible
    22    changes or additions. Ignore any object properties with unrecognized names to
    23    remain forward-compatible with future minor versions.
    24  - We will increment the major version, e.g. `"2.0"`, for changes that are not
    25    backward-compatible. Reject any input which reports an unsupported major
    26    version.
    27  
    28  We will introduce new major versions only within the bounds of
    29  [the Terraform 1.0 Compatibility Promises](/terraform/language/v1-compatibility-promises).
    30  
    31  ## Format Summary
    32  
    33  The following sections describe the JSON output format by example, using a pseudo-JSON notation.
    34  
    35  Important elements are described with comments, which are prefixed with `//`.
    36  
    37  To avoid excessive repetition, we've split the complete format into several discrete sub-objects, described under separate headers. References wrapped in angle brackets (like `<values-representation>`) are placeholders which, in the real output, would be replaced by an instance of the specified sub-object.
    38  
    39  The JSON output format consists of the following objects and sub-objects:
    40  
    41  - [State Representation](#state-representation) — The complete top-level object returned by `terraform show -json <STATE FILE>`.
    42  - [Plan Representation](#plan-representation) — The complete top-level object returned by `terraform show -json <PLAN FILE>`.
    43  - [Values Representation](#values-representation) — A sub-object of both plan and state output that describes current state or planned state.
    44  - [Configuration Representation](#configuration-representation) — A sub-object of plan output that describes a parsed Terraform configuration.
    45    - [Expression Representation](#expression-representation) — A sub-object of a configuration representation that describes an unevaluated expression.
    46    - [Block Expressions Representation](#block-expressions-representation) — A sub-object of a configuration representation that describes the expressions nested inside a block.
    47  - [Change Representation](#change-representation) — A sub-object of plan output that describes changes to an object.
    48  - [Checks Representation](#checks-representation) — A property of both the plan and state representations that describes the current status of any checks (e.g. preconditions and postconditions) in the configuration.
    49  
    50  ## State Representation
    51  
    52  State does not have any significant metadata not included in the common [values representation](#values-representation), so the `<state-representation>` uses the following format:
    53  
    54  ```javascript
    55  {
    56    // "values" is a values representation object derived from the values in the
    57    // state. Because the state is always fully known, this is always complete.
    58    "values": <values-representation>
    59  
    60    "terraform_version": "version.string"
    61  }
    62  ```
    63  
    64  ## Plan Representation
    65  
    66  A plan consists of a prior state, the configuration that is being applied to that state, and the set of changes Terraform plans to make to achieve that.
    67  
    68  For ease of consumption by callers, the plan representation includes a partial representation of the values in the final state (using a [value representation](#values-representation)), allowing callers to easily analyze the planned outcome using similar code as for analyzing the prior state.
    69  
    70  ```javascript
    71  {
    72    "format_version": "1.0",
    73  
    74    // "prior_state" is a representation of the state that the configuration is
    75    // being applied to, using the state representation described above.
    76    "prior_state":  <state-representation>,
    77  
    78    // "configuration" is a representation of the configuration being applied to the
    79    // prior state, using the configuration representation described above.
    80    "configuration": <configuration-representation>,
    81  
    82    // "planned_values" is a description of what is known so far of the outcome in
    83    // the standard value representation, with any as-yet-unknown values omitted.
    84    "planned_values": <values-representation>,
    85  
    86    // "proposed_unknown" is a representation of the attributes, including any
    87    // potentially-unknown attributes. Each value is replaced with "true" or
    88    // "false" depending on whether it is known in the proposed plan.
    89    "proposed_unknown": <values-representation>,
    90  
    91    // "variables" is a representation of all the variables provided for the given
    92    // plan. This is structured as a map similar to the output map so we can add
    93    // additional fields in later.
    94    "variables": {
    95      "varname": {
    96        "value": "varvalue"
    97      },
    98    },
    99  
   100    // "resource_changes" is a description of the individual change actions that
   101    // Terraform plans to use to move from the prior state to a new state
   102    // matching the configuration.
   103    "resource_changes": [
   104      // Each element of this array describes the action to take
   105      // for one instance object. All resources in the
   106      // configuration are included in this list.
   107      {
   108        // "address" is the full absolute address of the resource instance this
   109        // change applies to, in the same format as addresses in a value
   110        // representation.
   111        "address": "module.child.aws_instance.foo[0]",
   112  
   113        // "previous_address" is the full absolute address of this resource
   114        // instance as it was known after the previous Terraform run.
   115        // Included only if the address has changed, e.g. by handling
   116        // a "moved" block in the configuration.
   117        "previous_address": "module.instances.aws_instance.foo[0]",
   118  
   119        // "module_address", if set, is the module portion of the above address.
   120        // Omitted if the instance is in the root module.
   121        "module_address": "module.child",
   122  
   123        // "mode", "type", "name", and "index" have the same meaning as in a
   124        // value representation.
   125        "mode": "managed",
   126        "type": "aws_instance",
   127        "name": "foo",
   128        "index": 0,
   129  
   130        // "deposed", if set, indicates that this action applies to a "deposed"
   131        // object of the given instance rather than to its "current" object.
   132        // Omitted for changes to the current object. "address" and "deposed"
   133        // together form a unique key across all change objects in a particular
   134        // plan. The value is an opaque key representing the specific deposed
   135        // object.
   136        "deposed": "deadbeef",
   137  
   138        // "change" describes the change that will be made to the indicated
   139        // object. The <change-representation> is detailed in a section below.
   140        "change": <change-representation>,
   141  
   142        // "action_reason" is some optional extra context about why the
   143        // actions given inside "change" were selected. This is the JSON
   144        // equivalent of annotations shown in the normal plan output like
   145        // "is tainted, so must be replaced" as opposed to just "must be
   146        // replaced".
   147        //
   148        // These reason codes are display hints only and the set of possible
   149        // hints may change over time. Users of this must be prepared to
   150        // encounter unrecognized reasons and treat them as unspecified reasons.
   151        //
   152        // The current set of possible values is:
   153        // - "replace_because_tainted": the object in question is marked as
   154        //   "tainted" in the prior state, so Terraform planned to replace it.
   155        // - "replace_because_cannot_update": the provider indicated that one
   156        //   of the requested changes isn't possible without replacing the
   157        //   existing object with a new object.
   158        // - "replace_by_request": the user explicitly called for this object
   159        //   to be replaced as an option when creating the plan, which therefore
   160        //   overrode what would have been a "no-op" or "update" action otherwise.
   161        // - "delete_because_no_resource_config": Terraform found no resource
   162        //   configuration corresponding to this instance.
   163        // - "delete_because_no_module": The resource instance belongs to a
   164        //   module instance that's no longer declared, perhaps due to changing
   165        //   the "count" or "for_each" argument on one of the containing modules.
   166        // - "delete_because_wrong_repetition": The instance key portion of the
   167        //   resource address isn't of a suitable type for the corresponding
   168        //   resource's configured repetition mode (count, for_each, or neither).
   169        // - "delete_because_count_index": The corresponding resource uses count,
   170        //   but the instance key is out of range for the currently-configured
   171        //   count value.
   172        // - "delete_because_each_key": The corresponding resource uses for_each,
   173        //   but the instance key doesn't match any of the keys in the
   174        //   currently-configured for_each value.
   175        // - "read_because_config_unknown": For a data resource, Terraform cannot
   176        //   read the data during the plan phase because of values in the
   177        //   configuration that won't be known until the apply phase.
   178        // - "read_because_dependency_pending": For a data resource, Terraform
   179        //   cannot read the data during the plan phase because the data
   180        //   resource depends on at least one managed resource that also has
   181        //   a pending change in the same plan.
   182        //
   183        // If there is no special reason to note, Terraform will omit this
   184        // property altogether.
   185        action_reason: "replace_because_tainted"
   186      }
   187    ],
   188  
   189    // "resource_drift" is a description of the changes Terraform detected
   190    // when it compared the most recent state to the prior saved state.
   191    "resource_drift": [
   192      {
   193          // "resource_drift" uses the same object structure as
   194          // "resource_changes".
   195      }
   196    ],
   197  
   198    // "relevant_attributes" lists the sources of all values contributing to
   199    // changes in the plan. You can use "relevant_attributes" to filter
   200    // "resource_drift" and determine which external changes may have affected the
   201    // plan result.
   202    "relevant_attributes": [
   203      {
   204        "resource": "aws_instance.foo",
   205        "attribute": "attr",
   206      }
   207    ]
   208  
   209    // "output_changes" describes the planned changes to the output values of the
   210    // root module.
   211    "output_changes": {
   212      // Keys are the defined output value names.
   213      "foo": {
   214  
   215        // "change" describes the change that will be made to the indicated output
   216        // value, using the same representation as for resource changes except
   217        // that the only valid actions values are:
   218        //   ["create"]
   219        //   ["update"]
   220        //   ["delete"]
   221        // In the Terraform CLI 0.12.0 release, Terraform is not yet fully able to
   222        // track changes to output values, so the actions indicated may not be
   223        // fully accurate, but the "after" value will always be correct.
   224        "change": <change-representation>,
   225      }
   226    },
   227  
   228    // "checks" describes the partial results for any checkable objects, such as
   229    // resources with postconditions, with as much information as Terraform can
   230    // recognize at plan time. Some objects will have status "unknown" to
   231    // indicate that their status will only be determined after applying the plan.
   232    "checks" <checks-representation>,
   233  
   234    // "errored" indicates whether planning failed. An errored plan cannot be applied,
   235    // but the actions planned before failure may help to understand the error.
   236    "errored": false
   237  }
   238  ```
   239  
   240  This overall plan structure, fully expanded, is what will be printed by the `terraform show -json <planfile>` command.
   241  
   242  ## Values Representation
   243  
   244  A values representation is used in both state and plan output to describe current state (which is always complete) and planned state (which omits values not known until apply).
   245  
   246  The following example illustrates the structure of a `<values-representation>`:
   247  
   248  ```javascript
   249  {
   250    // "outputs" describes the outputs from the root module. Outputs from
   251    // descendent modules are not available because they are not retained in all
   252    // of the underlying structures we will build this values representation from.
   253    "outputs": {
   254      "private_ip": {
   255        "value": "192.168.3.2",
   256        "type": "string",
   257        "sensitive": false
   258      }
   259    },
   260  
   261    // "root_module" describes the resources and child modules in the root module.
   262    "root_module": {
   263      "resources": [
   264        {
   265          // "address" is the absolute resource address, which callers must consider
   266          // opaque but may do full string comparisons with other address strings or
   267          // pass this verbatim to other Terraform commands that are documented to
   268          // accept absolute resource addresses. The module-local portions of this
   269          // address are extracted in other properties below.
   270          "address": "aws_instance.example[1]",
   271  
   272          // "mode" can be "managed", for resources, or "data", for data resources
   273          "mode": "managed",
   274          "type": "aws_instance",
   275          "name": "example",
   276  
   277          // If the count or for_each meta-arguments are set for this resource, the
   278          // additional key "index" is present to give the instance index key. This
   279          // is omitted for the single instance of a resource that isn't using count
   280          // or for_each.
   281          "index": 1,
   282  
   283          // "provider_name" is the name of the provider that is responsible for
   284          // this resource. This is only the provider name, not a provider
   285          // configuration address, and so no module path nor alias will be
   286          // indicated here. This is included to allow the property "type" to be
   287          // interpreted unambiguously in the unusual situation where a provider
   288          // offers a resource type whose name does not start with its own name,
   289          // such as the "googlebeta" provider offering "google_compute_instance".
   290          "provider_name": "aws",
   291  
   292          // "schema_version" indicates which version of the resource type schema
   293          // the "values" property conforms to.
   294          "schema_version": 2,
   295  
   296          // "values" is the JSON representation of the attribute values of the
   297          // resource, whose structure depends on the resource type schema. Any
   298          // unknown values are omitted or set to null, making them
   299          // indistinguishable from absent values; callers which need to distinguish
   300          // unknown from unset must use the plan-specific or configuration-specific
   301          // structures described in later sections.
   302          "values": {
   303            "id": "i-abc123",
   304            "instance_type": "t2.micro",
   305            // etc, etc
   306          },
   307  
   308          // "sensitive_values" is the JSON representation of the sensitivity of
   309          // the resource's attribute values. Only attributes which are sensitive
   310          // are included in this structure.
   311          "sensitive_values": {
   312            "id": true,
   313          }
   314        }
   315      ]
   316  
   317      "child_modules": [
   318        // Each entry in "child_modules" has the same structure as the root_module
   319        // object, with the additional "address" property shown below.
   320        {
   321          // "address" is the absolute module address, which callers must treat as
   322          // opaque but may do full string comparisons with other module address
   323          // strings and may pass verbatim to other Terraform commands that are
   324          // documented as accepting absolute module addresses.
   325          "address": "module.child",
   326  
   327          // "resources" is the same as in "root_module" above
   328          "resources": [
   329              {
   330                "address": "module.child.aws_instance.foo",
   331                // etc, etc
   332              }
   333          ],
   334  
   335          // Each module object can optionally have its own
   336          // nested "child_modules", recursively describing the
   337          // full module tree.
   338          "child_modules": [ ... ],
   339        }
   340      ]
   341    }
   342  }
   343  ```
   344  
   345  The translation of attribute and output values is the same intuitive mapping from HCL types to JSON types used by Terraform's [`jsonencode`](/terraform/language/functions/jsonencode) function. This mapping does lose some information: lists, sets, and tuples all lower to JSON arrays while maps and objects both lower to JSON objects. Unknown values and null values are both treated as absent or null.
   346  
   347  Output values include a `"type"` field, which is a [serialization of the value's type](https://pkg.go.dev/github.com/zclconf/go-cty/cty#Type.MarshalJSON). For primitive types this is a string value, such as `"number"` or `"bool"`. Complex types are represented as a nested JSON array, such as `["map","string"]` or `["object",{"a":"number"}]`. This can be used to reconstruct the output value with the correct type.
   348  
   349  Only the "current" object for each resource instance is described. "Deposed" objects are not reflected in this structure at all; in plan representations, you can refer to the change representations for further details.
   350  
   351  The intent of this structure is to give a caller access to a similar level of detail as is available to expressions within the configuration itself. This common representation is not suitable for all use-cases because it loses information compared to the data structures it is built from. For more complex needs, use the more elaborate changes and configuration representations.
   352  
   353  ## Configuration Representation
   354  
   355  Configuration is the most complicated structure in Terraform, since it includes unevaluated expression nodes and other complexities.
   356  
   357  Because the configuration models are produced at a stage prior to expression evaluation, it is not possible to produce a values representation for configuration. Instead, we describe the physical structure of the configuration, giving access to constant values where possible and allowing callers to analyze any references to other objects that are present:
   358  
   359  ```javascript
   360  {
   361    // "provider_configs" describes all of the provider configurations throughout
   362    // the configuration tree, flattened into a single map for convenience since
   363    // provider configurations are the one concept in Terraform that can span
   364    // across module boundaries.
   365    "provider_config": {
   366  
   367      // Keys in the provider_configs map are to be considered opaque by callers,
   368      // and used just for lookups using the "provider_config_key" property in each
   369      // resource object.
   370      "opaque_provider_ref_aws": {
   371  
   372        // "name" is the name of the provider without any alias
   373        "name": "aws",
   374  
   375        // "full_name" is the fully-qualified provider name
   376        "full_name": "registry.terraform.io/hashicorp/aws",
   377  
   378        // "alias" is the alias set for a non-default configuration, or unset for
   379        // a default configuration.
   380        "alias": "foo",
   381  
   382        // "module_address" is included only for provider configurations that are
   383        // declared in a descendent module, and gives the opaque address for the
   384        // module that contains the provider configuration.
   385        "module_address": "module.child",
   386  
   387        // "expressions" describes the provider-specific content of the
   388        // configuration block, as a block expressions representation (see section
   389        // below).
   390        "expressions": <block-expressions-representation>
   391      }
   392    },
   393  
   394    // "root_module" describes the root module in the configuration, and serves
   395    // as the root of a tree of similar objects describing descendent modules.
   396    "root_module": {
   397  
   398      // "outputs" describes the output value configurations in the module.
   399      "outputs": {
   400  
   401        // Property names here are the output value names
   402        "example": {
   403          "expression": <expression-representation>,
   404          "sensitive": false
   405        }
   406      },
   407  
   408      // "resources" describes the "resource" and "data" blocks in the module
   409      // configuration.
   410      "resources": [
   411        {
   412          // "address" is the opaque absolute address for the resource itself.
   413          "address": "aws_instance.example",
   414  
   415          // "mode", "type", and "name" have the same meaning as for the resource
   416          // portion of a value representation.
   417          "mode": "managed",
   418          "type": "aws_instance",
   419          "name": "example",
   420  
   421          // "provider_config_key" is the key into "provider_configs" (shown
   422          // above) for the provider configuration that this resource is
   423          // associated with. If the provider configuration was passed into
   424          // this module from the parent module, the key will point to the
   425          // original provider config block.
   426          "provider_config_key": "opaque_provider_ref_aws",
   427  
   428          // "provisioners" is an optional field which describes any provisioners.
   429          // Connection info will not be included here.
   430          "provisioners": [
   431            {
   432              "type": "local-exec",
   433  
   434              // "expressions" describes the provisioner configuration
   435              "expressions": <block-expressions-representation>
   436            },
   437          ],
   438  
   439          // "expressions" describes the resource-type-specific content of the
   440          // configuration block.
   441          "expressions": <block-expressions-representation>,
   442  
   443          // "schema_version" is the schema version number indicated by the
   444          // provider for the type-specific arguments described in "expressions".
   445          "schema_version": 2,
   446  
   447          // "count_expression" and "for_each_expression" describe the expressions
   448          // given for the corresponding meta-arguments in the resource
   449          // configuration block. These are omitted if the corresponding argument
   450          // isn't set.
   451          "count_expression": <expression-representation>,
   452          "for_each_expression": <expression-representation>
   453        },
   454      ],
   455  
   456      // "module_calls" describes the "module" blocks in the module. During
   457      // evaluation, a module call with count or for_each may expand to multiple
   458      // module instances, but in configuration only the block itself is
   459      // represented.
   460      "module_calls": {
   461  
   462        // Key is the module call name chosen in the configuration.
   463        "child": {
   464  
   465          // "resolved_source" is the resolved source address of the module, after
   466          // any normalization and expansion. This could be either a
   467          // go-getter-style source address or a local path starting with "./" or
   468          // "../". If the user gave a registry source address then this is the
   469          // final location of the module as returned by the registry, after
   470          // following any redirect indirection.
   471          "resolved_source": "./child"
   472  
   473          // "expressions" describes the expressions for the arguments within the
   474          // block that correspond to input variables in the child module.
   475          "expressions": <block-expressions-representation>,
   476  
   477          // "count_expression" and "for_each_expression" describe the expressions
   478          // given for the corresponding meta-arguments in the module
   479          // configuration block. These are omitted if the corresponding argument
   480          // isn't set.
   481          "count_expression": <expression-representation>,
   482          "for_each_expression": <expression-representation>,
   483  
   484          // "module" is a representation of the configuration of the child module
   485          // itself, using the same structure as the "root_module" object,
   486          // recursively describing the full module tree.
   487          "module": <module-configuration-representation>
   488        }
   489      }
   490    }
   491  }
   492  ```
   493  
   494  ### Expression Representation
   495  
   496  Each unevaluated expression in the configuration is represented with an `<expression-representation>` object with the following structure:
   497  
   498  ```javascript
   499  {
   500    // "constant_value" is set only if the expression contains no references to
   501    // other objects, in which case it gives the resulting constant value. This is
   502    // mapped as for the individual values in a value representation.
   503    "constant_value": "hello",
   504  
   505    // Alternatively, "references" will be set to a list of references in the
   506    // expression. Multi-step references will be unwrapped and duplicated for each
   507    // significant traversal step, allowing callers to more easily recognize the
   508    // objects they care about without attempting to parse the expressions.
   509    // Callers should only use string equality checks here, since the syntax may
   510    // be extended in future releases.
   511    "references": [
   512      "data.template_file.foo[1].vars[\"baz\"]",
   513      "data.template_file.foo[1].vars", // implied by previous
   514      "data.template_file.foo[1]", // implied by previous
   515      "data.template_file.foo", // implied by previous
   516      "module.foo.bar",
   517      "module.foo", // implied by the previous
   518      "var.example[0]",
   519      "var.example", // implied by the previous
   520  
   521      // Partial references like "data" and "module" are not included, because
   522      // Terraform considers "module.foo" to be an atomic reference, not an
   523      // attribute access.
   524    ]
   525  }
   526  ```
   527  
   528  -> **Note:** Expressions in `dynamic` blocks are not included in the configuration representation.
   529  
   530  ### Block Expressions Representation
   531  
   532  In some cases, it is the entire content of a block (possibly after certain special arguments have already been handled and removed) that must be represented. For that, we have an `<block-expressions-representation>` structure:
   533  
   534  ```javascript
   535  {
   536    // Attribute arguments are mapped directly with the attribute name as key and
   537    // an <expression-representation> as value.
   538    "ami": <expression-representation>,
   539    "instance_type": <expression-representation>,
   540  
   541    // Nested block arguments are mapped as either a single nested
   542    // <block-expressions-representation> or an array object of these, depending on the
   543    // block nesting mode chosen in the schema.
   544    //  - "single" nesting is a direct <block-expressions-representation>
   545    //  - "list" and "set" produce arrays
   546    //  - "map" produces an object
   547    "root_block_device": <expression-representation>,
   548    "ebs_block_device": [
   549      <expression-representation>
   550    ]
   551  }
   552  ```
   553  
   554  For now we expect callers to just hard-code assumptions about the schemas of particular resource types in order to process these expression representations. In a later release we will add new inspection commands to return machine-readable descriptions of the schemas themselves, allowing for more generic handling in programs such as visualization tools.
   555  
   556  ## Change Representation
   557  
   558  A `<change-representation>` describes the change to the indicated object.
   559  
   560  ```javascript
   561  {
   562    // "actions" are the actions that will be taken on the object selected by the
   563    // properties below.
   564    // Valid actions values are:
   565    //    ["no-op"]
   566    //    ["create"]
   567    //    ["read"]
   568    //    ["update"]
   569    //    ["delete", "create"]
   570    //    ["create", "delete"]
   571    //    ["delete"]
   572    // The two "replace" actions are represented in this way to allow callers to
   573    // e.g. just scan the list for "delete" to recognize all three situations
   574    // where the object will be deleted, allowing for any new deletion
   575    // combinations that might be added in future.
   576    "actions": ["update"],
   577  
   578    // "before" and "after" are representations of the object value both before
   579    // and after the action. For ["create"] and ["delete"] actions, either
   580    // "before" or "after" is unset (respectively). For ["no-op"], the before and
   581    // after values are identical. The "after" value will be incomplete if there
   582    // are values within it that won't be known until after apply.
   583    "before": <value-representation>,
   584    "after": <value-representation>,
   585  
   586    // "after_unknown" is an object value with similar structure to "after", but
   587    // with all unknown leaf values replaced with "true", and all known leaf
   588    // values omitted. This can be combined with "after" to reconstruct a full
   589    // value after the action, including values which will only be known after
   590    // apply.
   591    "after_unknown": {
   592      "id": true
   593    },
   594  
   595    // "before_sensitive" and "after_sensitive" are object values with similar
   596    // structure to "before" and "after", but with all sensitive leaf values
   597    // replaced with true, and all non-sensitive leaf values omitted. These
   598    // objects should be combined with "before" and "after" to prevent accidental
   599    // display of sensitive values in user interfaces.
   600    "before_sensitive": {},
   601    "after_sensitive": {
   602      "triggers": {
   603        "boop": true
   604      }
   605    },
   606  
   607    // "replace_paths" is an array of arrays representing a set of paths into the
   608    // object value which resulted in the action being "replace". This will be
   609    // omitted if the action is not replace, or if no paths caused the
   610    // replacement (for example, if the resource was tainted). Each path
   611    // consists of one or more steps, each of which will be a number or a
   612    // string.
   613    "replace_paths": [["triggers"]]
   614  }
   615  ```
   616  
   617  ## Checks Representation
   618  
   619  ~> **Warning:** The JSON representation of checks is experimental
   620  and some details may change in future Terraform versions based on feedback,
   621  even in minor releases of Terraform CLI.
   622  
   623  A `<checks-representation>` describes the current state of a checkable object in the configuration. For example, a resource with one or more preconditions or postconditions is an example of a checkable object, and its check state represents the results of those conditions.
   624  
   625  ```javascript
   626  [
   627    {
   628      // "address" describes the address of the checkable object whose status
   629      // this object is describing.
   630      "address": {
   631        // "kind" specifies what kind of checkable object this is. Different
   632        // kinds of object will have different additional properties inside the
   633        // address object, but all kinds include both "kind" and "to_display".
   634        // The two valid kinds are "resource" and "output_value".
   635        "kind": "resource",
   636  
   637        // "to_display" contains an opaque string representation of the address
   638        // of the object that is suitable for display in a UI. For consumers that
   639        // have special handling depending on the value of "kind", this property
   640        // is a good fallback to use when the application doesn't recognize the
   641        // "kind" value.
   642        "to_display": "aws_instance.example",
   643  
   644        // "mode" is included for kind "resource" only, and specifies the resource
   645        // mode which can either be "managed" (for "resource" blocks) or "data"
   646        // (for "data" blocks).
   647        "mode": "managed",
   648  
   649        // "type" is included for kind "resource" only, and specifies the resource
   650        // type.
   651        "type": "aws_instance",
   652  
   653        // "name" is the local name of the object. For a resource this is the
   654        // second label in the resource block header, and for an output value
   655        // this is the single label in the output block header.
   656        "name": "example",
   657  
   658        // "module" is included if the object belongs to a module other than
   659        // the root module, and provides an opaque string representation of the
   660        // module this object belongs to. This example is of a root module
   661        // resource and so "module" is not included.
   662      }
   663  
   664      // "status" is the aggregate status of all of the instances of the object
   665      // being described by this object.
   666      // The possible values are "pass", "fail", "error", and "unknown".
   667      "status": "fail",
   668  
   669      // "instances" describes the current status of each of the instances of
   670      // the object being described. An object can have multiple instances if
   671      // it is either a resource which has "count" or "for_each" set, or if
   672      // it's contained within a module that has "count" or "for_each" set.
   673      //
   674      // If "instances" is empty or omitted, that can either mean that the object
   675      // has no instances at all (e.g. count = 0) or that an error blocked
   676      // evaluation of the repetition argument. You can distinguish these cases
   677      // using the "status" property, which will be "pass" or "error" for a
   678      // zero-instance object and "unknown" for situations where an error blocked
   679      // evalation.
   680      "instances": [
   681        {
   682          // "address" is an object similar to the property of the same name in
   683          // the containing object. Merge the instance-level address into the
   684          // object-level address, overwriting any conflicting property names,
   685          // to create a full description of the instance's address.
   686          "address": {
   687            // "to_display" overrides the property of the same name in the main
   688            // object's address, to include any module instance or resource
   689            // instance keys that uniquely identify this instance.
   690            "to_display": "aws_instance.example[0]",
   691  
   692            // "instance_key" is included for resources only and specifies the
   693            // resource-level instance key, which can either be a number or a
   694            // string. Omitted for single-instance resources.
   695            "instance_key": 0,
   696  
   697            // "module" is included if the object belongs to a module other than
   698            // the root module, and provides an opaque string representation of the
   699            // module instance this object belongs to.
   700          },
   701  
   702          // "status" describes the result of running the configured checks
   703          // against this particular instance of the object, with the same
   704          // possible values as the "status" in the parent object.
   705          //
   706          // "fail" means that the condition evaluated successfully but returned
   707          // false, while "error" means that the condition expression itself
   708          // was invalid.
   709          "status": "fail",
   710  
   711          // "problems" might be included for statuses "fail" or "error", in
   712          // which case it describes the individual conditions that failed for
   713          // this instance, if any.
   714          // When a condition expression is invalid, Terraform returns that as
   715          // a normal error message rather than as a problem in this list.
   716          "problems": [
   717            {
   718              // "message" is the string that resulted from evaluating the
   719              // error_message argument of the failing condition.
   720              "message": "Server does not have a public IPv6 address."
   721            }
   722          ]
   723        },
   724      ]
   725    }
   726  ]
   727  ```
   728  
   729  The "checks" model includes both static checkable objects and instances of
   730  those objects to ensure that the set of checkable objects will be consistent
   731  even if an error prevents full evaluation of the configuration. Any object
   732  in the configuration which has associated checks, such as a resource with
   733  preconditions or postconditions, will always be included as a checkable object
   734  even if a runtime error prevents Terraform from evaluating its "count" or
   735  "for_each" argument and therefore determining which instances of that object
   736  exist dynamically.
   737  
   738  When summarizing checks in a UI, we recommend preferring to list only the
   739  individual instances and typically ignoring the top-level objects altogether.
   740  However, in any case where an object has _zero_ instances, the UI should show
   741  the top-level object instead to serve as a placeholder so that the user can
   742  see that Terraform recognized the existence of the checks, even if it wasn't
   743  able to evaluate them on the most recent run.