---
page_title: Upgrading to Terraform 0.8
description: Upgrading to Terraform v0.8
---

# Upgrading to Terraform v0.8

Terraform v0.8 is a major release and thus includes some backwards
incompatibilities that you'll need to consider when upgrading. This guide is
meant to help with that process.

The goal of this guide is to cover the most common upgrade concerns and
issues that would benefit from more explanation and background. The exhaustive
list of changes will always be the
[Terraform Changelog](https://github.com/hashicorp/terraform/blob/main/CHANGELOG.md).
After reviewing this guide, we recommend reviewing the Changelog to check on
specific notes about the resources and providers you use.

## Newlines in Strings

Newlines are no longer allowed in strings unless it is a heredoc or an
interpolation. This improves the performance of IDE syntax highlighting
of Terraform configurations and simplifies parsing.

**Behavior that no longer works in Terraform 0.8:**

```
resource "null_resource" "foo" {
  value = "foo
bar"
}
```

**Valid Terraform 0.8 configuration:**

```
resource "null_resource" "foo" {
  value = "foo\nbar"

  value2 = <<EOF
foo
bar
EOF

  # You can still have newlines within interpolations.
  value3 = "${lookup(
    var.foo, var.bar)}"
}
```

**Action:** Use heredocs or escape sequences when you have a string with newlines.

## Math Order of Operations

Math operations now follow standard mathematical order of operations.
Prior to 0.8, math ordering was simply left-to-right. With 0.8, `*`, `/`, and
`%` are done before `+`, `-`.

Some examples are shown below:

```
${1+5*2}   => 11 (was 12 in 0.7)
${4/2*5}   => 10 (was 10 in 0.7)
${(1+5)*2} => 12 (was 12 in 0.7)
```

**Action:** Use parantheses where necessary to be explicit about ordering.

## Escaped Variables in Templates

The `template_file` resource now requires that any variables specified
in an inline `template` attribute are now escaped. This _does not affect_
templates read from files either via `file()` or the `filename` attribute.

Inline variables must be escaped using two dollar signs. `${foo}` turns into
`$${foo}`.

This is necessary so that Terraform doesn't try to interpolate the values
before executing the template (for example using standard Terraform
interpolations). In Terraform 0.7, we had special case handling to ignore
templates, but this would cause confusion and poor error messages. Terraform
0.8 requires explicitly escaping variables.

**Behavior that no longer works in Terraform 0.8:**

```
data "template_file" "foo" {
    template = "${foo}"

    vars { foo = "value" }
}
```

**Valid Terraform 0.8 template:**

```
data "template_file" "foo" {
    template = "$${foo}"

    vars { foo = "value" }
}
```

**Action:** Escape variables in inline templates in `template_file` resources.

## Escape Sequences Within Interpolations

Values within interpolations now only need to be escaped once.

The exact behavior prior to 0.8 was inconsistent. In many cases, users
just added `\` until it happened to work. The behavior is now consistent:
single escape any values that need to be escaped.

For example:

```
${replace(var.foo, "\\", "\\\\")}
```

This will now replace `\` with `\\` throughout `var.foo`. Note that `\` and
`\\` are escaped exactly once. Prior to 0.8, this required double the escape
sequences to function properly.

A less complicated example:

```
${replace(var.foo, "\n", "")}

```

This does what you expect by replacing newlines with empty strings. Prior
to 0.8, you'd have to specify `\\n`, which could be confusing.

**Action:** Escape sequences within interpolations only need to be escaped
once.

## New Internal Graphs

The core graphs used to execute Terraform operations have been changed to
support new features. These require no configuration changes and should work
as normal.

They were tested extensively during 0.7.x behind experimental
flags and using the shadow graph. However, it is possible that there
are still edge cases that aren't properly handled.

While we believe it will be unlikely, if you find that something is not
working properly, you may use the `-Xlegacy-graph` flag on any Terraform
operation to use the old code path.

This flag will be removed prior to 0.9 (the next major release after 0.8),
so please report any issues that require this flag so we can make sure
they become fixed.

~> **Warning:** Some features (such as `depends_on` referencing modules)
do not work on the legacy graph code path. Specifically, any features
introduced in Terraform 0.8 won't work with the legacy code path. These
features will only work with the new, default graphs introduced with
Terraform 0.8.
