2016-11-23 12:04:51 -06:00
|
|
|
---
|
2018-12-20 20:18:13 -06:00
|
|
|
layout: "guides"
|
2016-11-23 12:04:51 -06:00
|
|
|
page_title: "Upgrading to Terraform 0.8"
|
|
|
|
sidebar_current: "upgrade-guides-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/master/CHANGELOG.md).
|
|
|
|
After reviewing this guide, we recommend reviewing the Changelog to check on
|
|
|
|
specific notes about the resources and providers you use.
|
|
|
|
|
2016-11-29 12:34:51 -06:00
|
|
|
## 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.
|
|
|
|
|
2016-11-23 12:04:51 -06:00
|
|
|
## 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.
|