github.com/nbering/terraform@v0.8.5-0.20170113232247-453f670684b5/website/source/docs/configuration/resources.html.md (about)

     1  ---
     2  layout: "docs"
     3  page_title: "Configuring Resources"
     4  sidebar_current: "docs-config-resources"
     5  description: |-
     6    The most important thing you'll configure with Terraform are resources. Resources are a component of your infrastructure. It might be some low level component such as a physical server, virtual machine, or container. Or it can be a higher level component such as an email provider, DNS record, or database provider.
     7  ---
     8  
     9  # Resource Configuration
    10  
    11  The most important thing you'll configure with Terraform are
    12  resources. Resources are a component of your infrastructure.
    13  It might be some low level component such as a physical server,
    14  virtual machine, or container. Or it can be a higher level
    15  component such as an email provider, DNS record, or database
    16  provider.
    17  
    18  This page assumes you're familiar with the
    19  [configuration syntax](/docs/configuration/syntax.html)
    20  already.
    21  
    22  ## Example
    23  
    24  A resource configuration looks like the following:
    25  
    26  ```
    27  resource "aws_instance" "web" {
    28      ami = "ami-408c7f28"
    29      instance_type = "t1.micro"
    30  }
    31  ```
    32  
    33  ## Description
    34  
    35  The `resource` block creates a resource of the given `TYPE` (first
    36  parameter) and `NAME` (second parameter). The combination of the type
    37  and name must be unique.
    38  
    39  Within the block (the `{ }`) is configuration for the resource. The
    40  configuration is dependent on the type, and is documented for each
    41  resource type in the
    42  [providers section](/docs/providers/index.html).
    43  
    44  <a id="meta-parameters"></a>
    45  ### Meta-parameters
    46  
    47  There are **meta-parameters** available to all resources:
    48  
    49    * `count` (int) - The number of identical resources to create.
    50        This doesn't apply to all resources. For details on using variables in
    51        conjunction with count, see [Using Variables with
    52       `count`](#using-variables-with-count) below.
    53  
    54  ~> **NOTE:** Modules don't currently support the `count` parameter.
    55  
    56    * `depends_on` (list of strings) - Explicit dependencies that this
    57        resource has. These dependencies will be created before this
    58        resource. For syntax and other details, see the section below on
    59        [explicit dependencies](#explicit-dependencies).
    60  
    61    * `provider` (string) - The name of a specific provider to use for
    62        this resource. The name is in the format of `TYPE.ALIAS`, for example,
    63        `aws.west`. Where `west` is set using the `alias` attribute in a
    64        provider. See [multiple provider instances](#multi-provider-instances).
    65  
    66    * `lifecycle` (configuration block) - Customizes the lifecycle
    67        behavior of the resource. The specific options are documented
    68        below.
    69  
    70  The `lifecycle` block allows the following keys to be set:
    71  
    72    * `create_before_destroy` (bool) - This flag is used to ensure
    73        the replacement of a resource is created before the original
    74        instance is destroyed. As an example, this can be used to
    75        create an new DNS record before removing an old record.
    76  
    77    * `prevent_destroy` (bool) - This flag provides extra protection against the
    78        destruction of a given resource. When this is set to `true`, any plan
    79        that includes a destroy of this resource will return an error message.
    80  
    81  <a id="ignore-changes"></a>
    82  
    83    * `ignore_changes` (list of strings) - Customizes how diffs are evaluated for
    84        resources, allowing individual attributes to be ignored through changes.
    85        As an example, this can be used to ignore dynamic changes to the
    86        resource from external resources. Other meta-parameters cannot be ignored.
    87  
    88  ~> **NOTE on create\_before\_destroy and dependencies:** Resources that utilize
    89  the `create_before_destroy` key can only depend on other resources that also
    90  include `create_before_destroy`. Referencing a resource that does not include
    91  `create_before_destroy` will result in a dependency graph cycle.
    92  
    93  ~> **NOTE on ignore\_changes:** Ignored attribute names can be matched by their
    94  name, not state ID. For example, if an `aws_route_table` has two routes defined
    95  and the `ignore_changes` list contains "route", both routes will be ignored.
    96  Additionally you can also use a single entry with a wildcard (e.g. `"*"`)
    97  which will match all attribute names. Using a partial string together with a
    98  wildcard (e.g. `"rout*"`) is **not** supported.
    99  
   100  <a id="explicit-dependencies"></a>
   101  
   102  ### Explicit Dependencies
   103  
   104  Terraform ensures that dependencies are successfully created before a
   105  resource is created. During a destroy operation, Terraform ensures that
   106  this resource is destroyed before its dependencies.
   107  
   108  A resource automatically depends on anything it references via
   109  [interpolations](/docs/configuration/interpolation.html). The automatically
   110  determined dependencies are all that is needed most of the time. You can also
   111  use the `depends_on` parameter to explicitly define a list of additional
   112  dependencies.
   113  
   114  The primary use case of explicit `depends_on` is to depend on a _side effect_
   115  of another operation. For example: if a provisioner creates a file, and your
   116  resource reads that file, then there is no interpolation reference for Terraform
   117  to automatically connect the two resources. However, there is a causal
   118  ordering that needs to be represented. This is an ideal case for `depends_on`.
   119  In most cases, however, `depends_on` should be avoided and Terraform should
   120  be allowed to determine dependencies automatically.
   121  
   122  The syntax of `depends_on` is a list of resources and modules:
   123  
   124    * Resources are `TYPE.NAME`, such as `aws_instance.web`.
   125    * Modules are `module.NAME`, such as `module.foo`.
   126  
   127  When a resource depends on a module, _everything_ in that module must be
   128  created before the resource is created.
   129  
   130  An example of a resource depending on both a module and resource is shown
   131  below. Note that `depends_on` can contain any number of dependencies:
   132  
   133  ```
   134  resource "aws_instance" "web" {
   135    depends_on = ["aws_instance.leader", "module.vpc"]
   136  }
   137  ```
   138  
   139  -> **Use sparingly!** `depends_on` is rarely necessary.
   140  In almost every case, Terraform's automatic dependency system is the best-case
   141  scenario by having your resources depend only on what they explicitly use.
   142  Please think carefully before you use `depends_on` to determine if Terraform
   143  could automatically do this a better way.
   144  
   145  <a id="connection-block"></a>
   146  
   147  ### Connection block
   148  
   149  Within a resource, you can optionally have a **connection block**.
   150  Connection blocks describe to Terraform how to connect to the
   151  resource for
   152  [provisioning](/docs/provisioners/index.html). This block doesn't
   153  need to be present if you're using only local provisioners, or
   154  if you're not provisioning at all.
   155  
   156  Resources provide some data on their own, such as an IP address,
   157  but other data must be specified by the user.
   158  
   159  The full list of settings that can be specified are listed on
   160  the [provisioner connection page](/docs/provisioners/connection.html).
   161  
   162  <a id="provisioners"></a>
   163  
   164  ### Provisioners
   165  
   166  Within a resource, you can specify zero or more **provisioner
   167  blocks**. Provisioner blocks configure
   168  [provisioners](/docs/provisioners/index.html).
   169  
   170  Within the provisioner block is provisioner-specific configuration,
   171  much like resource-specific configuration.
   172  
   173  Provisioner blocks can also contain a connection block
   174  (documented above). This connection block can be used to
   175  provide more specific connection info for a specific provisioner.
   176  An example use case might be to use a different user to log in
   177  for a single provisioner.
   178  
   179  <a id="using-variables-with-count"></a>
   180  
   181  ## Using Variables With `count`
   182  
   183  When declaring multiple instances of a resource using [`count`](#count), it is
   184  common to want each instance to have a different value for a given attribute.
   185  
   186  You can use the `${count.index}`
   187  [interpolation](/docs/configuration/interpolation.html) along with a map
   188  [variable](/docs/configuration/variables.html) to accomplish this.
   189  
   190  For example, here's how you could create three [AWS
   191  Instances](/docs/providers/aws/r/instance.html) each with their own
   192  static IP address:
   193  
   194  ```
   195  variable "instance_ips" {
   196    default = {
   197      "0" = "10.11.12.100"
   198      "1" = "10.11.12.101"
   199      "2" = "10.11.12.102"
   200    }
   201  }
   202  
   203  resource "aws_instance" "app" {
   204    count = "3"
   205    private_ip = "${lookup(var.instance_ips, count.index)}"
   206    # ...
   207  }
   208  ```
   209  
   210  <a id="multi-provider-instances"></a>
   211  
   212  ## Multiple Provider Instances
   213  
   214  By default, a resource targets the provider based on its type. For example
   215  an `aws_instance` resource will target the "aws" provider. As of Terraform
   216  0.5.0, a resource can target any provider by name.
   217  
   218  The primary use case for this is to target a specific configuration of
   219  a provider that is configured multiple times to support multiple regions, etc.
   220  
   221  To target another provider, set the `provider` field:
   222  
   223  ```
   224  resource "aws_instance" "foo" {
   225  	provider = "aws.west"
   226  
   227  	# ...
   228  }
   229  ```
   230  
   231  The value of the field should be `TYPE` or `TYPE.ALIAS`. The `ALIAS` value
   232  comes from the `alias` field value when configuring the
   233  [provider](/docs/configuration/providers.html).
   234  
   235  ```
   236  provider "aws" {
   237    alias = "west"
   238  
   239    # ...
   240  }
   241  ```
   242  
   243  If no `provider` field is specified, the default provider is used.
   244  
   245  ## Syntax
   246  
   247  The full syntax is:
   248  
   249  ```
   250  resource TYPE NAME {
   251  	CONFIG ...
   252  	[count = COUNT]
   253  	[depends_on = [NAME, ...]]
   254  	[provider = PROVIDER]
   255  
   256      [LIFECYCLE]
   257  
   258  	[CONNECTION]
   259  	[PROVISIONER ...]
   260  }
   261  ```
   262  
   263  where `CONFIG` is:
   264  
   265  ```
   266  KEY = VALUE
   267  
   268  KEY {
   269  	CONFIG
   270  }
   271  ```
   272  
   273  where `LIFECYCLE` is:
   274  
   275  ```
   276  lifecycle {
   277      [create_before_destroy = true|false]
   278      [prevent_destroy = true|false]
   279      [ignore_changes = [ATTRIBUTE NAME, ...]]
   280  }
   281  ```
   282  
   283  where `CONNECTION` is:
   284  
   285  ```
   286  connection {
   287  	KEY = VALUE
   288  	...
   289  }
   290  ```
   291  
   292  where `PROVISIONER` is:
   293  
   294  ```
   295  provisioner NAME {
   296  	CONFIG ...
   297  
   298  	[CONNECTION]
   299  }
   300  ```