github.com/mapuri/terraform@v0.7.6-0.20161012203214-7e0408293f97/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  There are **meta-parameters** available to all resources:
    45  
    46    * `count` (int) - The number of identical resources to create.
    47        This doesn't apply to all resources. For details on using variables in
    48        conjunction with count, see [Using Variables with
    49       `count`](#using-variables-with-count) below.
    50  
    51    * `depends_on` (list of strings) - Explicit dependencies that this
    52        resource has. These dependencies will be created before this
    53        resource. The dependencies are in the format of `TYPE.NAME`,
    54        for example `aws_instance.web`.
    55  
    56    * `lifecycle` (configuration block) - Customizes the lifecycle
    57        behavior of the resource. The specific options are documented
    58        below.
    59  
    60  The `lifecycle` block allows the following keys to be set:
    61  
    62    * `create_before_destroy` (bool) - This flag is used to ensure
    63        the replacement of a resource is created before the original
    64        instance is destroyed. As an example, this can be used to
    65        create an new DNS record before removing an old record.
    66  
    67    * `prevent_destroy` (bool) - This flag provides extra protection against the
    68        destruction of a given resource. When this is set to `true`, any plan
    69        that includes a destroy of this resource will return an error message.
    70  
    71  <a id="ignore-changes"></a>
    72  
    73    * `ignore_changes` (list of strings) - Customizes how diffs are evaluated for
    74        resources, allowing individual attributes to be ignored through changes.
    75        As an example, this can be used to ignore dynamic changes to the
    76        resource from external resources. Other meta-parameters cannot be ignored.
    77  
    78  ~> **NOTE on create\_before\_destroy and dependencies:** Resources that utilize
    79  the `create_before_destroy` key can only depend on other resources that also
    80  include `create_before_destroy`. Referencing a resource that does not include
    81  `create_before_destroy` will result in a dependency graph cycle. 
    82  
    83  ~> **NOTE on ignore\_changes:** Ignored attribute names can be matched by their
    84  name, not state ID. For example, if an `aws_route_table` has two routes defined
    85  and the `ignore_changes` list contains "route", both routes will be ignored.
    86  Additionally you can also use a single entry with a wildcard (e.g. `"*"`)
    87  which will match all attribute names. Using a partial string together with a
    88  wildcard (e.g. `"rout*"`) is **not** supported.
    89  
    90  
    91  -------------
    92  
    93  Within a resource, you can optionally have a **connection block**.
    94  Connection blocks describe to Terraform how to connect to the
    95  resource for
    96  [provisioning](/docs/provisioners/index.html). This block doesn't
    97  need to be present if you're using only local provisioners, or
    98  if you're not provisioning at all.
    99  
   100  Resources provide some data on their own, such as an IP address,
   101  but other data must be specified by the user.
   102  
   103  The full list of settings that can be specified are listed on
   104  the [provisioner connection page](/docs/provisioners/connection.html).
   105  
   106  -------------
   107  
   108  Within a resource, you can specify zero or more **provisioner
   109  blocks**. Provisioner blocks configure
   110  [provisioners](/docs/provisioners/index.html).
   111  
   112  Within the provisioner block is provisioner-specific configuration,
   113  much like resource-specific configuration.
   114  
   115  Provisioner blocks can also contain a connection block
   116  (documented above). This connection block can be used to
   117  provide more specific connection info for a specific provisioner.
   118  An example use case might be to use a different user to log in
   119  for a single provisioner.
   120  
   121  <a id="using-variables-with-count"></a>
   122  
   123  ## Using Variables With `count`
   124  
   125  When declaring multiple instances of a resource using [`count`](#count), it is
   126  common to want each instance to have a different value for a given attribute.
   127  
   128  You can use the `${count.index}`
   129  [interpolation](/docs/configuration/interpolation.html) along with a map
   130  [variable](/docs/configuration/variables.html) to accomplish this.
   131  
   132  For example, here's how you could create three [AWS Instances](/docs/providers/aws/r/instance.html) each with their own static IP
   133  address:
   134  
   135  ```
   136  variable "instance_ips" {
   137    default = {
   138      "0" = "10.11.12.100"
   139      "1" = "10.11.12.101"
   140      "2" = "10.11.12.102"
   141    }
   142  }
   143  
   144  resource "aws_instance" "app" {
   145    count = "3"
   146    private_ip = "${lookup(var.instance_ips, count.index)}"
   147    # ...
   148  }
   149  ```
   150  
   151  ## Multiple Provider Instances
   152  
   153  By default, a resource targets the provider based on its type. For example
   154  an `aws_instance` resource will target the "aws" provider. As of Terraform
   155  0.5.0, a resource can target any provider by name.
   156  
   157  The primary use case for this is to target a specific configuration of
   158  a provider that is configured multiple times to support multiple regions, etc.
   159  
   160  To target another provider, set the `provider` field:
   161  
   162  ```
   163  resource "aws_instance" "foo" {
   164  	provider = "aws.west"
   165  
   166  	# ...
   167  }
   168  ```
   169  
   170  The value of the field should be `TYPE` or `TYPE.ALIAS`. The `ALIAS` value
   171  comes from the `alias` field value when configuring the
   172  [provider](/docs/configuration/providers.html).
   173  
   174  If no `provider` field is specified, the default (provider with no alias)
   175  provider is used.
   176  
   177  ## Syntax
   178  
   179  The full syntax is:
   180  
   181  ```
   182  resource TYPE NAME {
   183  	CONFIG ...
   184  	[count = COUNT]
   185  	[depends_on = [RESOURCE NAME, ...]]
   186  	[provider = PROVIDER]
   187  
   188      [LIFECYCLE]
   189  
   190  	[CONNECTION]
   191  	[PROVISIONER ...]
   192  }
   193  ```
   194  
   195  where `CONFIG` is:
   196  
   197  ```
   198  KEY = VALUE
   199  
   200  KEY {
   201  	CONFIG
   202  }
   203  ```
   204  
   205  where `LIFECYCLE` is:
   206  
   207  ```
   208  lifecycle {
   209      [create_before_destroy = true|false]
   210      [prevent_destroy = true|false]
   211      [ignore_changes = [ATTRIBUTE NAME, ...]]
   212  }
   213  ```
   214  
   215  where `CONNECTION` is:
   216  
   217  ```
   218  connection {
   219  	KEY = VALUE
   220  	...
   221  }
   222  ```
   223  
   224  where `PROVISIONER` is:
   225  
   226  ```
   227  provisioner NAME {
   228  	CONFIG ...
   229  
   230  	[CONNECTION]
   231  }
   232  ```