| --- |
| 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. |