2014-07-28 19:43:00 +02:00
|
|
|
---
|
|
|
|
layout: "docs"
|
2020-06-18 03:17:17 +02:00
|
|
|
page_title: "Provider Configuration - Configuration Language"
|
2014-07-28 19:43:00 +02:00
|
|
|
sidebar_current: "docs-config-providers"
|
2014-10-22 05:21:56 +02:00
|
|
|
description: |-
|
|
|
|
Providers are responsible in Terraform for managing the lifecycle of a resource: create, read, update, delete.
|
2014-07-28 19:43:00 +02:00
|
|
|
---
|
|
|
|
|
2020-06-18 03:17:17 +02:00
|
|
|
# Provider Configuration
|
2014-07-28 19:43:00 +02:00
|
|
|
|
2019-01-17 01:30:43 +01:00
|
|
|
-> **Note:** This page is about Terraform 0.12 and later. For Terraform 0.11 and
|
|
|
|
earlier, see
|
|
|
|
[0.11 Configuration Language: Providers](../configuration-0-11/providers.html).
|
|
|
|
|
2020-06-18 03:17:17 +02:00
|
|
|
Terraform relies on plugins called "providers" to interact with remote systems.
|
|
|
|
Each provider offers a set of named
|
|
|
|
[resource types](resources.html#resource-types-and-arguments), and defines for
|
|
|
|
each resource type which arguments it accepts, which attributes it exports, and
|
|
|
|
how changes to resources of that type are actually applied to remote APIs.
|
2014-07-28 19:43:00 +02:00
|
|
|
|
2020-06-18 03:17:17 +02:00
|
|
|
Before you can use a particular provider, you must declare a dependency on it
|
|
|
|
using [provider requirements syntax](./provider-requirements.html).
|
2017-11-09 00:23:38 +01:00
|
|
|
|
2020-06-18 03:17:17 +02:00
|
|
|
Some providers require additional configuration to specify information such
|
|
|
|
as endpoint URLs and regions. A _provider configuration_ allows specifying that
|
|
|
|
information once and then reusing it for many resources in the same
|
|
|
|
configuration.
|
2014-07-28 19:43:00 +02:00
|
|
|
|
2018-05-05 23:34:43 +02:00
|
|
|
## Provider Configuration
|
2014-07-28 19:43:00 +02:00
|
|
|
|
2018-05-05 23:34:43 +02:00
|
|
|
A provider configuration is created using a `provider` block:
|
2014-07-28 19:43:00 +02:00
|
|
|
|
2017-04-05 17:29:27 +02:00
|
|
|
```hcl
|
2018-05-05 23:34:43 +02:00
|
|
|
provider "google" {
|
|
|
|
project = "acme-app"
|
|
|
|
region = "us-central1"
|
2014-07-28 19:43:00 +02:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2020-06-18 03:17:17 +02:00
|
|
|
The name given in the block header (`"google"` in this example) is the
|
|
|
|
[local name](./provider-requirements.html#local-names) of the provider
|
|
|
|
to configure.
|
2018-05-05 23:34:43 +02:00
|
|
|
|
|
|
|
The body of the block (between `{` and `}`) contains configuration arguments
|
2020-06-18 03:17:17 +02:00
|
|
|
for the provider itself. Most arguments in this section are defined by
|
2018-12-11 01:14:33 +01:00
|
|
|
the provider itself; in this example both `project` and `region`
|
2018-05-05 23:34:43 +02:00
|
|
|
are specific to the `google` provider.
|
|
|
|
|
|
|
|
The configuration arguments defined by the provider may be assigned using
|
2018-12-11 01:14:33 +01:00
|
|
|
[expressions](./expressions.html), which can for example
|
2018-05-05 23:34:43 +02:00
|
|
|
allow them to be parameterized by input variables. However, since provider
|
|
|
|
configurations must be evaluated in order to perform any resource type action,
|
|
|
|
provider configurations may refer only to values that are known before
|
|
|
|
the configuration is applied. In particular, avoid referring to attributes
|
|
|
|
exported by other resources unless their values are specified directly in the
|
|
|
|
configuration.
|
2014-07-28 19:43:00 +02:00
|
|
|
|
2018-12-11 01:14:33 +01:00
|
|
|
There are also two "meta-arguments" that are defined by Terraform itself
|
|
|
|
and available for all `provider` blocks:
|
|
|
|
|
|
|
|
- [`version`, for constraining the allowed provider versions][inpage-versions]
|
|
|
|
- [`alias`, for using the same provider with different configurations for different resources][inpage-alias]
|
2017-11-09 00:23:38 +01:00
|
|
|
|
2018-05-05 23:34:43 +02:00
|
|
|
Unlike many other objects in the Terraform language, a `provider` block may
|
|
|
|
be omitted if its contents would otherwise be empty. Terraform assumes an
|
|
|
|
empty default configuration for any provider that is not explicitly configured.
|
2017-11-09 00:23:38 +01:00
|
|
|
|
2020-06-18 03:17:17 +02:00
|
|
|
## Installation
|
2017-06-03 02:10:11 +02:00
|
|
|
|
|
|
|
Each time a new provider is added to configuration -- either explicitly via
|
2020-06-18 03:17:17 +02:00
|
|
|
a `provider` block or by adding a resource from that provider without an
|
|
|
|
associated `provider` block -- Terraform must install the provider before
|
|
|
|
it can be used. Installation locates and downloads the provider's plugin so
|
|
|
|
that it can be executed later.
|
2017-06-03 02:10:11 +02:00
|
|
|
|
|
|
|
Provider initialization is one of the actions of `terraform init`. Running
|
2020-06-18 03:17:17 +02:00
|
|
|
this command will install any providers that are not already installed.
|
2017-06-03 02:10:11 +02:00
|
|
|
|
2018-10-03 01:53:29 +02:00
|
|
|
Providers downloaded by `terraform init` are only installed for the current
|
|
|
|
working directory; other working directories can have their own installed
|
2020-06-18 03:17:17 +02:00
|
|
|
provider plugins, which may be of differing versions.
|
2018-10-03 01:53:29 +02:00
|
|
|
|
2017-06-03 02:10:11 +02:00
|
|
|
For more information, see
|
|
|
|
[the `terraform init` command](/docs/commands/init.html).
|
|
|
|
|
2019-10-28 23:53:06 +01:00
|
|
|
## Provider Versions
|
2018-12-11 01:14:33 +01:00
|
|
|
|
2019-10-28 23:53:06 +01:00
|
|
|
[inpage-versions]: #provider-versions
|
2017-06-03 02:10:11 +02:00
|
|
|
|
2018-05-05 23:34:43 +02:00
|
|
|
Providers are plugins released on a separate rhythm from Terraform itself, and
|
|
|
|
so they have their own version numbers. For production use, you should
|
2017-06-03 02:10:11 +02:00
|
|
|
constrain the acceptable provider versions via configuration, to ensure that
|
|
|
|
new versions with breaking changes will not be automatically installed by
|
|
|
|
`terraform init` in future.
|
|
|
|
|
2020-06-18 03:17:17 +02:00
|
|
|
For more information on specifying version constraints, see
|
|
|
|
[Provider Requirements](./provider-requirements.html).
|
2018-01-11 18:38:43 +01:00
|
|
|
|
2020-06-18 03:17:17 +02:00
|
|
|
When you re-run `terraform init` with providers already installed, Terraform
|
|
|
|
will use an already-installed provider that meets the constraints in preference
|
2017-08-28 20:48:39 +02:00
|
|
|
to downloading a new version. To upgrade to the latest acceptable version
|
|
|
|
of each provider, run `terraform init -upgrade`. This command also upgrades
|
2020-06-18 03:17:17 +02:00
|
|
|
to the latest versions of all remote Terraform modules.
|
2017-08-28 20:48:39 +02:00
|
|
|
|
2020-06-18 03:17:17 +02:00
|
|
|
In versions of Terraform prior to Terraform 0.12, provider version constraints
|
|
|
|
could be specified using a `version` argument within a `provider` block, which
|
|
|
|
would simultaneously declare a new provider requirement _and_ provider
|
|
|
|
configuration, but that overloading can cause problems particularly when
|
|
|
|
writing shared modules. For that reason, we recommend always omitting the
|
|
|
|
`version` argument within `provider` blocks, and specifying version
|
|
|
|
constraints instead using [Provider Requirements](./provider-requirements.html).
|
2019-06-12 19:13:27 +02:00
|
|
|
|
2018-12-11 01:14:33 +01:00
|
|
|
## `alias`: Multiple Provider Instances
|
|
|
|
|
|
|
|
[inpage-alias]: #alias-multiple-provider-instances
|
2015-04-21 01:54:56 +02:00
|
|
|
|
2018-12-11 01:14:33 +01:00
|
|
|
You can optionally define multiple configurations for the same provider, and
|
|
|
|
select which one to use on a per-resource or per-module basis. The primary
|
|
|
|
reason for this is to support multiple regions for a cloud platform; other
|
|
|
|
examples include targeting multiple Docker hosts, multiple Consul hosts, etc.
|
2015-04-21 01:54:56 +02:00
|
|
|
|
2018-03-07 16:57:25 +01:00
|
|
|
To include multiple configurations for a given provider, include multiple
|
2018-05-05 23:34:43 +02:00
|
|
|
`provider` blocks with the same provider name, but set the `alias` meta-argument
|
|
|
|
to an alias name to use for each additional configuration. For example:
|
2015-04-21 01:54:56 +02:00
|
|
|
|
2017-04-05 17:29:27 +02:00
|
|
|
```hcl
|
2017-11-09 00:23:38 +01:00
|
|
|
# The default provider configuration
|
2015-04-21 01:54:56 +02:00
|
|
|
provider "aws" {
|
2018-05-05 23:34:43 +02:00
|
|
|
region = "us-east-1"
|
2015-04-21 01:54:56 +02:00
|
|
|
}
|
|
|
|
|
2017-11-09 00:23:38 +01:00
|
|
|
# Additional provider configuration for west coast region
|
2015-04-21 01:54:56 +02:00
|
|
|
provider "aws" {
|
2017-04-05 17:29:27 +02:00
|
|
|
alias = "west"
|
|
|
|
region = "us-west-2"
|
2015-04-21 01:54:56 +02:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2018-05-05 23:34:43 +02:00
|
|
|
The `provider` block without `alias` set is known as the _default_ provider
|
2017-11-09 00:23:38 +01:00
|
|
|
configuration. When `alias` is set, it creates an _additional_ provider
|
|
|
|
configuration. For providers that have no required configuration arguments, the
|
2018-05-05 23:34:43 +02:00
|
|
|
implied _empty_ configuration is considered to be the _default_ provider
|
2017-11-09 00:23:38 +01:00
|
|
|
configuration.
|
|
|
|
|
2018-12-11 01:14:33 +01:00
|
|
|
### Referring to Alternate Providers
|
|
|
|
|
|
|
|
When Terraform needs the name of a provider configuration, it always expects a
|
|
|
|
reference of the form `<PROVIDER NAME>.<ALIAS>`. In the example above,
|
|
|
|
`aws.west` would refer to the provider with the `us-west-2` region.
|
|
|
|
|
|
|
|
These references are special expressions. Like references to other named
|
|
|
|
entities (for example, `var.image_id`), they aren't strings and don't need to be
|
|
|
|
quoted. But they are only valid in specific meta-arguments of `resource`,
|
|
|
|
`data`, and `module` blocks, and can't be used in arbitrary expressions.
|
|
|
|
|
|
|
|
### Selecting Alternate Providers
|
2017-11-09 00:23:38 +01:00
|
|
|
|
2018-12-11 01:14:33 +01:00
|
|
|
By default, resources use a default provider configuration inferred from the
|
|
|
|
first word of the resource type name. For example, a resource of type
|
|
|
|
`aws_instance` uses the default (un-aliased) `aws` provider configuration unless
|
|
|
|
otherwise stated.
|
|
|
|
|
|
|
|
To select an aliased provider for a resource or data source, set its `provider`
|
|
|
|
meta-argument to a `<PROVIDER NAME>.<ALIAS>` reference:
|
2015-04-21 01:54:56 +02:00
|
|
|
|
2017-04-05 17:29:27 +02:00
|
|
|
```hcl
|
2015-04-21 01:54:56 +02:00
|
|
|
resource "aws_instance" "foo" {
|
2018-05-05 23:34:43 +02:00
|
|
|
provider = aws.west
|
2015-04-21 01:54:56 +02:00
|
|
|
|
2017-04-05 17:29:27 +02:00
|
|
|
# ...
|
2015-04-21 01:54:56 +02:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2018-12-11 01:14:33 +01:00
|
|
|
To select aliased providers for a child module, use its `providers`
|
|
|
|
meta-argument to specify which aliased providers should be mapped to which local
|
|
|
|
provider names inside the module:
|
|
|
|
|
|
|
|
```hcl
|
|
|
|
module "aws_vpc" {
|
|
|
|
source = "./aws_vpc"
|
|
|
|
providers = {
|
|
|
|
aws = aws.west
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
2014-07-28 19:43:00 +02:00
|
|
|
|
2018-12-11 01:14:33 +01:00
|
|
|
Modules have some special requirements when passing in providers; see
|
2019-03-13 19:07:10 +01:00
|
|
|
[Providers within Modules](./modules.html#providers-within-modules)
|
2018-12-11 01:14:33 +01:00
|
|
|
for more details. In most cases, only _root modules_ should define provider
|
|
|
|
configurations, with all child modules obtaining their provider configurations
|
|
|
|
from their parents.
|
2017-09-08 01:43:13 +02:00
|
|
|
|
|
|
|
## Third-party Plugins
|
|
|
|
|
2018-10-03 01:53:29 +02:00
|
|
|
Anyone can develop and distribute their own Terraform providers. (See
|
|
|
|
[Writing Custom Providers](/docs/extend/writing-custom-providers.html) for more
|
2020-04-23 03:43:07 +02:00
|
|
|
about provider development.)
|
|
|
|
|
|
|
|
The main way to distribute a provider is via a provider registry, and the main
|
|
|
|
provider registry is
|
|
|
|
[part of the public Terraform Registry](https://registry.terraform.io/browse/providers),
|
|
|
|
along with public shared modules.
|
|
|
|
|
|
|
|
Installing directly from a registry is not appropriate for all situations,
|
|
|
|
though. If you are running Terraform from a system that cannot access some or
|
2020-06-18 03:17:17 +02:00
|
|
|
all of the necessary registry hosts, you can configure Terraform to obtain
|
2020-04-23 03:43:07 +02:00
|
|
|
providers from a local mirror instead. For more information, see
|
|
|
|
[Provider Installation](../commands/cli-config.html#provider-installation)
|
|
|
|
in the CLI configuration documentation.
|
2017-09-08 02:40:00 +02:00
|
|
|
|
|
|
|
## Provider Plugin Cache
|
|
|
|
|
|
|
|
By default, `terraform init` downloads plugins into a subdirectory of the
|
|
|
|
working directory so that each working directory is self-contained. As a
|
|
|
|
consequence, if you have multiple configurations that use the same provider
|
|
|
|
then a separate copy of its plugin will be downloaded for each configuration.
|
|
|
|
|
|
|
|
Given that provider plugins can be quite large (on the order of hundreds of
|
|
|
|
megabytes), this default behavior can be inconvenient for those with slow
|
|
|
|
or metered Internet connections. Therefore Terraform optionally allows the
|
|
|
|
use of a local directory as a shared plugin cache, which then allows each
|
|
|
|
distinct plugin binary to be downloaded only once.
|
|
|
|
|
|
|
|
To enable the plugin cache, use the `plugin_cache_dir` setting in
|
2018-12-11 01:14:33 +01:00
|
|
|
[the CLI configuration file](/docs/commands/cli-config.html).
|