github.com/jzbruno/terraform@v0.10.3-0.20180104230435-18975d727047/website/docs/modules/sources.html.markdown (about) 1 --- 2 layout: "docs" 3 page_title: "Module Sources" 4 sidebar_current: "docs-modules-sources" 5 description: Explains the use of the source parameter, which tells Terraform where modules can be found. 6 --- 7 8 # Module Sources 9 10 As documented in the [Usage section](/docs/modules/usage.html), the only required parameter when using a module is `source`. 11 12 The `source` parameter tells Terraform where the module can be found. 13 Terraform manages modules for you: it downloads them, organizes them on disk, checks for updates, etc. Terraform uses this `source` parameter to determine where it should retrieve and update modules from. 14 15 Terraform supports the following sources: 16 17 * Local file paths 18 19 * [Terraform Registry](/docs/registry/index.html) 20 21 * GitHub 22 23 * Bitbucket 24 25 * Generic Git, Mercurial repositories 26 27 * HTTP URLs 28 29 * S3 buckets 30 31 Each is documented further below. 32 33 ## Local File Paths 34 35 The easiest source is the local file path. For maximum portability, this should be a relative file path into a subdirectory. This allows you to organize your Terraform configuration into modules within one repository, for example: 36 37 ```hcl 38 module "consul" { 39 source = "./consul" 40 } 41 ``` 42 43 Updates for file paths are automatic: when "downloading" the module using the [get command](/docs/commands/get.html), Terraform will create a symbolic link to the original directory. Therefore, any changes are automatically available. 44 45 ## Terraform Registry 46 47 The [Terraform Registry](https://registry.terraform.io) is an index of modules 48 written by the Terraform community. 49 The Terraform Registry is the easiest 50 way to get started with Terraform and to find modules to start with. 51 The registry is integrated directly into Terraform: 52 53 ```hcl 54 module "consul" { 55 source = "hashicorp/consul/aws" 56 } 57 ``` 58 59 The above example would use the 60 [Consul module for AWS](https://registry.terraform.io/modules/hashicorp/consul/aws) 61 from the public registry. 62 63 You can learn more about the registry at the 64 [Terraform Registry documentation section](/docs/registry/index.html). 65 66 ## GitHub 67 68 Terraform will automatically recognize GitHub URLs and turn them into a link to the specific Git repository. The syntax is simple: 69 70 ```hcl 71 module "consul" { 72 source = "github.com/hashicorp/example" 73 } 74 ``` 75 76 Subdirectories within the repository can also be referenced: 77 78 ```hcl 79 module "consul" { 80 source = "github.com/hashicorp/example//subdir" 81 } 82 ``` 83 84 These will fetch the modules using HTTPS. If you want to use SSH instead: 85 86 ```hcl 87 module "consul" { 88 source = "git@github.com:hashicorp/example.git//subdir" 89 } 90 ``` 91 92 **Note:** The double-slash, `//`, is important. It is what tells Terraform that that is the separator for a subdirectory, and not part of the repository itself. 93 94 GitHub source URLs require that Git is installed on your system and that you have access to the repository. 95 96 You can use the same parameters to GitHub repositories as you can generic Git repositories (such as tags or branches). See the documentation for generic Git repositories for more information. 97 98 ### Private GitHub Repos 99 100 If you need Terraform to fetch modules from private GitHub repos, you must provide Terraform with credentials to authenticate as a user with read access to those repos. 101 102 - If you run Terraform only on your local machine, you can specify the module source as an SSH URI (like `git@github.com:hashicorp/example.git`) and Terraform will use your default SSH key to authenticate. 103 - If you use Terraform Enterprise, you can use SSH URIs. You'll need to add an SSH private key to your organization and assign it to any workspace that fetches modules from private repos. [See the Terraform Enterprise docs about SSH keys for cloning modules.](/docs/enterprise/workspaces/ssh-keys.html) 104 - If you need to run Terraform on a remote machine like a CI worker, you either need to write an SSH key to disk and set the `GIT_SSH_COMMAND` environment variable appropriately during the worker's provisioning process, or create a [GitHub machine user](https://developer.github.com/guides/managing-deploy-keys/#machine-users) with read access to the repos in question and embed its credentials into the modules' `source` parameters: 105 106 ```hcl 107 module "private-infra" { 108 source = "git::https://MACHINE-USER:MACHINE-PASS@github.com/org/privatemodules//modules/foo" 109 } 110 ``` 111 112 Note that Terraform does not support interpolations in the `source` parameter of a module, so you must hardcode the machine username and password if using this method. 113 114 ## Bitbucket 115 116 Terraform will automatically recognize public Bitbucket URLs and turn them into a link to the specific Git or Mercurial repository, for example: 117 118 ```hcl 119 module "consul" { 120 source = "bitbucket.org/hashicorp/consul" 121 } 122 ``` 123 124 Subdirectories within the repository can also be referenced: 125 126 ```hcl 127 module "consul" { 128 source = "bitbucket.org/hashicorp/consul//subdir" 129 } 130 ``` 131 132 **Note:** The double-slash, `//`, is important. It is what tells Terraform that this is the separator for a subdirectory, and not part of the repository itself. 133 134 Bitbucket URLs will require that Git or Mercurial is installed on your system, depending on the type of repository. 135 136 ## Private Bitbucket Repos 137 Private bitbucket repositories must be specified similar to the Generic Git Respository section below. 138 139 ```hcl 140 module "consul" { 141 source = "git::https://bitbucket.org/foocompany/module_name.git" 142 } 143 ``` 144 145 You can also specify branches and version withs the ?ref query 146 147 ```hcl 148 module "consul" { 149 source = "git::https://bitbucket.org/foocompany/module_name.git?ref=hotfix" 150 } 151 ``` 152 153 You will need to run a `terraform get -update=true` if you want to pull the latest versions. This can be handy when you are rapidly iterating on a module in development. 154 155 ## Generic Git Repository 156 157 Generic Git repositories are also supported. The value of `source` in this case should be a complete Git-compatible URL. Using generic Git repositories requires that Git is installed on your system. 158 159 ```hcl 160 module "consul" { 161 source = "git://hashicorp.com/consul.git" 162 } 163 ``` 164 165 You can also use protocols such as HTTP or SSH to reference a module, but you'll have specify to Terraform that it is a Git module, by prefixing the URL with `git::` like so: 166 167 ```hcl 168 module "consul" { 169 source = "git::https://hashicorp.com/consul.git" 170 } 171 172 module "ami" { 173 source = "git::ssh://git@github.com/owner/repo.git" 174 } 175 ``` 176 177 If you do not specify the type of `source` then Terraform will attempt to use the closest match, for example assuming `https://hashicorp.com/consul.git` is a HTTP URL. 178 179 The URLs for Git repositories support the following query parameters: 180 181 * `ref` - The ref to checkout. This can be a branch, tag, commit, etc. 182 183 ```hcl 184 module "consul" { 185 source = "git::https://hashicorp.com/consul.git?ref=master" 186 } 187 ``` 188 189 Terraform will cache the module locally by default `terraform get` is run, so successive updates to master or a specified branch will not be factored into future plans. Run `terraform get -update=true` to get the latest version of the branch. This is handy in development, but potentially bothersome in production if you don't have control of the repository. 190 191 ## Generic Mercurial Repository 192 193 Generic Mercurial repositories are supported. The value of `source` in this case should be a complete Mercurial-compatible URL. Using generic Mercurial repositories requires that Mercurial is installed on your system. You must tell Terraform that your `source` is a Mercurial repository by prefixing it with `hg::`. 194 195 ```hcl 196 module "consul" { 197 source = "hg::http://hashicorp.com/consul.hg" 198 } 199 ``` 200 201 URLs for Mercurial repositories support the following query parameters: 202 203 * `rev` - The rev to checkout. This can be a branch, tag, commit, etc. 204 205 ```hcl 206 module "consul" { 207 source = "hg::http://hashicorp.com/consul.hg?rev=default" 208 } 209 ``` 210 211 ## HTTP URLs 212 213 An HTTP or HTTPS URL can be used to redirect Terraform to get the module source from one of the other sources. For HTTP URLs, Terraform will make a `GET` request to the given URL. An additional `GET` parameter, `terraform-get=1`, will be appended, allowing 214 you to optionally render the page differently when Terraform is requesting it. 215 216 Terraform then looks for the resulting module URL in the following order: 217 218 1. Terraform will look to see if the header `X-Terraform-Get` is present. The header should contain the source URL of the actual module. 219 220 2. Terraform will look for a `<meta>` tag with the name of `terraform-get`, for example: 221 222 ```html 223 <meta name="terraform-get" content="github.com/hashicorp/example" /> 224 ``` 225 226 ### S3 Bucket 227 228 Terraform can also store modules in an S3 bucket. To access the bucket 229 you must have appropriate AWS credentials in your configuration or 230 available via shared credentials or environment variables. 231 232 There are a variety of S3 bucket addressing schemes, most are 233 [documented in the S3 234 configuration](http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro). 235 Here are a couple of examples. 236 237 Using the `s3` protocol. 238 239 ```hcl 240 module "consul" { 241 source = "s3::https://s3-eu-west-1.amazonaws.com/consulbucket/consul.zip" 242 } 243 ``` 244 245 Or directly using the bucket's URL. 246 247 ```hcl 248 module "consul" { 249 source = "consulbucket.s3-eu-west-1.amazonaws.com/consul.zip" 250 } 251 ``` 252 253 254 ## Unarchiving 255 256 Terraform will automatically unarchive files based on the extension of 257 the file being requested (over any protocol). It supports the following 258 archive formats: 259 260 * tar.gz and tgz 261 * tar.bz2 and tbz2 262 * zip 263 * gz 264 * bz2