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.