2017-02-15 00:47:20 +01:00
|
|
|
---
|
2020-08-15 03:51:06 +02:00
|
|
|
layout: "language"
|
2017-02-15 00:47:20 +01:00
|
|
|
page_title: "Backends: Configuration"
|
|
|
|
sidebar_current: "docs-backends-config"
|
|
|
|
description: |-
|
2017-02-15 01:09:00 +01:00
|
|
|
Backends are configured directly in Terraform files in the `terraform` section.
|
2017-02-15 00:47:20 +01:00
|
|
|
---
|
|
|
|
|
|
|
|
# Backend Configuration
|
|
|
|
|
|
|
|
Backends are configured directly in Terraform files in the `terraform`
|
|
|
|
section. After configuring a backend, it has to be
|
|
|
|
[initialized](/docs/backends/init.html).
|
|
|
|
|
|
|
|
Below, we show a complete example configuring the "consul" backend:
|
|
|
|
|
2017-04-05 17:29:27 +02:00
|
|
|
```hcl
|
2017-02-15 00:47:20 +01:00
|
|
|
terraform {
|
|
|
|
backend "consul" {
|
|
|
|
address = "demo.consul.io"
|
2018-06-22 19:18:27 +02:00
|
|
|
scheme = "https"
|
2017-07-25 02:04:28 +02:00
|
|
|
path = "example_app/terraform_state"
|
2017-02-15 00:47:20 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
You specify the backend type as a key to the `backend` stanza. Within the
|
|
|
|
stanza are backend-specific configuration keys. The list of supported backends
|
2020-10-22 18:49:40 +02:00
|
|
|
and their configuration details can be found [here](/docs/backends/types/index.html).
|
2017-02-15 00:47:20 +01:00
|
|
|
|
|
|
|
Only one backend may be specified and the configuration **may not contain
|
|
|
|
interpolations**. Terraform will validate this.
|
|
|
|
|
|
|
|
## First Time Configuration
|
|
|
|
|
|
|
|
When configuring a backend for the first time (moving from no defined backend
|
|
|
|
to explicitly configuring one), Terraform will give you the option to migrate
|
|
|
|
your state to the new backend. This lets you adopt backends without losing
|
|
|
|
any existing state.
|
|
|
|
|
|
|
|
To be extra careful, we always recommend manually backing up your state
|
|
|
|
as well. You can do this by simply copying your `terraform.tfstate` file
|
|
|
|
to another location. The initialization process should create a backup
|
|
|
|
as well, but it never hurts to be safe!
|
|
|
|
|
|
|
|
Configuring a backend for the first time is no different than changing
|
|
|
|
a configuration in the future: create the new configuration and run
|
|
|
|
`terraform init`. Terraform will guide you the rest of the way.
|
|
|
|
|
|
|
|
## Partial Configuration
|
|
|
|
|
2017-07-25 02:04:28 +02:00
|
|
|
You do not need to specify every required argument in the backend configuration.
|
|
|
|
Omitting certain arguments may be desirable to avoid storing secrets, such as
|
|
|
|
access keys, within the main configuration. When some or all of the arguments
|
2018-03-18 07:01:30 +01:00
|
|
|
are omitted, we call this a _partial configuration_.
|
2017-02-15 00:47:20 +01:00
|
|
|
|
2017-07-25 02:04:28 +02:00
|
|
|
With a partial configuration, the remaining configuration arguments must be
|
|
|
|
provided as part of
|
|
|
|
[the initialization process](/docs/backends/init.html#backend-initialization).
|
|
|
|
There are several ways to supply the remaining arguments:
|
2017-02-15 00:47:20 +01:00
|
|
|
|
|
|
|
* **Interactively**: Terraform will interactively ask you for the required
|
2017-07-25 02:04:28 +02:00
|
|
|
values, unless interactive input is disabled. Terraform will not prompt for
|
|
|
|
optional values.
|
|
|
|
|
2020-06-26 18:49:31 +02:00
|
|
|
* **File**: A [backend configuration file](#backend-configuration-file) may be specified via the
|
|
|
|
`init` command line. To specify a file, use the `-backend-config=PATH`
|
|
|
|
option when running `terraform init`. If the file contains secrets it may be
|
|
|
|
kept in a secure data store, such as [Vault](https://www.vaultproject.io/),
|
|
|
|
in which case it must be downloaded to the local disk before running
|
|
|
|
Terraform.
|
2017-07-25 02:04:28 +02:00
|
|
|
|
|
|
|
* **Command-line key/value pairs**: Key/value pairs can be specified via the
|
|
|
|
`init` command line. Note that many shells retain command-line flags in a
|
|
|
|
history file, so this isn't recommended for secrets. To specify a single
|
|
|
|
key/value pair, use the `-backend-config="KEY=VALUE"` option when running
|
|
|
|
`terraform init`.
|
|
|
|
|
|
|
|
If backend settings are provided in multiple locations, the top-level
|
|
|
|
settings are merged such that any command-line options override the settings
|
|
|
|
in the main configuration and then the command-line options are processed
|
|
|
|
in order, with later options overriding values set by earlier options.
|
|
|
|
|
|
|
|
The final, merged configuration is stored on disk in the `.terraform`
|
|
|
|
directory, which should be ignored from version control. This means that
|
|
|
|
sensitive information can be omitted from version control, but it will be
|
|
|
|
present in plain text on local disk when running Terraform.
|
2017-02-15 00:47:20 +01:00
|
|
|
|
2017-03-17 07:32:45 +01:00
|
|
|
When using partial configuration, Terraform requires at a minimum that
|
2017-07-25 02:04:28 +02:00
|
|
|
an empty backend configuration is specified in one of the root Terraform
|
|
|
|
configuration files, to specify the backend type. For example:
|
2017-03-17 07:32:45 +01:00
|
|
|
|
2017-04-05 17:29:27 +02:00
|
|
|
```hcl
|
2017-03-17 07:32:45 +01:00
|
|
|
terraform {
|
|
|
|
backend "consul" {}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2020-06-26 18:49:31 +02:00
|
|
|
## Backend Configuration File
|
2017-07-25 02:04:28 +02:00
|
|
|
A backend configuration file has the contents of the `backend` block as
|
|
|
|
top-level attributes, without the need to wrap it in another `terraform`
|
|
|
|
or `backend` block:
|
|
|
|
|
|
|
|
```hcl
|
|
|
|
address = "demo.consul.io"
|
|
|
|
path = "example_app/terraform_state"
|
2018-06-22 19:18:27 +02:00
|
|
|
scheme = "https"
|
2017-07-25 02:04:28 +02:00
|
|
|
```
|
|
|
|
|
|
|
|
The same settings can alternatively be specified on the command line as
|
|
|
|
follows:
|
|
|
|
|
|
|
|
```
|
|
|
|
$ terraform init \
|
|
|
|
-backend-config="address=demo.consul.io" \
|
2018-06-22 19:18:27 +02:00
|
|
|
-backend-config="path=example_app/terraform_state" \
|
|
|
|
-backend-config="scheme=https"
|
2017-07-25 02:04:28 +02:00
|
|
|
```
|
2017-03-17 07:32:45 +01:00
|
|
|
|
2017-02-15 00:47:20 +01:00
|
|
|
## Changing Configuration
|
|
|
|
|
|
|
|
You can change your backend configuration at any time. You can change
|
|
|
|
both the configuration itself as well as the type of backend (for example
|
|
|
|
from "consul" to "s3").
|
|
|
|
|
|
|
|
Terraform will automatically detect any changes in your configuration
|
|
|
|
and request a [reinitialization](/docs/backends/init.html). As part of
|
|
|
|
the reinitialization process, Terraform will ask if you'd like to migrate
|
|
|
|
your existing state to the new configuration. This allows you to easily
|
|
|
|
switch from one backend to another.
|
|
|
|
|
2017-07-25 02:04:28 +02:00
|
|
|
If you're using multiple [workspaces](/docs/state/workspaces.html),
|
|
|
|
Terraform can copy all workspaces to the destination. If Terraform detects
|
|
|
|
you have multiple workspaces, it will ask if this is what you want to do.
|
2017-03-02 06:54:47 +01:00
|
|
|
|
2017-02-15 00:47:20 +01:00
|
|
|
If you're just reconfiguring the same backend, Terraform will still ask if you
|
|
|
|
want to migrate your state. You can respond "no" in this scenario.
|
|
|
|
|
|
|
|
## Unconfiguring a Backend
|
|
|
|
|
|
|
|
If you no longer want to use any backend, you can simply remove the
|
|
|
|
configuration from the file. Terraform will detect this like any other
|
|
|
|
change and prompt you to [reinitialize](/docs/backends/init.html).
|
|
|
|
|
|
|
|
As part of the reinitialization, Terraform will ask if you'd like to migrate
|
|
|
|
your state back down to normal local state. Once this is complete then
|
|
|
|
Terraform is back to behaving as it does by default.
|