github.com/cycloidio/terraform@v1.1.10-0.20220513142504-76d5c768dc63/website/docs/language/modules/sources.mdx (about) 1 --- 2 page_title: Module Sources 3 description: >- 4 The source argument tells Terraform where to find child modules's 5 configurations in locations like GitHub, the Terraform Registry, Bitbucket, 6 Git, Mercurial, S3, and GCS. 7 --- 8 9 # Module Sources 10 11 The `source` argument in [a `module` block](/language/modules/syntax) 12 tells Terraform where to find the source code for the desired child module. 13 14 Terraform uses this during the module installation step of `terraform init` 15 to download the source code to a directory on local disk so that it can be 16 used by other Terraform commands. 17 18 > **Hands-on:** Try our HashiCorp Learn tutorials to use modules from [the 19 > registry](https://learn.hashicorp.com/tutorials/terraform/module-use) 20 > or [locally](https://learn.hashicorp.com/tutorials/terraform/module-create). 21 22 The module installer supports installation from a number of different source 23 types, as listed below. 24 25 - [Local paths](#local-paths) 26 27 - [Terraform Registry](#terraform-registry) 28 29 - [GitHub](#github) 30 31 - [Bitbucket](#bitbucket) 32 33 - Generic [Git](#generic-git-repository), [Mercurial](#generic-mercurial-repository) repositories 34 35 - [HTTP URLs](#http-urls) 36 37 - [S3 buckets](#s3-bucket) 38 39 - [GCS buckets](#gcs-bucket) 40 41 - [Modules in Package Sub-directories](#modules-in-package-sub-directories) 42 43 Each of these is described in the following sections. Module source addresses 44 use a _URL-like_ syntax, but with extensions to support unambiguous selection 45 of sources and additional features. 46 47 We recommend using local file paths for closely-related modules used primarily 48 for the purpose of factoring out repeated code elements, and using a native 49 Terraform module registry for modules intended to be shared by multiple calling 50 configurations. We support other sources so that you can potentially distribute 51 Terraform modules internally with existing infrastructure. 52 53 Many of the source types will make use of "ambient" credentials available 54 when Terraform is run, such as from environment variables or credentials files 55 in your home directory. This is covered in more detail in each of the following 56 sections. 57 58 We recommend placing each module that is intended to be re-usable in the root 59 of its own repository or archive file, but it is also possible to 60 [reference modules from subdirectories](#modules-in-package-sub-directories). 61 62 ## Local Paths 63 64 Local path references allow for factoring out portions of a configuration 65 within a single source repository. 66 67 ```hcl 68 module "consul" { 69 source = "./consul" 70 } 71 ``` 72 73 A local path must begin with either `./` or `../` to indicate that a local 74 path is intended, to distinguish from 75 [a module registry address](#terraform-registry). 76 77 Local paths are special in that they are not "installed" in the same sense 78 that other sources are: the files are already present on local disk (possibly 79 as a result of installing a parent module) and so can just be used directly. 80 Their source code is automatically updated if the parent module is upgraded. 81 82 Note that Terraform does not consider an _absolute_ filesystem path (starting 83 with a slash, a drive letter, or similar) to be a local path. Instead, 84 Terraform will treat that in a similar way as a remote module and copy it into 85 the local module cache. An absolute path is a "package" in the sense described 86 in [Modules in Package Sub-directories](#modules-in-package-sub-directories). 87 We don't recommend using absolute filesystem paths to refer to Terraform 88 modules, because it will tend to couple your configuration to the filesystem 89 layout of a particular computer. 90 91 ## Terraform Registry 92 93 A module registry is the native way of distributing Terraform modules for use 94 across multiple configurations, using a Terraform-specific protocol that 95 has full support for module versioning. 96 97 [Terraform Registry](https://registry.terraform.io/) is an index of modules 98 shared publicly using this protocol. This public registry is the easiest way 99 to get started with Terraform and find modules created by others in the 100 community. 101 102 You can also use a 103 [private registry](/registry/private), either 104 via the built-in feature from Terraform Cloud, or by running a custom 105 service that implements 106 [the module registry protocol](/registry/api-docs). 107 108 Modules on the public Terraform Registry can be referenced using a registry 109 source address of the form `<NAMESPACE>/<NAME>/<PROVIDER>`, with each 110 module's information page on the registry site including the exact address 111 to use. 112 113 ```hcl 114 module "consul" { 115 source = "hashicorp/consul/aws" 116 version = "0.1.0" 117 } 118 ``` 119 120 The above example will use the 121 [Consul module for AWS](https://registry.terraform.io/modules/hashicorp/consul/aws) 122 from the public registry. 123 124 For modules hosted in other registries, prefix the source address with an 125 additional `<HOSTNAME>/` portion, giving the hostname of the private registry: 126 127 ```hcl 128 module "consul" { 129 source = "app.terraform.io/example-corp/k8s-cluster/azurerm" 130 version = "1.1.0" 131 } 132 ``` 133 134 If you are using the SaaS version of Terraform Cloud, its private 135 registry hostname is `app.terraform.io`. If you use a self-hosted Terraform 136 Enterprise instance, its private registry hostname is the same as the host 137 where you'd access the web UI and the host you'd use when configuring 138 the [Terraform Cloud CLI integration](/cli/cloud). 139 140 Registry modules support versioning. You can provide a specific version as shown 141 in the above examples, or use flexible 142 [version constraints](/language/modules/syntax#version). 143 144 You can learn more about the registry at the 145 [Terraform Registry documentation](/registry/modules/use#using-modules). 146 147 To access modules from a private registry, you may need to configure an access 148 token [in the CLI config](/cli/config/config-file#credentials). Use the 149 same hostname as used in the module source string. For a private registry 150 within Terraform Cloud, use the same authentication token as you would 151 use with the Enterprise API or command-line clients. 152 153 ## GitHub 154 155 Terraform will recognize unprefixed `github.com` URLs and interpret them 156 automatically as Git repository sources. 157 158 ```hcl 159 module "consul" { 160 source = "github.com/hashicorp/example" 161 } 162 ``` 163 164 The above address scheme will clone over HTTPS. To clone over SSH, use the 165 following form: 166 167 ```hcl 168 module "consul" { 169 source = "git@github.com:hashicorp/example.git" 170 } 171 ``` 172 173 These GitHub schemes are treated as convenient aliases for 174 [the general Git repository address scheme](#generic-git-repository), and so 175 they obtain credentials in the same way and support the `ref` argument for 176 selecting a specific revision. You will need to configure credentials in 177 particular to access private repositories. 178 179 ## Bitbucket 180 181 Terraform will recognize unprefixed `bitbucket.org` URLs and interpret them 182 automatically as BitBucket repositories: 183 184 ```hcl 185 module "consul" { 186 source = "bitbucket.org/hashicorp/terraform-consul-aws" 187 } 188 ``` 189 190 This shorthand works only for public repositories, because Terraform must 191 access the BitBucket API to learn if the given repository uses Git or Mercurial. 192 193 Terraform treats the result either as [a Git source](#generic-git-repository) 194 or [a Mercurial source](#generic-mercurial-repository) depending on the 195 repository type. See the sections on each version control type for information 196 on how to configure credentials for private repositories and how to specify 197 a specific revision to install. 198 199 ## Generic Git Repository 200 201 Arbitrary Git repositories can be used by prefixing the address with the 202 special `git::` prefix. After this prefix, any valid 203 [Git URL](https://git-scm.com/docs/git-clone#_git_urls) 204 can be specified to select one of the protocols supported by Git. 205 206 For example, to use HTTPS or SSH: 207 208 ```hcl 209 module "vpc" { 210 source = "git::https://example.com/vpc.git" 211 } 212 213 module "storage" { 214 source = "git::ssh://username@example.com/storage.git" 215 } 216 ``` 217 218 Terraform installs modules from Git repositories by running `git clone`, and 219 so it will respect any local Git configuration set on your system, including 220 credentials. To access a non-public Git repository, configure Git with 221 suitable credentials for that repository. 222 223 If you use the SSH protocol then any configured SSH keys will be used 224 automatically. This is the most common way to access non-public Git 225 repositories from automated systems because it allows access to private 226 repositories without interactive prompts. 227 228 If using the HTTP/HTTPS protocol, or any other protocol that uses 229 username/password credentials, configure 230 [Git Credentials Storage](https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage) 231 to select a suitable source of credentials for your environment. 232 233 If your Terraform configuration will be used within [Terraform Cloud](https://www.hashicorp.com/products/terraform), 234 only SSH key authentication is supported, and 235 [keys can be configured on a per-workspace basis](/cloud-docs/workspaces/settings/ssh-keys). 236 237 ### Selecting a Revision 238 239 By default, Terraform will clone and use the default branch (referenced by 240 `HEAD`) in the selected repository. You can override this using the 241 `ref` argument. The value of the `ref` argument can be any reference that would be accepted 242 by the `git checkout` command, such as branch, SHA-1 hash (short or full), or tag names. The [Git documentation](https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#_single_revisions) contains a complete list. 243 244 ```hcl 245 # referencing a specific release 246 module "vpc" { 247 source = "git::https://example.com/vpc.git?ref=v1.2.0" 248 } 249 250 # referencing a specific commit SHA-1 hash 251 module "storage" { 252 source = "git::https://example.com/storage.git?ref=51d462976d84fdea54b47d80dcabbf680badcdb8" 253 } 254 ``` 255 256 ### "scp-like" address syntax 257 258 When using Git over SSH, we recommend using the `ssh://`-prefixed URL form 259 for consistency with all of the other URL-like git address forms. 260 You may opt to use the alternative "scp-like" syntax instead, in which case you 261 must omit the `ssh://` scheme part and include only the `git::` part. 262 For example: 263 264 ```hcl 265 module "storage" { 266 source = "git::username@example.com:storage.git" 267 } 268 ``` 269 270 If you use the `ssh://` URL scheme then Terraform will assume that the colon 271 marks the beginning of a port number, rather than the beginning of the path. 272 This matches how Git itself interprets these different forms, aside from 273 the Terraform-specific `git::` selector prefix. 274 275 ## Generic Mercurial Repository 276 277 You can use arbitrary Mercurial repositories by prefixing the address with the 278 special `hg::` prefix. After this prefix, any valid 279 [Mercurial URL](https://www.mercurial-scm.org/repo/hg/help/urls) 280 can be specified to select one of the protocols supported by Mercurial. 281 282 ```hcl 283 module "vpc" { 284 source = "hg::http://example.com/vpc.hg" 285 } 286 ``` 287 288 Terraform installs modules from Mercurial repositories by running `hg clone`, and 289 so it will respect any local Mercurial configuration set on your system, 290 including credentials. To access a non-public repository, configure Mercurial 291 with suitable credentials for that repository. 292 293 If you use the SSH protocol then any configured SSH keys will be used 294 automatically. This is the most common way to access non-public Mercurial 295 repositories from automated systems because it allows access to private 296 repositories without interactive prompts. 297 298 If your Terraform configuration will be used within [Terraform Cloud](https://www.hashicorp.com/products/terraform), 299 only SSH key authentication is supported, and 300 [keys can be configured on a per-workspace basis](/cloud-docs/workspaces/settings/ssh-keys). 301 302 ### Selecting a Revision 303 304 You can select a non-default branch or tag using the optional `ref` argument: 305 306 ```hcl 307 module "vpc" { 308 source = "hg::http://example.com/vpc.hg?ref=v1.2.0" 309 } 310 ``` 311 312 ## HTTP URLs 313 314 When you use an HTTP or HTTPS URL, Terraform will make a `GET` request to 315 the given URL, which can return _another_ source address. This indirection 316 allows using HTTP URLs as a sort of "vanity redirect" over a more complicated 317 module source address. 318 319 Terraform will append an additional query string argument `terraform-get=1` to 320 the given URL before sending the `GET` request, allowing the server to 321 optionally return a different result when Terraform is requesting it. 322 323 If the response is successful (`200`-range status code), Terraform looks in 324 the following locations in order for the next address to access: 325 326 - The value of a response header field named `X-Terraform-Get`. 327 328 - If the response is an HTML page, a `meta` element with the name `terraform-get`: 329 330 ```html 331 <meta name="terraform-get" content="github.com/hashicorp/example" /> 332 ``` 333 334 In either case, the result is interpreted as another module source address 335 using one of the forms documented elsewhere on this page. 336 337 If an HTTP/HTTPS URL requires authentication credentials, use a `.netrc` 338 file in your home directory to configure these. For information on this format, 339 see [the documentation for using it in `curl`](https://everything.curl.dev/usingcurl/netrc). 340 341 ### Fetching archives over HTTP 342 343 As a special case, if Terraform detects that the URL has a common file 344 extension associated with an archive file format then it will bypass the 345 special `terraform-get=1` redirection described above and instead just use 346 the contents of the referenced archive as the module source code: 347 348 ```hcl 349 module "vpc" { 350 source = "https://example.com/vpc-module.zip" 351 } 352 ``` 353 354 The extensions that Terraform recognizes for this special behavior are: 355 356 - `zip` 357 - `tar.bz2` and `tbz2` 358 - `tar.gz` and `tgz` 359 - `tar.xz` and `txz` 360 361 If your URL _doesn't_ have one of these extensions but refers to an archive 362 anyway, use the `archive` argument to force this interpretation: 363 364 ```hcl 365 module "vpc" { 366 source = "https://example.com/vpc-module?archive=zip" 367 } 368 ``` 369 370 -> **Note:** If the content of the archive file is a directory, you will need to 371 include that directory in the module source. Read the section on 372 [Modules in Package Sub-directories](#modules-in-package-sub-directories) for more 373 information. 374 375 ## S3 Bucket 376 377 You can use archives stored in S3 as module sources using the special `s3::` 378 prefix, followed by 379 [an S3 bucket object URL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html). 380 381 ```hcl 382 module "consul" { 383 source = "s3::https://s3-eu-west-1.amazonaws.com/examplecorp-terraform-modules/vpc.zip" 384 } 385 ``` 386 387 -> **Note:** Buckets in AWS's us-east-1 region must use the hostname `s3.amazonaws.com` (instead of `s3-us-east-1.amazonaws.com`). 388 389 The `s3::` prefix causes Terraform to use AWS-style authentication when 390 accessing the given URL. As a result, this scheme may also work for other 391 services that mimic the S3 API, as long as they handle authentication in the 392 same way as AWS. 393 394 The resulting object must be an archive with one of the same file 395 extensions as for [archives over standard HTTP](#fetching-archives-over-http). 396 Terraform will extract the archive to obtain the module source tree. 397 398 The module installer looks for AWS credentials in the following locations, 399 preferring those earlier in the list when multiple are available: 400 401 - The `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` environment variables. 402 - The default profile in the `.aws/credentials` file in your home directory. 403 - If running on an EC2 instance, temporary credentials associated with the 404 instance's IAM Instance Profile. 405 406 ## GCS Bucket 407 408 You can use archives stored in Google Cloud Storage as module sources using the special `gcs::` 409 prefix, followed by 410 [a GCS bucket object URL](https://cloud.google.com/storage/docs/request-endpoints#typical). 411 412 For example 413 414 - `gcs::https://www.googleapis.com/storage/v1/BUCKET_NAME/PATH_TO_MODULE` 415 - `gcs::https://www.googleapis.com/storage/v1/BUCKET_NAME/PATH/TO/module.zip` 416 417 ```hcl 418 module "consul" { 419 source = "gcs::https://www.googleapis.com/storage/v1/modules/foomodule.zip" 420 } 421 ``` 422 423 The module installer uses Google Cloud SDK to authenticate with GCS. To set credentials you can: 424 425 - Enter the path of your service account key file in the GOOGLE_APPLICATION_CREDENTIALS environment variable, or; 426 - If you're running Terraform from a GCE instance, default credentials are automatically available. See [Creating and Enabling Service Accounts](https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances) for Instances for more details 427 - On your computer, you can make your Google identity available by running `gcloud auth application-default login`. 428 429 ## Modules in Package Sub-directories 430 431 When the source of a module is a version control repository or archive file 432 (generically, a "package"), the module itself may be in a sub-directory relative 433 to the root of the package. 434 435 A special double-slash syntax is interpreted by Terraform to indicate that 436 the remaining path after that point is a sub-directory within the package. 437 For example: 438 439 - `hashicorp/consul/aws//modules/consul-cluster` 440 - `git::https://example.com/network.git//modules/vpc` 441 - `https://example.com/network-module.zip//modules/vpc` 442 - `s3::https://s3-eu-west-1.amazonaws.com/examplecorp-terraform-modules/network.zip//modules/vpc` 443 444 If the source address has arguments, such as the `ref` argument supported for 445 the version control sources, the sub-directory portion must be _before_ those 446 arguments: 447 448 - `git::https://example.com/network.git//modules/vpc?ref=v1.2.0` 449 450 Terraform will still extract the entire package to local disk, but will read 451 the module from the subdirectory. As a result, it is safe for a module in 452 a sub-directory of a package to use [a local path](#local-paths) to another 453 module as long as it is in the _same_ package.