github.com/pdecat/terraform@v0.11.9-beta1/website/docs/modules/usage.html.markdown (about) 1 --- 2 layout: "docs" 3 page_title: "Using Modules" 4 sidebar_current: "docs-modules-usage" 5 description: Using modules in Terraform is very similar to defining resources. 6 --- 7 8 # Module Usage 9 10 Using child modules in Terraform is very similar to defining resources: 11 12 ```shell 13 module "consul" { 14 source = "hashicorp/consul/aws" 15 servers = 3 16 } 17 ``` 18 19 You can view the full documentation for configuring modules in the [Module Configuration](/docs/configuration/modules.html) section. 20 21 In modules we only specify a name, rather than a name and a type as for resources. 22 This name is used elsewhere in the configuration to reference the module and 23 its outputs. 24 25 The source tells Terraform what to create. In this example, we instantiate 26 the [Consul module for AWS](https://registry.terraform.io/modules/hashicorp/consul/aws) 27 from the [Terraform Registry](https://registry.terraform.io). Other source 28 types are supported, as described in the following section. 29 30 Just like a resource, a module's configuration can be deleted to destroy the 31 resources belonging to the module. 32 33 ## Source 34 35 The only required configuration key for a module is the `source` parameter. The 36 value of this tells Terraform where to download the module's source code. 37 Terraform comes with support for a variety of module sources. 38 39 We recommend using modules from the public [Terraform Registry](/docs/registry/index.html) 40 or from [Terraform Enterprise's private module registry](/docs/enterprise/registry/index.html). 41 These sources support version constraints for a more reliable experience, and 42 provide a searchable marketplace for finding the modules you need. 43 44 Registry modules are specified using a simple slash-separated path like the 45 `hashicorp/consul/aws` path used in the above example. The full source string 46 for each registry module can be found from the registry website. 47 48 Terraform also supports modules in local directories, identified by a relative 49 path starting with either `./` or `../`. Such local modules are useful to 50 organize code in more complex repositories, and are described in more detail 51 in [_Creating Modules_](/docs/modules/create.html). 52 53 Finally, Terraform can download modules directly from various storage providers 54 and version control systems. These sources do not support versioning and other 55 registry benefits, but can be convenient for getting started when already 56 available within an organization. The full list of available sources 57 are documented in [the module sources documentation](/docs/modules/sources.html). 58 59 When a configuration uses modules, they must first be installed by running 60 [`terraform init`](/docs/commands/init.html): 61 62 ```shell 63 $ terraform init 64 ``` 65 66 This command will download any modules that haven't been updated already, 67 as well as performing other Terraform working directory initialization such 68 as installing providers. 69 70 By default the command will not check for available updates to already-installed 71 modules, but you can use the `-upgrade` option to check for available upgrades. 72 When version constraints are specified (as described in the following section) 73 a newer version will be used only if it is within the given constraint. 74 75 ## Module Versions 76 77 We recommend explicitly constraining the acceptable version numbers for 78 each external module to avoid unexpected or unwanted changes. 79 80 Use the `version` attribute in the `module` block to specify versions: 81 82 ```shell 83 module "consul" { 84 source = "hashicorp/consul/aws" 85 version = "0.0.5" 86 87 servers = 3 88 } 89 ``` 90 91 The `version` attribute value may either be a single explicit version or 92 a version constraint expression. Constraint expressions use the following 93 syntax to specify a _range_ of versions that are acceptable: 94 95 * `>= 1.2.0`: version 1.2.0 or newer 96 * `<= 1.2.0`: version 1.2.0 or older 97 * `~> 1.2.0`: any non-beta version `>= 1.2.0` and `< 1.3.0`, e.g. `1.2.X` 98 * `~> 1.2`: any non-beta version `>= 1.2.0` and `< 2.0.0`, e.g. `1.X.Y` 99 * `>= 1.0.0, <= 2.0.0`: any version between 1.0.0 and 2.0.0 inclusive 100 101 When depending on third-party modules, references to specific versions are 102 recommended since this ensures that updates only happen when convenient to you. 103 104 For modules maintained within your organization, a version range strategy 105 may be appropriate if a semantic versioning methodology is used consistently 106 or if there is a well-defined release process that avoids unwanted updates. 107 108 Version constraints are supported only for modules installed from a module 109 registry, such as the [Terraform Registry](https://registry.terraform.io/) or 110 [Terraform Enterprise's private module registry](/docs/enterprise/registry/index.html). 111 Other module sources can provide their own versioning mechanisms within the 112 source string itself, or might not support versions at all. In particular, 113 modules sourced from local file paths do not support `version`; since 114 they're loaded from the same source repository, they always share the same 115 version as their caller. 116 117 ## Configuration 118 119 The arguments used in a `module` block, such as the `servers` parameter above, 120 correspond to [variables](/docs/configuration/variables.html) within the module 121 itself. You can therefore discover all the available variables for a module by 122 inspecting the source of it. 123 124 The special arguments `source`, `version` and `providers` are exceptions. These 125 are used for special purposes by Terraform and should therefore not be used 126 as variable names within a module. 127 128 ## Outputs 129 130 Modules encapsulate their resources. A resource in one module cannot directly depend on resources or attributes in other modules, unless those are exported through [outputs](/docs/configuration/outputs.html). These outputs can be referenced in other places in your configuration, for example: 131 132 ```hcl 133 resource "aws_instance" "client" { 134 ami = "ami-408c7f28" 135 instance_type = "t1.micro" 136 availability_zone = "${module.consul.server_availability_zone}" 137 } 138 ``` 139 140 This is deliberately very similar to accessing resource attributes. Instead of 141 referencing a resource attribute, however, the expression in this case 142 references an output of the module. 143 144 Just like with resources, interpolation expressions can create implicit 145 dependencies on resources and other modules. Since modules encapsulate 146 other resources, however, the dependency is not on the module as a whole 147 but rather on the `server_availability_zone` output specifically, which 148 allows Terraform to work on resources in different modules concurrently rather 149 than waiting for the entire module to be complete before proceeding. 150 151 ## Providers within Modules 152 153 In a configuration with multiple modules, there are some special considerations 154 for how resources are associated with provider configurations. 155 156 While in principle `provider` blocks can appear in any module, it is recommended 157 that they be placed only in the _root_ module of a configuration, since this 158 approach allows users to configure providers just once and re-use them across 159 all descendent modules. 160 161 Each resource in the configuration must be associated with one provider 162 configuration, which may either be within the same module as the resource 163 or be passed from the parent module. Providers can be passed down to descendent 164 modules in two ways: either _implicitly_ through inheritance, or _explicitly_ 165 via the `providers` argument within a `module` block. These two options are 166 discussed in more detail in the following sections. 167 168 In all cases it is recommended to keep explicit provider configurations only in 169 the root module and pass them (whether implicitly or explicitly) down to 170 descendent modules. This avoids the provider configurations from being "lost" 171 when descendent modules are removed from the configuration. It also allows 172 the user of a configuration to determine which providers require credentials 173 by inspecting only the root module. 174 175 Provider configurations are used for all operations on associated resources, 176 including destroying remote objects and refreshing state. Terraform retains, as 177 part of its state, a reference to the provider configuration that was most 178 recently used to apply changes to each resource. When a `resource` block is 179 removed from the configuration, this record in the state is used to locate the 180 appropriate configuration because the resource's `provider` argument (if any) 181 is no longer present in the configuration. 182 183 As a consequence, it is required that all resources created for a particular 184 provider configuration must be destroyed before that provider configuration is 185 removed, unless the related resources are re-configured to use a different 186 provider configuration first. 187 188 ### Implicit Provider Inheritance 189 190 For convenience in simple configurations, a child module automatically inherits 191 default (un-aliased) provider configurations from its parent. This means that 192 explicit `provider` blocks appear only in the root module, and downstream 193 modules can simply declare resources for that provider and have them 194 automatically associated with the root provider configurations. 195 196 For example, the root module might contain only a `provider` block and a 197 `module` block to instantiate a child module: 198 199 ```hcl 200 provider "aws" { 201 region = "us-west-1" 202 } 203 204 module "child" { 205 source = "./child" 206 } 207 ``` 208 209 The child module can then use any resource from this provider with no further 210 provider configuration required: 211 212 ```hcl 213 resource "aws_s3_bucket" "example" { 214 bucket = "provider-inherit-example" 215 } 216 ``` 217 218 This approach is recommended in the common case where only a single 219 configuration is needed for each provider across the entire configuration. 220 221 In more complex situations there may be [multiple provider instances](/docs/configuration/providers.html#multiple-provider-instances), 222 or a child module may need to use different provider settings than 223 its parent. For such situations, it's necessary to pass providers explicitly 224 as we will see in the next section. 225 226 ## Passing Providers Explicitly 227 228 When child modules each need a different configuration of a particular 229 provider, or where the child module requires a different provider configuration 230 than its parent, the `providers` argument within a `module` block can be 231 used to define explicitly which provider configs are made available to the 232 child module. For example: 233 234 ```hcl 235 # The default "aws" configuration is used for AWS resources in the root 236 # module where no explicit provider instance is selected. 237 provider "aws" { 238 region = "us-west-1" 239 } 240 241 # A non-default, or "aliased" configuration is also defined for a different 242 # region. 243 provider "aws" { 244 alias = "usw2" 245 region = "us-west-2" 246 } 247 248 # An example child module is instantiated with the _aliased_ configuration, 249 # so any AWS resources it defines will use the us-west-2 region. 250 module "example" { 251 source = "./example" 252 providers = { 253 aws = "aws.usw2" 254 } 255 } 256 ``` 257 258 The `providers` argument within a `module` block is similar to 259 the `provider` argument within a resource as described for 260 [multiple provider instances](/docs/configuration/providers.html#multiple-provider-instances), 261 but is a map rather than a single string because a module may contain resources 262 from many different providers. 263 264 Once the `providers` argument is used in a `module` block, it overrides all of 265 the default inheritance behavior, so it is necessary to enumerate mappings 266 for _all_ of the required providers. This is to avoid confusion and surprises 267 that may result when mixing both implicit and explicit provider passing. 268 269 Additional provider configurations (those with the `alias` argument set) are 270 _never_ inherited automatically by child modules, and so must always be passed 271 explicitly using the `providers` map. For example, a module 272 that configures connectivity between networks in two AWS regions is likely 273 to need both a source and a destination region. In that case, the root module 274 may look something like this: 275 276 ```hcl 277 provider "aws" { 278 alias = "usw1" 279 region = "us-west-1" 280 } 281 282 provider "aws" { 283 alias = "usw2" 284 region = "us-west-2" 285 } 286 287 module "tunnel" { 288 source = "./tunnel" 289 providers = { 290 aws.src = "aws.usw1" 291 aws.dst = "aws.usw2" 292 } 293 } 294 ``` 295 296 In the `providers` map, the keys are provider names as expected by the child 297 module, while the values are the names of corresponding configurations in 298 the _current_ module. The subdirectory `./tunnel` must then contain 299 _proxy configuration blocks_ like the following, to declare that it 300 requires configurations to be passed with these from the `providers` block in 301 the parent's `module` block: 302 303 ```hcl 304 provider "aws" { 305 alias = "src" 306 } 307 308 provider "aws" { 309 alias = "dst" 310 } 311 ``` 312 313 Each resource should then have its own `provider` attribute set to either 314 `"aws.src"` or `"aws.dst"` to choose which of the two provider instances to use. 315 316 At this time it is required to write an explicit proxy configuration block 317 even for default (un-aliased) provider configurations when they will be passed 318 via an explicit `providers` block: 319 320 ```hcl 321 provider "aws" { 322 } 323 ``` 324 325 If such a block is not present, the child module will behave as if it has no 326 configurations of this type at all, which may cause input prompts to supply 327 any required provider configuration arguments. This limitation will be 328 addressed in a future version of Terraform. 329 330 ## Multiple Instances of a Module 331 332 A particular module source can be instantiated multiple times: 333 334 ```hcl 335 # my_buckets.tf 336 337 module "assets_bucket" { 338 source = "./publish_bucket" 339 name = "assets" 340 } 341 342 module "media_bucket" { 343 source = "./publish_bucket" 344 name = "media" 345 } 346 ``` 347 348 ```hcl 349 # publish_bucket/bucket-and-cloudfront.tf 350 351 variable "name" {} # this is the input parameter of the module 352 353 resource "aws_s3_bucket" "example" { 354 # ... 355 } 356 357 resource "aws_iam_user" "deploy_user" { 358 # ... 359 } 360 ``` 361 362 This example defines a local child module in the `./publish_bucket` 363 subdirectory. That module has configuration to create an S3 bucket. The module 364 wraps the bucket and all the other implementation details required to configure 365 a bucket. 366 367 We can then instantiate the module multiple times in our configuration by 368 giving each instance a unique name -- here `module "assets_bucket"` and 369 `module "media_bucket"` -- whilst specifying the same `source` value. 370 371 Resources from child modules are prefixed with `module.<module-instance-name>` 372 when displayed in plan output and elsewhere in the UI. For example, the 373 `./publish_bucket` module contains `aws_s3_bucket.example`, and so the two 374 instances of this module produce S3 bucket resources with [_resource addresses_](/docs/internals/resource-addressing.html) 375 `module.assets_bucket.aws_s3_bucket.example` and `module.media_bucket.aws_s3_bucket.example` 376 respectively. These full addresses are used within the UI and on the command 377 line, but are not valid within interpolation expressions due to the 378 encapsulation behavior described above. 379 380 When refactoring an existing configuration to introduce modules, moving 381 resource blocks between modules causes Terraform to see the new location 382 as an entirely separate resource to the old. Always check the execution plan 383 after performing such actions to ensure that no resources are surprisingly 384 deleted. 385 386 Each instance of a module may optionally have different providers passed to it 387 using the `providers` argument described above. This can be useful in situations 388 where, for example, a duplicated set of resources must be created across 389 several regions or datacenters. 390 391 ## Summarizing Modules in the UI 392 393 By default, commands such as the [plan command](/docs/commands/plan.html) and 394 [graph command](/docs/commands/graph.html) will show each resource in a nested 395 module to represent the full scope of the configuration. For more complex 396 configurations, the `-module-depth` option may be useful to summarize some or all 397 of the modules as single objects. 398 399 For example, with a configuration similar to what we've built above, the default 400 graph output looks like the following: 401 402 ![Terraform Expanded Module Graph](docs/module_graph_expand.png) 403 404 If we instead set `-module-depth=0`, the graph will look like this: 405 406 ![Terraform Module Graph](docs/module_graph.png) 407 408 Other commands work similarly with modules. Note that `-module-depth` only 409 affects how modules are presented in the UI; it does not affect how modules 410 and their contained resources are processed by Terraform operations. 411 412 ## Tainting resources within a module 413 414 The [taint command](/docs/commands/taint.html) can be used to _taint_ specific 415 resources within a module: 416 417 ```shell 418 $ terraform taint -module=salt_master aws_instance.salt_master 419 ``` 420 421 It is not possible to taint an entire module. Instead, each resource within 422 the module must be tainted separately.