137 lines
3.8 KiB
Plaintext
137 lines
3.8 KiB
Plaintext
---
|
|
page_title: 'Internals: Resource Address'
|
|
description: |-
|
|
A resource address is a string that identifies zero or more resource
|
|
instances in your overall configuration.
|
|
---
|
|
|
|
# Resource Addressing
|
|
|
|
A _resource address_ is a string that identifies zero or more resource
|
|
instances in your overall configuration.
|
|
|
|
An address is made up of two parts:
|
|
|
|
```
|
|
[module path][resource spec]
|
|
```
|
|
|
|
In some contexts Terraform might allow for an incomplete resource address that
|
|
only refers to a module as a whole, or that omits the index for a
|
|
multi-instance resource. In those cases, the meaning depends on the context,
|
|
so you'll need to refer to the documentation for the specific feature you
|
|
are using which parses resource addresses.
|
|
|
|
## Module path
|
|
|
|
A module path addresses a module within the tree of modules. It takes the form:
|
|
|
|
```
|
|
module.module_name[module index]
|
|
```
|
|
|
|
- `module` - Module keyword indicating a child module (non-root). Multiple `module`
|
|
keywords in a path indicate nesting.
|
|
- `module_name` - User-defined name of the module.
|
|
- `[module index]` - (Optional) [Index](#index-values-for-modules-and-resources)
|
|
to select an instance from a module call that has multiple instances,
|
|
surrounded by square bracket characters (`[` and `]`).
|
|
|
|
An address without a resource spec, i.e. `module.foo` applies to every resource within
|
|
the module if a single module, or all instances of a module if a module has multiple instances.
|
|
To address all resources of a particular module instance, include the module index in the address,
|
|
such as `module.foo[0]`.
|
|
|
|
If the module path is omitted, the address applies to the root module.
|
|
|
|
An example of the `module` keyword delineating between two modules that have multiple instances:
|
|
|
|
```
|
|
module.foo[0].module.bar["a"]
|
|
```
|
|
|
|
-> Module index only applies to modules in Terraform v0.13 or later. In earlier
|
|
versions of Terraform, a module could not have multiple instances.
|
|
|
|
## Resource spec
|
|
|
|
A resource spec addresses a specific resource instance in the selected module.
|
|
It has the following syntax:
|
|
|
|
```
|
|
resource_type.resource_name[instance index]
|
|
```
|
|
|
|
- `resource_type` - Type of the resource being addressed.
|
|
- `resource_name` - User-defined name of the resource.
|
|
- `[instance index]` - (Optional) [Index](#index-values-for-modules-and-resources)
|
|
to select an instance from a resource that has multiple instances,
|
|
surrounded by square bracket characters (`[` and `]`).
|
|
|
|
-> In Terraform v0.12 and later, a resource spec without a module path prefix
|
|
matches only resources in the root module. In earlier versions, a resource spec
|
|
without a module path prefix would match resources with the same type and name
|
|
in any descendent module.
|
|
|
|
## Index values for Modules and Resources
|
|
|
|
The following specifications apply to index values on modules and resources with multiple instances:
|
|
|
|
- `[N]` where `N` is a `0`-based numerical index into a resource with multiple
|
|
instances specified by the `count` meta-argument. Omitting an index when
|
|
addressing a resource where `count > 1` means that the address references
|
|
all instances.
|
|
- `["INDEX"]` where `INDEX` is a alphanumerical key index into a resource with
|
|
multiple instances specified by the `for_each` meta-argument.
|
|
|
|
## Examples
|
|
|
|
### count Example
|
|
|
|
Given a Terraform config that includes:
|
|
|
|
```hcl
|
|
resource "aws_instance" "web" {
|
|
# ...
|
|
count = 4
|
|
}
|
|
```
|
|
|
|
An address like this:
|
|
|
|
```
|
|
aws_instance.web[3]
|
|
```
|
|
|
|
Refers to only the last instance in the config, and an address like this:
|
|
|
|
```
|
|
aws_instance.web
|
|
```
|
|
|
|
Refers to all four "web" instances.
|
|
|
|
### for_each Example
|
|
|
|
Given a Terraform config that includes:
|
|
|
|
```hcl
|
|
resource "aws_instance" "web" {
|
|
# ...
|
|
for_each = {
|
|
"terraform": "value1",
|
|
"resource": "value2",
|
|
"indexing": "value3",
|
|
"example": "value4",
|
|
}
|
|
}
|
|
```
|
|
|
|
An address like this:
|
|
|
|
```
|
|
aws_instance.web["example"]
|
|
```
|
|
|
|
Refers to only the "example" instance in the config.
|