github.com/maheshbr/terraform@v0.3.1-0.20141020033300-deec7194a3ea/website/source/intro/getting-started/dependencies.html.md (about) 1 --- 2 layout: "intro" 3 page_title: "Resource Dependencies" 4 sidebar_current: "gettingstarted-deps" 5 --- 6 7 # Resource Dependencies 8 9 In this page, we're going to introduce resource dependencies, 10 where we'll not only see a configuration with multiple resources 11 for the first time, but also scenarios where resource parameters 12 use information from other resources. 13 14 Up to this point, our example has only contained a single resource. 15 Real infrastructure has a diverse set of resources and resource 16 types. Terraform configurations can contain multiple resources, 17 multiple resource types, and these types can even span multiple 18 providers. 19 20 On this page, we'll show a basic example of multiple resources 21 and how to reference the attributes of other resources to configure 22 subsequent resources. 23 24 ## Assigning an Elastic IP 25 26 We'll improve our configuration by assigning an elastic IP to 27 the EC2 instance we're managing. Modify your `example.tf` and 28 add the following: 29 30 ``` 31 resource "aws_eip" "ip" { 32 instance = "${aws_instance.example.id}" 33 } 34 ``` 35 36 This should look familiar from the earlier example of adding 37 an EC2 instance resource, except this time we're building 38 an "aws\_eip" resource type. This resource type allocates 39 and associates an 40 [elastic IP](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html) 41 to an EC2 instance. 42 43 The only parameter for 44 [aws\_eip](/docs/providers/aws/r/eip.html) is "instance" which 45 is the EC2 instance to assign the IP to. For this value, we 46 use an interpolation to use an attribute from the EC2 instance 47 we managed earlier. 48 49 The syntax for this interpolation should be straightforward: 50 it requests the "id" attribute from the "aws\_instance.example" 51 resource. 52 53 ## Plan and Execute 54 55 Run `terraform plan` to view the execution plan. The output 56 will look something like the following: 57 58 ``` 59 $ terraform plan 60 ... 61 62 + aws_eip.ip 63 instance: "" => "${aws_instance.example.id}" 64 private_ip: "" => "<computed>" 65 public_ip: "" => "<computed>" 66 67 + aws_instance.example 68 ami: "" => "ami-aa7ab6c2" 69 availability_zone: "" => "<computed>" 70 instance_type: "" => "t1.micro" 71 key_name: "" => "<computed>" 72 private_dns: "" => "<computed>" 73 private_ip: "" => "<computed>" 74 public_dns: "" => "<computed>" 75 public_ip: "" => "<computed>" 76 security_groups: "" => "<computed>" 77 subnet_id: "" => "<computed>" 78 ``` 79 80 Terraform will create two resources: the instance and the elastic 81 IP. In the "instance" value for the "aws\_eip", you can see the 82 raw interpolation is still present. This is because this variable 83 won't be known until the "aws\_instance" is created. It will be 84 replaced at apply-time. 85 86 Next, run `terraform apply`. The output will look similar to the 87 following: 88 89 ``` 90 aws_instance.example: Creating... 91 ami: "" => "ami-aa7ab6c2" 92 instance_type: "" => "t1.micro" 93 aws_eip.ip: Creating... 94 instance: "" => "i-0e737b25" 95 96 Apply complete! Resources: 2 added, 0 changed, 0 destroyed. 97 ``` 98 99 It is clearer to see from actually running Terraform, but 100 Terraform creates the EC2 instance before the elastic IP 101 address. Due to the interpolation earlier where the elastic 102 IP requires the ID of the EC2 instance, Terraform is able 103 to infer a dependency, and knows to create the instance 104 first. 105 106 ## Implicit and Explicit Dependencies 107 108 Most dependencies in Terraform are implicit: Terraform is able 109 to infer dependencies based on usage of attributes of other 110 resources. 111 112 Using this information, Terraform builds a graph of resources. 113 This tells Terraform not only what order to create resources, 114 but also what resources can be created in parallel. In our example, 115 since the IP address depended on the EC2 instance, they could 116 not be created in parallel. 117 118 Implicit dependencies work well and are usually all you ever need. 119 However, you can also specify explicit dependencies with the 120 `depends_on` parameter which is available on any resource. For example, 121 we could modify the "aws\_eip" resource to the following, which 122 effectively does the same thing and is redundant: 123 124 ``` 125 resource "aws_eip" "ip" { 126 instance = "${aws_instance.example.id}" 127 depends_on = ["aws_instance.example"] 128 } 129 ``` 130 131 If you're ever unsure about the dependency chain that Terraform 132 is creating, you can use the [`terraform graph` command](/docs/commands/graph.html) to view 133 the graph. This command outputs a dot-formatted graph which can be 134 viewed with 135 [Graphviz](http://www.graphviz.org/). 136 137 ## Non-Dependent Resources 138 139 We can now augment the configuration with another EC2 instance. 140 Because this doesn't rely on any other resource, it can be 141 created in parallel to everything else. 142 143 ``` 144 resource "aws_instance" "another" { 145 ami = "ami-aa7ab6c2" 146 instance_type = "t1.micro" 147 } 148 ``` 149 150 You can view the graph with `terraform graph` to see that 151 nothing depends on this and that it will likely be created 152 in parallel. 153 154 Before moving on, remove this resource from your configuration 155 and `terraform apply` again to destroy it. We won't use the 156 second instance anymore in the getting started guide. 157 158 ## Next 159 160 In this page you were introduced to both multiple resources 161 as well as basic resource dependencies and resource attribute 162 interpolation. 163 164 Moving on, [we'll use provisioners](/intro/getting-started/provision.html) 165 to do some basic bootstrapping of our launched instance.