github.com/iaas-resource-provision/iaas-rpc@v1.0.7-0.20211021023331-ed21f798c408/website/docs/language/providers/requirements.html.md (about)

     1  ---
     2  layout: "language"
     3  page_title: "Provider Requirements - Configuration Language"
     4  ---
     5  
     6  # Provider Requirements
     7  
     8  -> **Note:** This page is about a feature of Terraform 0.13 and later; it also
     9  describes how to use the more limited version of that feature that was available
    10  in Terraform 0.12.
    11  
    12  Terraform relies on plugins called "providers" to interact with remote systems.
    13  
    14  Terraform configurations must declare which providers they require, so that
    15  Terraform can install and use them. Additionally, some providers require
    16  configuration (like endpoint URLs or cloud regions) before they can be used.
    17  
    18  - This page documents how to declare providers so Terraform can install them.
    19  
    20  - The [Provider Configuration](/docs/language/providers/configuration.html) page documents how to configure
    21    settings for providers.
    22  
    23  ## Requiring Providers
    24  
    25  Each Terraform module must declare which providers it requires, so that
    26  Terraform can install and use them. Provider requirements are declared in a
    27  `required_providers` block.
    28  
    29  A provider requirement consists of a local name, a source location, and a
    30  version constraint:
    31  
    32  ```hcl
    33  terraform {
    34    required_providers {
    35      mycloud = {
    36        source  = "mycorp/mycloud"
    37        version = "~> 1.0"
    38      }
    39    }
    40  }
    41  ```
    42  
    43  The `required_providers` block must be nested inside the top-level
    44  [`terraform` block](/docs/language/settings/index.html) (which can also contain other settings).
    45  
    46  Each argument in the `required_providers` block enables one provider. The key
    47  determines the provider's [local name](#local-names) (its unique identifier
    48  within this module), and the value is an object with the following elements:
    49  
    50  * `source` - the global [source address](#source-addresses) for the
    51    provider you intend to use, such as `hashicorp/aws`.
    52  
    53  * `version` - a [version constraint](#version-constraints) specifying
    54    which subset of available provider versions the module is compatible with.
    55  
    56  -> **Note:** The `name = { source, version }` syntax for `required_providers`
    57  was added in Terraform v0.13. Previous versions of Terraform used a version
    58  constraint string instead of an object (like `mycloud = "~> 1.0"`), and had no
    59  way to specify provider source addresses. If you want to write a module that
    60  works with both Terraform v0.12 and v0.13, see [v0.12-Compatible Provider
    61  Requirements](#v0-12-compatible-provider-requirements) below.
    62  
    63  ## Names and Addresses
    64  
    65  Each provider has two identifiers:
    66  
    67  - A unique _source address,_ which is only used when requiring a provider.
    68  - A _local name,_ which is used everywhere else in a Terraform module.
    69  
    70  -> **Note:** Prior to Terraform 0.13, providers only had local names, since
    71  Terraform could only automatically download providers distributed by HashiCorp.
    72  
    73  ### Local Names
    74  
    75  Local names are module-specific, and are assigned when requiring a provider.
    76  Local names must be unique per-module.
    77  
    78  Outside of the `required_providers` block, Terraform configurations always refer
    79  to providers by their local names. For example, the following configuration
    80  declares `mycloud` as the local name for `mycorp/mycloud`, then uses that local
    81  name when [configuring the provider](/docs/language/providers/configuration.html):
    82  
    83  ```hcl
    84  terraform {
    85    required_providers {
    86      mycloud = {
    87        source  = "mycorp/mycloud"
    88        version = "~> 1.0"
    89      }
    90    }
    91  }
    92  
    93  provider "mycloud" {
    94    # ...
    95  }
    96  ```
    97  
    98  Users of a provider can choose any local name for it. However, nearly every
    99  provider has a _preferred local name,_ which it uses as a prefix for all of its
   100  resource types. (For example, resources from `hashicorp/aws` all begin with
   101  `aws`, like `aws_instance` or `aws_security_group`.)
   102  
   103  Whenever possible, you should use a provider's preferred local name. This makes
   104  your configurations easier to understand, and lets you omit the `provider`
   105  meta-argument from most of your resources. (If a resource doesn't specify which
   106  provider configuration to use, Terraform interprets the first word of the
   107  resource type as a local provider name.)
   108  
   109  ### Source Addresses
   110  
   111  A provider's source address is its global identifier. It also specifies the
   112  primary location where Terraform can download it.
   113  
   114  Source addresses consist of three parts delimited by slashes (`/`), as
   115  follows:
   116  
   117  `[<HOSTNAME>/]<NAMESPACE>/<TYPE>`
   118  
   119  * **Hostname** (optional): The hostname of the Terraform registry that
   120    distributes the provider. If omitted, this defaults to
   121    `registry.terraform.io`, the hostname of
   122    [the public Terraform Registry](https://registry.terraform.io/).
   123  
   124  * **Namespace:** An organizational namespace within the specified registry.
   125    For the public Terraform Registry and for Terraform Cloud's private registry,
   126    this represents the organization that publishes the provider. This field
   127    may have other meanings for other registry hosts.
   128  
   129  * **Type:** A short name for the platform or system the provider manages. Must
   130    be unique within a particular namespace on a particular registry host.
   131  
   132      The type is usually the provider's preferred local name. (There are
   133      exceptions; for example,
   134      [`hashicorp/google-beta`](https://registry.terraform.io/providers/hashicorp/google-beta/latest)
   135      is an alternate release channel for `hashicorp/google`, so its preferred
   136      local name is `google`. If in doubt, check the provider's documentation.)
   137  
   138  For example,
   139  [the official HTTP provider](https://registry.terraform.io/providers/hashicorp/http)
   140  belongs to the `hashicorp` namespace on `registry.terraform.io`, so its
   141  source address is `registry.terraform.io/hashicorp/http` or, more commonly, just
   142  `hashicorp/http`.
   143  
   144  The source address with all three components given explicitly is called the
   145  provider's _fully-qualified address_. You will see fully-qualified address in
   146  various outputs, like error messages, but in most cases a simplified display
   147  version is used. This display version omits the source host when it is the
   148  public registry, so you may see the shortened version `"hashicorp/random"` instead
   149  of `"registry.terraform.io/hashicorp/random"`.
   150  
   151  
   152  -> **Note:** If you omit the `source` argument when requiring a provider,
   153  Terraform uses an implied source address of
   154  `registry.terraform.io/hashicorp/<LOCAL NAME>`. This is a backward compatibility
   155  feature to support the transition to Terraform 0.13; in modules that require
   156  0.13 or later, we recommend using explicit source addresses for all providers.
   157  
   158  ### Handling Local Name Conflicts
   159  
   160  Whenever possible, we recommend using a provider's preferred local name, which
   161  is usually the same as the "type" portion of its source address.
   162  
   163  However, it's sometimes necessary to use two providers with the same preferred
   164  local name in the same module, usually when the providers are named after a
   165  generic infrastructure type. Terraform requires unique local names for each
   166  provider in a module, so you'll need to use a non-preferred name for at least
   167  one of them.
   168  
   169  When this happens, we recommend combining each provider's namespace with
   170  its type name to produce compound local names with a dash:
   171  
   172  ```hcl
   173  terraform {
   174    required_providers {
   175      # In the rare situation of using two providers that
   176      # have the same type name -- "http" in this example --
   177      # use a compound local name to distinguish them.
   178      hashicorp-http = {
   179        source  = "hashicorp/http"
   180        version = "~> 2.0"
   181      }
   182      mycorp-http = {
   183        source  = "mycorp/http"
   184        version = "~> 1.0"
   185      }
   186    }
   187  }
   188  
   189  # References to these providers elsewhere in the
   190  # module will use these compound local names.
   191  provider "mycorp-http" {
   192    # ...
   193  }
   194  
   195  data "http" "example" {
   196    provider = hashicorp-http
   197    #...
   198  }
   199  ```
   200  
   201  Terraform won't be able to guess either provider's name from its resource types,
   202  so you'll need to specify a `provider` meta-argument for every affected
   203  resource. However, readers and maintainers of your module will be able to easily
   204  understand what's happening, and avoiding confusion is much more important than
   205  avoiding typing.
   206  
   207  ## Version Constraints
   208  
   209  Each provider plugin has its own set of available versions, allowing the
   210  functionality of the provider to evolve over time. Each provider dependency you
   211  declare should have a [version constraint](/docs/language/expressions/version-constraints.html) given in
   212  the `version` argument so Terraform can select a single version per provider
   213  that all modules are compatible with.
   214  
   215  The `version` argument is optional; if omitted, Terraform will accept any
   216  version of the provider as compatible. However, we strongly recommend specifying
   217  a version constraint for every provider your module depends on.
   218  
   219  To ensure Terraform always installs the same provider versions for a given
   220  configuration, you can use Terraform CLI to create a
   221  [dependency lock file](/docs/language/dependency-lock.html)
   222  and commit it to version control along with your configuration. If a lock file
   223  is present, Terraform Cloud, CLI, and Enterprise will all obey it when
   224  installing providers.
   225  
   226  > **Hands-on:** Try the [Lock and Upgrade Provider Versions](https://learn.hashicorp.com/tutorials/terraform/provider-versioning?in=terraform/configuration-language&utm_source=WEBSITE&utm_medium=WEB_IO&utm_offer=ARTICLE_PAGE&utm_content=DOCS) tutorial on HashiCorp Learn.
   227  
   228  ### Best Practices for Provider Versions
   229  
   230  Each module should at least declare the minimum provider version it is known
   231  to work with, using the `>=` version constraint syntax:
   232  
   233  ```hcl
   234  terraform {
   235    required_providers {
   236      mycloud = {
   237        source  = "hashicorp/aws"
   238        version = ">= 1.0"
   239      }
   240    }
   241  }
   242  ```
   243  
   244  A module intended to be used as the root of a configuration — that is, as the
   245  directory where you'd run `terraform apply` — should also specify the
   246  _maximum_ provider version it is intended to work with, to avoid accidental
   247  upgrades to incompatible new versions. The `~>` operator is a convenient
   248  shorthand for allowing only patch releases within a specific minor release:
   249  
   250  ```hcl
   251  terraform {
   252    required_providers {
   253      mycloud = {
   254        source  = "hashicorp/aws"
   255        version = "~> 1.0.4"
   256      }
   257    }
   258  }
   259  ```
   260  
   261  Do not use `~>` (or other maximum-version constraints) for modules you intend to
   262  reuse across many configurations, even if you know the module isn't compatible
   263  with certain newer versions. Doing so can sometimes prevent errors, but more
   264  often it forces users of the module to update many modules simultaneously when
   265  performing routine upgrades. Specify a minimum version, document any known
   266  incompatibilities, and let the root module manage the maximum version.
   267  
   268  ## Built-in Providers
   269  
   270  While most Terraform providers are distributed separately as plugins, there
   271  is currently one provider that is built in to Terraform itself, which
   272  provides
   273  [the `terraform_remote_state` data source](/docs/language/state/remote-state-data.html).
   274  
   275  Because this provider is built in to Terraform, you don't need to declare it
   276  in the `required_providers` block in order to use its features. However, for
   277  consistency it _does_ have a special provider source address, which is
   278  `terraform.io/builtin/terraform`. This address may sometimes appear in
   279  Terraform's error messages and other output in order to unambiguously refer
   280  to the built-in provider, as opposed to a hypothetical third-party provider
   281  with the type name "terraform".
   282  
   283  There is also an existing provider with the source address
   284  `hashicorp/terraform`, which is an older version of the now-built-in provider
   285  that was used by older versions of Terraform. `hashicorp/terraform` is not
   286  compatible with Terraform v0.11 or later and should never be declared in a
   287  `required_providers` block.
   288  
   289  ## In-house Providers
   290  
   291  Anyone can develop and distribute their own Terraform providers. See
   292  the [Call APIs with Terraform Providers](https://learn.hashicorp.com/collections/terraform/providers?utm_source=WEBSITE&utm_medium=WEB_IO&utm_offer=ARTICLE_PAGE&utm_content=DOCS)
   293  collection on HashiCorp Learn for more
   294  about provider development.
   295  
   296  Some organizations develop their own providers to configure
   297  proprietary systems, and wish to use these providers from Terraform without
   298  publishing them on the public Terraform Registry.
   299  
   300  One option for distributing such a provider is to run an in-house _private_
   301  registry, by implementing
   302  [the provider registry protocol](/docs/internals/provider-registry-protocol.html).
   303  
   304  Running an additional service just to distribute a single provider internally
   305  may be undesirable, so Terraform also supports
   306  [other provider installation methods](/docs/cli/config/config-file.html#provider-installation),
   307  including placing provider plugins directly in specific directories in the
   308  local filesystem, via _filesystem mirrors_.
   309  
   310  All providers must have a [source address](#source-addresses) that includes
   311  (or implies) the hostname of a registry, but that hostname does not need to
   312  provide an actual registry service. For in-house providers that you intend to
   313  distribute from a local filesystem directory, you can use an arbitrary hostname
   314  in a domain your organization controls.
   315  
   316  For example, if your corporate domain were `example.com` then you might choose
   317  to use `terraform.example.com` as your placeholder hostname, even if that
   318  hostname doesn't actually resolve in DNS. You can then choose any namespace and
   319  type you wish to represent your in-house provider under that hostname, giving
   320  a source address like `terraform.example.com/examplecorp/ourcloud`:
   321  
   322  ```hcl
   323  terraform {
   324    required_providers {
   325      mycloud = {
   326        source  = "terraform.example.com/examplecorp/ourcloud"
   327        version = ">= 1.0"
   328      }
   329    }
   330  }
   331  ```
   332  
   333  To make version 1.0.0 of this provider available for installation from the
   334  local filesystem, choose one of the
   335  [implied local mirror directories](/docs/cli/config/config-file.html#implied-local-mirror-directories)
   336  and create a directory structure under it like this:
   337  
   338  ```
   339  terraform.example.com/examplecorp/ourcloud/1.0.0
   340  ```
   341  
   342  Under that `1.0.0` directory, create one additional directory representing the
   343  platform where you are running Terraform, such as `linux_amd64` for Linux on
   344  an AMD64/x64 processor, and then place the provider plugin executable and any
   345  other needed files in that directory.
   346  
   347  Thus, on a Windows system, the provider plugin executable file might be at the
   348  following path:
   349  
   350  ```
   351  terraform.example.com/examplecorp/ourcloud/1.0.0/windows_amd64/terraform-provider-ourcloud.exe
   352  ```
   353  
   354  If you later decide to switch to using a real private provider registry rather
   355  than distribute binaries out of band, you can deploy the registry server at
   356  `terraform.example.com` and retain the same namespace and type names, in which
   357  case your existing modules will require no changes to locate the same provider
   358  using your registry server.
   359  
   360  ## v0.12-Compatible Provider Requirements
   361  
   362  Explicit provider source addresses were introduced with Terraform v0.13, so the
   363  full provider requirements syntax is not supported by Terraform v0.12.
   364  
   365  However, in order to allow writing modules that are compatible with both
   366  Terraform v0.12 and v0.13, versions of Terraform between v0.12.26 and v0.13
   367  will accept but ignore the `source` argument in a `required_providers` block.
   368  
   369  Consider the following example written for Terraform v0.13:
   370  
   371  ```hcl
   372  terraform {
   373    required_providers {
   374      aws = {
   375        source  = "hashicorp/aws"
   376        version = "~> 1.0"
   377      }
   378    }
   379  }
   380  ```
   381  
   382  Terraform v0.12.26 will accept syntax like the above but will understand it
   383  in the same way as the following v0.12-style syntax:
   384  
   385  ```hcl
   386  terraform {
   387    required_providers {
   388      aws = "~> 1.0"
   389    }
   390  }
   391  ```
   392  
   393  In other words, Terraform v0.12.26 ignores the `source` argument and considers
   394  only the `version` argument, using the given [local name](#local-names) as the
   395  un-namespaced provider type to install.
   396  
   397  When writing a module that is compatible with both Terraform v0.12.26 and
   398  Terraform v0.13.0 or later, you must follow the following additional rules so
   399  that both versions will select the same provider to install:
   400  
   401  * Use only providers that can be automatically installed by Terraform v0.12.
   402    Third-party providers, such as community providers in the Terraform Registry,
   403    cannot be selected by Terraform v0.12 because it does not support the
   404    hierarchical source address namespace.
   405  
   406  * Ensure that your chosen local name exactly matches the "type" portion of the
   407    source address given in the `source` argument, such as both being "aws" in
   408    the examples above, because Terraform v0.12 will use the local name to
   409    determine which provider plugin to download and install.
   410  
   411  * If the provider belongs to the `hashicorp` namespace, as with the
   412    `hashicorp/aws` provider shown above, omit the `source` argument and allow
   413    Terraform v0.13 to select the `hashicorp` namespace by default.
   414  
   415  * Provider type names must always be written in lowercase. Terraform v0.13
   416    treats provider source addresses as case-insensitive, but Terraform v0.12
   417    considers its legacy-style provider names to be case-sensitive. Using
   418    lowercase will ensure that the name is selectable by both Terraform major
   419    versions.
   420  
   421  This compatibility mechanism is provided as a temporary transitional aid only.
   422  When Terraform v0.12 detects a use of the new `source` argument it doesn't
   423  understand, it will emit a warning to alert the user that it is disregarding
   424  the source address given in that argument.