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