github.com/rstandt/terraform@v0.12.32-0.20230710220336-b1063613405c/website/docs/internals/json-format.html.md (about)

     1  ---
     2  layout: "docs"
     3  page_title: "Internals: JSON Output Format"
     4  sidebar_current: "docs-internals-json"
     5  description: |-
     6    Terraform provides a machine-readable JSON representation of state, configuration and plan.
     7  ---
     8  
     9  # JSON Output Format
    10  
    11  -> **Note:** This format is available in Terraform 0.12 and later.
    12  
    13  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.
    14  
    15  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.
    16  
    17  Use `terraform show -json <FILE>` to generate a JSON representation of a plan or state file. See [the `terraform show` documentation](/docs/commands/show.html) for more details.
    18  
    19  -> **Note:** The output includes a `format_version` key, which currently has major version zero to indicate that the format is experimental and subject to change. A future version will assign a non-zero major version and make stronger promises about compatibility. We do not anticipate any significant breaking changes to the format before its first major version, however.
    20  
    21  ## Format Summary
    22  
    23  The following sections describe the JSON output format by example, using a pseudo-JSON notation.
    24  
    25  Important elements are described with comments, which are prefixed with `//`.
    26  
    27  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.
    28  
    29  The JSON output format consists of the following objects and sub-objects:
    30  
    31  - [State Representation](#state-representation) — The complete top-level object returned by `terraform show -json <STATE FILE>`.
    32  - [Plan Representation](#plan-representation) — The complete top-level object returned by `terraform show -json <PLAN FILE>`.
    33  - [Values Representation](#values-representation) — A sub-object of both plan and state output that describes current state or planned state.
    34  - [Configuration Representation](#configuration-representation) — A sub-object of plan output that describes a parsed Terraform configuration.
    35      - [Expression Representation](#expression-representation) — A sub-object of a configuration representation that describes an unevaluated expression.
    36      - [Block Expressions Representation](#block-expressions-representation) — A sub-object of a configuration representation that describes the expressions nested inside a block.
    37  - [Change Representation](#change-representation) — A sub-object of plan output that describes planned changes to an object.
    38  
    39  ## State Representation
    40  
    41  Because state does not currently have any significant metadata not covered by the common values representation ([described below](#values-representation)), the `<state-representation>` is straightforward:
    42  
    43  ```javascript
    44  {
    45    // "values" is a values representation object derived from the values in the
    46    // state. Because the state is always fully known, this is always complete.
    47    "values": <values-representation>
    48  
    49    "terraform_version": "version.string"
    50  }
    51  ```
    52  
    53  The extra wrapping object here will allow for any extension we may need to add in future versions of this format.
    54  
    55  ## Plan Representation
    56  
    57  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.
    58  
    59  For ease of consumption by callers, the plan representation includes a partial representation of the values in the final state (using a [value representation](#value-representation)), allowing callers to easily analyze the planned outcome using similar code as for analyzing the prior state.
    60  
    61  ```javascript
    62  {
    63    "format_version": "0.1",
    64  
    65    // "prior_state" is a representation of the state that the configuration is
    66    // being applied to, using the state representation described above.
    67    "prior_state": <state-representation>,
    68  
    69    // "config" is a representation of the configuration being applied to the
    70    // prior state, using the configuration representation described above.
    71    "config": <config-representation>,
    72  
    73    // "planned_values" is a description of what is known so far of the outcome in
    74    // the standard value representation, with any as-yet-unknown values omitted.
    75    "planned_values": <values-representation>,
    76  
    77    // "proposed_unknown" is a representation of the attributes, including any
    78    // potentially-unknown attributes. Each value is replaced with "true" or
    79    // "false" depending on whether it is known in the proposed plan.
    80    "proposed_unknown": <values-representation>,
    81  
    82    // "variables" is a representation of all the variables provided for the given
    83    // plan. This is structured as a map similar to the output map so we can add
    84    // additional fields in later.
    85    "variables": {
    86      "varname": {
    87        "value": "varvalue"
    88      },
    89    },
    90  
    91    // "changes" is a description of the individual change actions that Terraform
    92    // plans to use to move from the prior state to a new state matching the
    93    // configuration.
    94    "resource_changes": [
    95      // Each element of this array describes the action to take
    96      // for one instance object. All resources in the
    97      // configuration are included in this list.
    98      {
    99        // "address" is the full absolute address of the resource instance this
   100        // change applies to, in the same format as addresses in a value
   101        // representation
   102        "address": "module.child.aws_instance.foo[0]",
   103  
   104        // "module_address", if set, is the module portion of the above address.
   105        // Omitted if the instance is in the root module.
   106        "module_address": "module.child",
   107  
   108        // "mode", "type", "name", and "index" have the same meaning as in a
   109        // value representation.
   110        "mode": "managed",
   111        "type": "aws_instance",
   112        "name": "foo",
   113        "index": 0,
   114  
   115        // "deposed", if set, indicates that this action applies to a "deposed"
   116        // object of the given instance rather than to its "current" object.
   117        // Omitted for changes to the current object. "address" and "deposed"
   118        // together form a unique key across all change objects in a particular
   119        // plan. The value is an opaque key representing the specific deposed
   120        // object.
   121        "deposed": "deadbeef",
   122  
   123        // "change" describes the change that will be made to the indicated
   124        // object. The <change-representation> is detailed in a section below.
   125        "change": <change-representation>
   126      }
   127    ],
   128  
   129    // "output_changes" describes the planned changes to the output values of the
   130    // root module.
   131    "output_changes": {
   132      // Keys are the defined output value names.
   133      "foo": {
   134  
   135        // "change" describes the change that will be made to the indicated output
   136        // value, using the same representation as for resource changes except
   137        // that the only valid actions values are:
   138        //   ["create"]
   139        //   ["update"]
   140        //   ["delete"]
   141        // In the Terraform CLI 0.12.0 release, Terraform is not yet fully able to
   142        // track changes to output values, so the actions indicated may not be
   143        // fully accurate, but the "after" value will always be correct.
   144        "change": <change-representation>,
   145      }
   146    }
   147  }
   148  ```
   149  
   150  This overall plan structure, fully expanded, is what will be printed by the `terraform show -json <planfile>` command.
   151  
   152  ## Values Representation
   153  
   154  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).
   155  
   156  The following example illustrates the structure of a `<values-representation>`:
   157  
   158  ```javascript
   159  {
   160    // "outputs" describes the outputs from the root module. Outputs from
   161    // descendent modules are not available because they are not retained in all
   162    // of the underlying structures we will build this values representation from.
   163    "outputs": {
   164      "private_ip": {
   165        "value": "192.168.3.2",
   166        "sensitive": false
   167      }
   168    },
   169  
   170    // "root_module" describes the resources and child modules in the root module.
   171    "root_module": {
   172      "resources": [
   173        {
   174          // "address" is the absolute resource address, which callers must consider
   175          // opaque but may do full string comparisons with other address strings or
   176          // pass this verbatim to other Terraform commands that are documented to
   177          // accept absolute resource addresses. The module-local portions of this
   178          // address are extracted in other properties below.
   179          "address": "aws_instance.example[1]",
   180  
   181          // "mode" can be "managed", for resources, or "data", for data resources
   182          "mode": "managed",
   183          "type": "aws_instance",
   184          "name": "example",
   185  
   186          // If the count or for_each meta-arguments are set for this resource, the
   187          // additional key "index" is present to give the instance index key. This
   188          // is omitted for the single instance of a resource that isn't using count
   189          // or for_each.
   190          "index": 1,
   191  
   192          // "provider_name" is the name of the provider that is responsible for
   193          // this resource. This is only the provider name, not a provider
   194          // configuration address, and so no module path nor alias will be
   195          // indicated here. This is included to allow the property "type" to be
   196          // interpreted unambiguously in the unusual situation where a provider
   197          // offers a resource type whose name does not start with its own name,
   198          // such as the "googlebeta" provider offering "google_compute_instance".
   199          "provider_name": "aws",
   200  
   201          // "schema_version" indicates which version of the resource type schema
   202          // the "values" property conforms to.
   203          "schema_version": 2,
   204  
   205          // "values" is the JSON representation of the attribute values of the
   206          // resource, whose structure depends on the resource type schema. Any
   207          // unknown values are omitted or set to null, making them
   208          // indistinguishable from absent values; callers which need to distinguish
   209          // unknown from unset must use the plan-specific or config-specific
   210          // structures described in later sections.
   211          "values": {
   212            "id": "i-abc123",
   213            "instance_type": "t2.micro",
   214            // etc, etc
   215          }
   216        }
   217      ]
   218  
   219      "child_modules": [
   220        // Each entry in "child_modules" has the same structure as the root_module
   221        // object, with the additional "address" property shown below.
   222        {
   223          // "address" is the absolute module address, which callers must treat as
   224          // opaque but may do full string comparisons with other module address
   225          // strings and may pass verbatim to other Terraform commands that are
   226          // documented as accepting absolute module addresses.
   227          "address": "module.child",
   228  
   229          // "resources" is the same as in "root_module" above
   230          "resources": [
   231              {
   232                "address": "module.child.aws_instance.foo",
   233                // etc, etc
   234              }
   235          ],
   236  
   237          // Each module object can optionally have its own
   238          // nested "child_modules", recursively describing the
   239          // full module tree.
   240          "child_modules": [ ... ],
   241        }
   242      ]
   243    }
   244  }
   245  ```
   246  
   247  The translation of attribute and output values is the same intuitive mapping from HCL types to JSON types used by Terraform's [`jsonencode`](/docs/configuration/functions/jsonencode.html) 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.
   248  
   249  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.
   250  
   251  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.
   252  
   253  ## Configuration Representation
   254  
   255  Configuration is the most complicated structure in Terraform, since it includes unevaluated expression nodes and other complexities.
   256  
   257  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:
   258  
   259  ```javascript
   260  {
   261    // "provider_configs" describes all of the provider configurations throughout
   262    // the configuration tree, flattened into a single map for convenience since
   263    // provider configurations are the one concept in Terraform that can span
   264    // across module boundaries.
   265    "provider_configs": {
   266  
   267      // Keys in the provider_configs map are to be considered opaque by callers,
   268      // and used just for lookups using the "provider_config_key" property in each
   269      // resource object.
   270      "opaque_provider_ref_aws": {
   271  
   272        // "name" is the name of the provider without any alias
   273        "name": "aws",
   274  
   275        // "alias" is the alias set for a non-default configuration, or unset for
   276        // a default configuration.
   277        "alias": "foo",
   278  
   279        // "module_address" is included only for provider configurations that are
   280        // declared in a descendent module, and gives the opaque address for the
   281        // module that contains the provider configuration.
   282        "module_address": "module.child",
   283  
   284        // "expressions" describes the provider-specific content of the
   285        // configuration block, as a block expressions representation (see section
   286        // below).
   287        "expressions": <block-expressions-representation>
   288      }
   289    },
   290  
   291    // "root_module" describes the root module in the configuration, and serves
   292    // as the root of a tree of similar objects describing descendent modules.
   293    "root_module": {
   294  
   295      // "outputs" describes the output value configurations in the module.
   296      "outputs": {
   297  
   298        // Property names here are the output value names
   299        "example": {
   300          "expression": <expression-representation>,
   301          "sensitive": false
   302        }
   303      },
   304  
   305      // "resources" describes the "resource" and "data" blocks in the module
   306      // configuration.
   307      "resources": [
   308        {
   309          // "address" is the opaque absolute address for the resource itself.
   310          "address": "aws_instance.example",
   311  
   312          // "mode", "type", and "name" have the same meaning as for the resource
   313          // portion of a value representation.
   314          "mode": "managed",
   315          "type": "aws_instance",
   316          "name": "example",
   317  
   318          // "provider_config_key" is the key into "provider_configs" (shown
   319          // above) for the provider configuration that this resource is
   320          // associated with.
   321          "provider_config_key": "opaque_provider_ref_aws",
   322  
   323          // "provisioners" is an optional field which describes any provisioners.
   324          // Connection info will not be included here.
   325          "provisioners": [
   326            {
   327              "type": "local-exec",
   328  
   329              // "expressions" describes the provisioner configuration
   330              "expressions": <block-expressions-representation>
   331            },
   332          ],
   333  
   334          // "expressions" describes the resource-type-specific content of the
   335          // configuration block.
   336          "expressions": <block-expressions-representation>,
   337  
   338          // "schema_version" is the schema version number indicated by the
   339          // provider for the type-specific arguments described in "expressions".
   340          "schema_version": 2,
   341  
   342          // "count_expression" and "for_each_expression" describe the expressions
   343          // given for the corresponding meta-arguments in the resource
   344          // configuration block. These are omitted if the corresponding argument
   345          // isn't set.
   346          "count_expression": <expression-representation>,
   347          "for_each_expression": <expression-representation>
   348        },
   349      ],
   350  
   351      // "module_calls" describes the "module" blocks in the module. During
   352      // evaluation, a module call with count or for_each may expand to multiple
   353      // module instances, but in configuration only the block itself is
   354      // represented.
   355      "module_calls": {
   356  
   357        // Key is the module call name chosen in the configuration.
   358        "child": {
   359  
   360          // "resolved_source" is the resolved source address of the module, after
   361          // any normalization and expansion. This could be either a
   362          // go-getter-style source address or a local path starting with "./" or
   363          // "../". If the user gave a registry source address then this is the
   364          // final location of the module as returned by the registry, after
   365          // following any redirect indirection.
   366          "resolved_source": "./child"
   367  
   368          // "expressions" describes the expressions for the arguments within the
   369          // block that correspond to input variables in the child module.
   370          "expressions": <block-expressions-representation>,
   371  
   372          // "count_expression" and "for_each_expression" describe the expressions
   373          // given for the corresponding meta-arguments in the module
   374          // configuration block. These are omitted if the corresponding argument
   375          // isn't set.
   376          "count_expression": <expression-representation>,
   377          "for_each_expression": <expression-representation>,
   378  
   379          // "module" is a representation of the configuration of the child module
   380          // itself, using the same structure as the "root_module" object,
   381          // recursively describing the full module tree.
   382          "module": <module-config-representation>,
   383        }
   384      }
   385    }
   386  }
   387  ```
   388  
   389  ### Expression Representation
   390  
   391  Each unevaluated expression in the configuration is represented with an `<expression-representation>` object with the following structure:
   392  
   393  ```javascript
   394  {
   395    // "constant_value" is set only if the expression contains no references to
   396    // other objects, in which case it gives the resulting constant value. This is
   397    // mapped as for the individual values in a value representation.
   398    "constant_value": "hello",
   399  
   400    // Alternatively, "references" will be set to a list of references in the
   401    // expression. Multi-step references will be unwrapped and duplicated for each
   402    // significant traversal step, allowing callers to more easily recognize the
   403    // objects they care about without attempting to parse the expressions.
   404    // Callers should only use string equality checks here, since the syntax may
   405    // be extended in future releases.
   406    "references": [
   407      "data.template_file.foo[1].vars[\"baz\"]",
   408      "data.template_file.foo[1].vars", // implied by previous
   409      "data.template_file.foo[1]", // implied by previous
   410      "data.template_file.foo", // implied by previous
   411      "module.foo.bar",
   412      "module.foo", // implied by the previous
   413      "var.example[0]",
   414      "var.example", // implied by the previous
   415  
   416      // Partial references like "data" and "module" are not included, because
   417      // Terraform considers "module.foo" to be an atomic reference, not an
   418      // attribute access.
   419    ]
   420  }
   421  ```
   422  
   423  ### Block Expressions Representation
   424  
   425  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:
   426  
   427  ```javascript
   428  {
   429    // Attribute arguments are mapped directly with the attribute name as key and
   430    // an <expression-representation> as value.
   431    "ami": <expression-representation>,
   432    "instance_type": <expression-representation>,
   433  
   434    // Nested block arguments are mapped as either a single nested
   435    // <block-expressions-representation> or an array object of these, depending on the
   436    // block nesting mode chosen in the schema.
   437    //  - "single" nesting is a direct <block-expressions-representation>
   438    //  - "list" and "set" produce arrays
   439    //  - "map" produces an object
   440    "root_block_device": <expression-representation>,
   441    "ebs_block_device": [
   442      <expression-representation>
   443    ]
   444  }
   445  ```
   446  
   447  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.
   448  
   449  ## Change Representation
   450  
   451  A `<change-representation>` describes the change that will be made to the indicated object.
   452  
   453  ```javascript
   454  {
   455    // "actions" are the actions that will be taken on the object selected by the
   456    // properties below.
   457    // Valid actions values are:
   458    //    ["no-op"]
   459    //    ["create"]
   460    //    ["read"]
   461    //    ["update"]
   462    //    ["delete", "create"]
   463    //    ["create", "delete"]
   464    //    ["delete"]
   465    // The two "replace" actions are represented in this way to allow callers to
   466    // e.g. just scan the list for "delete" to recognize all three situations
   467    // where the object will be deleted, allowing for any new deletion
   468    // combinations that might be added in future.
   469    "actions": ["update"]
   470  
   471    // "before" and "after" are representations of the object value both before
   472    // and after the action. For ["create"] and ["delete"] actions, either
   473    // "before" or "after" is unset (respectively). For ["no-op"], the before and
   474    // after values are identical. The "after" value will be incomplete if there
   475    // are values within it that won't be known until after apply.
   476    "before": <value-representation>,
   477    "after": <value-representation>
   478  }
   479  ```