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