github.com/pulumi/terraform@v1.4.0/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](/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](/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 ``` 235 236 This overall plan structure, fully expanded, is what will be printed by the `terraform show -json <planfile>` command. 237 238 ## Values Representation 239 240 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). 241 242 The following example illustrates the structure of a `<values-representation>`: 243 244 ```javascript 245 { 246 // "outputs" describes the outputs from the root module. Outputs from 247 // descendent modules are not available because they are not retained in all 248 // of the underlying structures we will build this values representation from. 249 "outputs": { 250 "private_ip": { 251 "value": "192.168.3.2", 252 "type": "string", 253 "sensitive": false 254 } 255 }, 256 257 // "root_module" describes the resources and child modules in the root module. 258 "root_module": { 259 "resources": [ 260 { 261 // "address" is the absolute resource address, which callers must consider 262 // opaque but may do full string comparisons with other address strings or 263 // pass this verbatim to other Terraform commands that are documented to 264 // accept absolute resource addresses. The module-local portions of this 265 // address are extracted in other properties below. 266 "address": "aws_instance.example[1]", 267 268 // "mode" can be "managed", for resources, or "data", for data resources 269 "mode": "managed", 270 "type": "aws_instance", 271 "name": "example", 272 273 // If the count or for_each meta-arguments are set for this resource, the 274 // additional key "index" is present to give the instance index key. This 275 // is omitted for the single instance of a resource that isn't using count 276 // or for_each. 277 "index": 1, 278 279 // "provider_name" is the name of the provider that is responsible for 280 // this resource. This is only the provider name, not a provider 281 // configuration address, and so no module path nor alias will be 282 // indicated here. This is included to allow the property "type" to be 283 // interpreted unambiguously in the unusual situation where a provider 284 // offers a resource type whose name does not start with its own name, 285 // such as the "googlebeta" provider offering "google_compute_instance". 286 "provider_name": "aws", 287 288 // "schema_version" indicates which version of the resource type schema 289 // the "values" property conforms to. 290 "schema_version": 2, 291 292 // "values" is the JSON representation of the attribute values of the 293 // resource, whose structure depends on the resource type schema. Any 294 // unknown values are omitted or set to null, making them 295 // indistinguishable from absent values; callers which need to distinguish 296 // unknown from unset must use the plan-specific or configuration-specific 297 // structures described in later sections. 298 "values": { 299 "id": "i-abc123", 300 "instance_type": "t2.micro", 301 // etc, etc 302 }, 303 304 // "sensitive_values" is the JSON representation of the sensitivity of 305 // the resource's attribute values. Only attributes which are sensitive 306 // are included in this structure. 307 "sensitive_values": { 308 "id": true, 309 } 310 } 311 ] 312 313 "child_modules": [ 314 // Each entry in "child_modules" has the same structure as the root_module 315 // object, with the additional "address" property shown below. 316 { 317 // "address" is the absolute module address, which callers must treat as 318 // opaque but may do full string comparisons with other module address 319 // strings and may pass verbatim to other Terraform commands that are 320 // documented as accepting absolute module addresses. 321 "address": "module.child", 322 323 // "resources" is the same as in "root_module" above 324 "resources": [ 325 { 326 "address": "module.child.aws_instance.foo", 327 // etc, etc 328 } 329 ], 330 331 // Each module object can optionally have its own 332 // nested "child_modules", recursively describing the 333 // full module tree. 334 "child_modules": [ ... ], 335 } 336 ] 337 } 338 } 339 ``` 340 341 The translation of attribute and output values is the same intuitive mapping from HCL types to JSON types used by Terraform's [`jsonencode`](/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. 342 343 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. 344 345 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. 346 347 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. 348 349 ## Configuration Representation 350 351 Configuration is the most complicated structure in Terraform, since it includes unevaluated expression nodes and other complexities. 352 353 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: 354 355 ```javascript 356 { 357 // "provider_configs" describes all of the provider configurations throughout 358 // the configuration tree, flattened into a single map for convenience since 359 // provider configurations are the one concept in Terraform that can span 360 // across module boundaries. 361 "provider_config": { 362 363 // Keys in the provider_configs map are to be considered opaque by callers, 364 // and used just for lookups using the "provider_config_key" property in each 365 // resource object. 366 "opaque_provider_ref_aws": { 367 368 // "name" is the name of the provider without any alias 369 "name": "aws", 370 371 // "full_name" is the fully-qualified provider name 372 "full_name": "registry.terraform.io/hashicorp/aws", 373 374 // "alias" is the alias set for a non-default configuration, or unset for 375 // a default configuration. 376 "alias": "foo", 377 378 // "module_address" is included only for provider configurations that are 379 // declared in a descendent module, and gives the opaque address for the 380 // module that contains the provider configuration. 381 "module_address": "module.child", 382 383 // "expressions" describes the provider-specific content of the 384 // configuration block, as a block expressions representation (see section 385 // below). 386 "expressions": <block-expressions-representation> 387 } 388 }, 389 390 // "root_module" describes the root module in the configuration, and serves 391 // as the root of a tree of similar objects describing descendent modules. 392 "root_module": { 393 394 // "outputs" describes the output value configurations in the module. 395 "outputs": { 396 397 // Property names here are the output value names 398 "example": { 399 "expression": <expression-representation>, 400 "sensitive": false 401 } 402 }, 403 404 // "resources" describes the "resource" and "data" blocks in the module 405 // configuration. 406 "resources": [ 407 { 408 // "address" is the opaque absolute address for the resource itself. 409 "address": "aws_instance.example", 410 411 // "mode", "type", and "name" have the same meaning as for the resource 412 // portion of a value representation. 413 "mode": "managed", 414 "type": "aws_instance", 415 "name": "example", 416 417 // "provider_config_key" is the key into "provider_configs" (shown 418 // above) for the provider configuration that this resource is 419 // associated with. If the provider configuration was passed into 420 // this module from the parent module, the key will point to the 421 // original provider config block. 422 "provider_config_key": "opaque_provider_ref_aws", 423 424 // "provisioners" is an optional field which describes any provisioners. 425 // Connection info will not be included here. 426 "provisioners": [ 427 { 428 "type": "local-exec", 429 430 // "expressions" describes the provisioner configuration 431 "expressions": <block-expressions-representation> 432 }, 433 ], 434 435 // "expressions" describes the resource-type-specific content of the 436 // configuration block. 437 "expressions": <block-expressions-representation>, 438 439 // "schema_version" is the schema version number indicated by the 440 // provider for the type-specific arguments described in "expressions". 441 "schema_version": 2, 442 443 // "count_expression" and "for_each_expression" describe the expressions 444 // given for the corresponding meta-arguments in the resource 445 // configuration block. These are omitted if the corresponding argument 446 // isn't set. 447 "count_expression": <expression-representation>, 448 "for_each_expression": <expression-representation> 449 }, 450 ], 451 452 // "module_calls" describes the "module" blocks in the module. During 453 // evaluation, a module call with count or for_each may expand to multiple 454 // module instances, but in configuration only the block itself is 455 // represented. 456 "module_calls": { 457 458 // Key is the module call name chosen in the configuration. 459 "child": { 460 461 // "resolved_source" is the resolved source address of the module, after 462 // any normalization and expansion. This could be either a 463 // go-getter-style source address or a local path starting with "./" or 464 // "../". If the user gave a registry source address then this is the 465 // final location of the module as returned by the registry, after 466 // following any redirect indirection. 467 "resolved_source": "./child" 468 469 // "expressions" describes the expressions for the arguments within the 470 // block that correspond to input variables in the child module. 471 "expressions": <block-expressions-representation>, 472 473 // "count_expression" and "for_each_expression" describe the expressions 474 // given for the corresponding meta-arguments in the module 475 // configuration block. These are omitted if the corresponding argument 476 // isn't set. 477 "count_expression": <expression-representation>, 478 "for_each_expression": <expression-representation>, 479 480 // "module" is a representation of the configuration of the child module 481 // itself, using the same structure as the "root_module" object, 482 // recursively describing the full module tree. 483 "module": <module-configuration-representation> 484 } 485 } 486 } 487 } 488 ``` 489 490 ### Expression Representation 491 492 Each unevaluated expression in the configuration is represented with an `<expression-representation>` object with the following structure: 493 494 ```javascript 495 { 496 // "constant_value" is set only if the expression contains no references to 497 // other objects, in which case it gives the resulting constant value. This is 498 // mapped as for the individual values in a value representation. 499 "constant_value": "hello", 500 501 // Alternatively, "references" will be set to a list of references in the 502 // expression. Multi-step references will be unwrapped and duplicated for each 503 // significant traversal step, allowing callers to more easily recognize the 504 // objects they care about without attempting to parse the expressions. 505 // Callers should only use string equality checks here, since the syntax may 506 // be extended in future releases. 507 "references": [ 508 "data.template_file.foo[1].vars[\"baz\"]", 509 "data.template_file.foo[1].vars", // implied by previous 510 "data.template_file.foo[1]", // implied by previous 511 "data.template_file.foo", // implied by previous 512 "module.foo.bar", 513 "module.foo", // implied by the previous 514 "var.example[0]", 515 "var.example", // implied by the previous 516 517 // Partial references like "data" and "module" are not included, because 518 // Terraform considers "module.foo" to be an atomic reference, not an 519 // attribute access. 520 ] 521 } 522 ``` 523 524 -> **Note:** Expressions in `dynamic` blocks are not included in the configuration representation. 525 526 ### Block Expressions Representation 527 528 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: 529 530 ```javascript 531 { 532 // Attribute arguments are mapped directly with the attribute name as key and 533 // an <expression-representation> as value. 534 "ami": <expression-representation>, 535 "instance_type": <expression-representation>, 536 537 // Nested block arguments are mapped as either a single nested 538 // <block-expressions-representation> or an array object of these, depending on the 539 // block nesting mode chosen in the schema. 540 // - "single" nesting is a direct <block-expressions-representation> 541 // - "list" and "set" produce arrays 542 // - "map" produces an object 543 "root_block_device": <expression-representation>, 544 "ebs_block_device": [ 545 <expression-representation> 546 ] 547 } 548 ``` 549 550 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. 551 552 ## Change Representation 553 554 A `<change-representation>` describes the change to the indicated object. 555 556 ```javascript 557 { 558 // "actions" are the actions that will be taken on the object selected by the 559 // properties below. 560 // Valid actions values are: 561 // ["no-op"] 562 // ["create"] 563 // ["read"] 564 // ["update"] 565 // ["delete", "create"] 566 // ["create", "delete"] 567 // ["delete"] 568 // The two "replace" actions are represented in this way to allow callers to 569 // e.g. just scan the list for "delete" to recognize all three situations 570 // where the object will be deleted, allowing for any new deletion 571 // combinations that might be added in future. 572 "actions": ["update"], 573 574 // "before" and "after" are representations of the object value both before 575 // and after the action. For ["create"] and ["delete"] actions, either 576 // "before" or "after" is unset (respectively). For ["no-op"], the before and 577 // after values are identical. The "after" value will be incomplete if there 578 // are values within it that won't be known until after apply. 579 "before": <value-representation>, 580 "after": <value-representation>, 581 582 // "after_unknown" is an object value with similar structure to "after", but 583 // with all unknown leaf values replaced with "true", and all known leaf 584 // values omitted. This can be combined with "after" to reconstruct a full 585 // value after the action, including values which will only be known after 586 // apply. 587 "after_unknown": { 588 "id": true 589 }, 590 591 // "before_sensitive" and "after_sensitive" are object values with similar 592 // structure to "before" and "after", but with all sensitive leaf values 593 // replaced with true, and all non-sensitive leaf values omitted. These 594 // objects should be combined with "before" and "after" to prevent accidental 595 // display of sensitive values in user interfaces. 596 "before_sensitive": {}, 597 "after_sensitive": { 598 "triggers": { 599 "boop": true 600 } 601 }, 602 603 // "replace_paths" is an array of arrays representing a set of paths into the 604 // object value which resulted in the action being "replace". This will be 605 // omitted if the action is not replace, or if no paths caused the 606 // replacement (for example, if the resource was tainted). Each path 607 // consists of one or more steps, each of which will be a number or a 608 // string. 609 "replace_paths": [["triggers"]] 610 } 611 ``` 612 613 ## Checks Representation 614 615 ~> **Warning:** The JSON representation of checks is experimental 616 and some details may change in future Terraform versions based on feedback, 617 even in minor releases of Terraform CLI. 618 619 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. 620 621 ```javascript 622 [ 623 { 624 // "address" describes the address of the checkable object whose status 625 // this object is describing. 626 "address": { 627 // "kind" specifies what kind of checkable object this is. Different 628 // kinds of object will have different additional properties inside the 629 // address object, but all kinds include both "kind" and "to_display". 630 // The two valid kinds are "resource" and "output_value". 631 "kind": "resource", 632 633 // "to_display" contains an opaque string representation of the address 634 // of the object that is suitable for display in a UI. For consumers that 635 // have special handling depending on the value of "kind", this property 636 // is a good fallback to use when the application doesn't recognize the 637 // "kind" value. 638 "to_display": "aws_instance.example", 639 640 // "mode" is included for kind "resource" only, and specifies the resource 641 // mode which can either be "managed" (for "resource" blocks) or "data" 642 // (for "data" blocks). 643 "mode": "managed", 644 645 // "type" is included for kind "resource" only, and specifies the resource 646 // type. 647 "type": "aws_instance", 648 649 // "name" is the local name of the object. For a resource this is the 650 // second label in the resource block header, and for an output value 651 // this is the single label in the output block header. 652 "name": "example", 653 654 // "module" is included if the object belongs to a module other than 655 // the root module, and provides an opaque string representation of the 656 // module this object belongs to. This example is of a root module 657 // resource and so "module" is not included. 658 } 659 660 // "status" is the aggregate status of all of the instances of the object 661 // being described by this object. 662 // The possible values are "pass", "fail", "error", and "unknown". 663 "status": "fail", 664 665 // "instances" describes the current status of each of the instances of 666 // the object being described. An object can have multiple instances if 667 // it is either a resource which has "count" or "for_each" set, or if 668 // it's contained within a module that has "count" or "for_each" set. 669 // 670 // If "instances" is empty or omitted, that can either mean that the object 671 // has no instances at all (e.g. count = 0) or that an error blocked 672 // evaluation of the repetition argument. You can distinguish these cases 673 // using the "status" property, which will be "pass" or "error" for a 674 // zero-instance object and "unknown" for situations where an error blocked 675 // evalation. 676 "instances": [ 677 { 678 // "address" is an object similar to the property of the same name in 679 // the containing object. Merge the instance-level address into the 680 // object-level address, overwriting any conflicting property names, 681 // to create a full description of the instance's address. 682 "address": { 683 // "to_display" overrides the property of the same name in the main 684 // object's address, to include any module instance or resource 685 // instance keys that uniquely identify this instance. 686 "to_display": "aws_instance.example[0]", 687 688 // "instance_key" is included for resources only and specifies the 689 // resource-level instance key, which can either be a number or a 690 // string. Omitted for single-instance resources. 691 "instance_key": 0, 692 693 // "module" is included if the object belongs to a module other than 694 // the root module, and provides an opaque string representation of the 695 // module instance this object belongs to. 696 }, 697 698 // "status" describes the result of running the configured checks 699 // against this particular instance of the object, with the same 700 // possible values as the "status" in the parent object. 701 // 702 // "fail" means that the condition evaluated successfully but returned 703 // false, while "error" means that the condition expression itself 704 // was invalid. 705 "status": "fail", 706 707 // "problems" might be included for statuses "fail" or "error", in 708 // which case it describes the individual conditions that failed for 709 // this instance, if any. 710 // When a condition expression is invalid, Terraform returns that as 711 // a normal error message rather than as a problem in this list. 712 "problems": [ 713 { 714 // "message" is the string that resulted from evaluating the 715 // error_message argument of the failing condition. 716 "message": "Server does not have a public IPv6 address." 717 } 718 ] 719 }, 720 ] 721 } 722 ] 723 ``` 724 725 The "checks" model includes both static checkable objects and instances of 726 those objects to ensure that the set of checkable objects will be consistent 727 even if an error prevents full evaluation of the configuration. Any object 728 in the configuration which has associated checks, such as a resource with 729 preconditions or postconditions, will always be included as a checkable object 730 even if a runtime error prevents Terraform from evaluating its "count" or 731 "for_each" argument and therefore determining which instances of that object 732 exist dynamically. 733 734 When summarizing checks in a UI, we recommend preferring to list only the 735 individual instances and typically ignoring the top-level objects altogether. 736 However, in any case where an object has _zero_ instances, the UI should show 737 the top-level object instead to serve as a placeholder so that the user can 738 see that Terraform recognized the existence of the checks, even if it wasn't 739 able to evaluate them on the most recent run.