github.com/ns1/terraform@v0.7.10-0.20161109153551-8949419bef40/website/source/intro/getting-started/build.html.md (about) 1 --- 2 layout: "intro" 3 page_title: "Build Infrastructure" 4 sidebar_current: "gettingstarted-build" 5 description: |- 6 With Terraform installed, let's dive right into it and start creating some infrastructure. 7 --- 8 9 # Build Infrastructure 10 11 With Terraform installed, let's dive right into it and start creating 12 some infrastructure. 13 14 We'll build infrastructure on 15 [AWS](https://aws.amazon.com) for the getting started guide 16 since it is popular and generally understood, but Terraform 17 can [manage many providers](/docs/providers/index.html), 18 including multiple providers in a single configuration. 19 Some examples of this are in the 20 [use cases section](/intro/use-cases.html). 21 22 If you don't have an AWS account, 23 [create one now](https://aws.amazon.com/free/). 24 For the getting started guide, we'll only be using resources 25 which qualify under the AWS 26 [free-tier](https://aws.amazon.com/free/), 27 meaning it will be free. 28 If you already have an AWS account, you may be charged some 29 amount of money, but it shouldn't be more than a few dollars 30 at most. 31 32 ~> **Warning!** If you're not using an account that qualifies under the AWS 33 [free-tier](https://aws.amazon.com/free/), you may be charged to run these 34 examples. The most you should be charged should only be a few dollars, but 35 we're not responsible for any charges that may incur. 36 37 ## Configuration 38 39 The set of files used to describe infrastructure in Terraform is simply 40 known as a Terraform _configuration_. We're going to write our first 41 configuration now to launch a single AWS EC2 instance. 42 43 The format of the configuration files is 44 [documented here](/docs/configuration/index.html). 45 Configuration files can 46 [also be JSON](/docs/configuration/syntax.html), but we recommend only using JSON when the 47 configuration is generated by a machine. 48 49 The entire configuration is shown below. We'll go over each part 50 after. Save the contents to a file named `example.tf`. Verify that 51 there are no other `*.tf` files in your directory, since Terraform 52 loads all of them. 53 54 ``` 55 provider "aws" { 56 access_key = "ACCESS_KEY_HERE" 57 secret_key = "SECRET_KEY_HERE" 58 region = "us-east-1" 59 } 60 61 resource "aws_instance" "example" { 62 ami = "ami-0d729a60" 63 instance_type = "t2.micro" 64 } 65 ``` 66 67 ~> **Note**: The above configuration is designed to work on most EC2 accounts, 68 with access to a default VPC. For EC2 Classic users, please use `t1.micro` for 69 `instance_type`, and `ami-408c7f28` for the `ami`. 70 71 Replace the `ACCESS_KEY_HERE` and `SECRET_KEY_HERE` with your 72 AWS access key and secret key, available from 73 [this page](https://console.aws.amazon.com/iam/home?#security_credential). 74 We're hardcoding them for now, but will extract these into 75 variables later in the getting started guide. 76 77 This is a complete configuration that Terraform is ready to apply. 78 The general structure should be intuitive and straightforward. 79 80 The `provider` block is used to configure the named provider, in 81 our case "aws." A provider is responsible for creating and 82 managing resources. Multiple provider blocks can exist if a 83 Terraform configuration is composed of multiple providers, 84 which is a common situation. 85 86 The `resource` block defines a resource that exists within 87 the infrastructure. A resource might be a physical component such 88 as an EC2 instance, or it can be a logical resource such as 89 a Heroku application. 90 91 The resource block has two strings before opening the block: 92 the resource type and the resource name. In our example, the 93 resource type is "aws\_instance" and the name is "example." 94 The prefix of the type maps to the provider. In our case 95 "aws\_instance" automatically tells Terraform that it is 96 managed by the "aws" provider. 97 98 Within the resource block itself is configuration for that 99 resource. This is dependent on each resource provider and 100 is fully documented within our 101 [providers reference](/docs/providers/index.html). For our EC2 instance, we specify 102 an AMI for Ubuntu, and request a "t2.micro" instance so we 103 qualify under the free tier. 104 105 ## Execution Plan 106 107 Next, let's see what Terraform would do if we asked it to 108 apply this configuration. In the same directory as the 109 `example.tf` file you created, run `terraform plan`. You 110 should see output similar to what is copied below. We've 111 truncated some of the output to save space. 112 113 ``` 114 $ terraform plan 115 ... 116 117 + aws_instance.example 118 ami: "ami-0d729a60" 119 availability_zone: "<computed>" 120 ebs_block_device.#: "<computed>" 121 ephemeral_block_device.#: "<computed>" 122 instance_state: "<computed>" 123 instance_type: "t2.micro" 124 key_name: "<computed>" 125 placement_group: "<computed>" 126 private_dns: "<computed>" 127 private_ip: "<computed>" 128 public_dns: "<computed>" 129 public_ip: "<computed>" 130 root_block_device.#: "<computed>" 131 security_groups.#: "<computed>" 132 source_dest_check: "true" 133 subnet_id: "<computed>" 134 tenancy: "<computed>" 135 vpc_security_group_ids.#: "<computed>" 136 ``` 137 138 `terraform plan` shows what changes Terraform will apply to 139 your infrastructure given the current state of your infrastructure 140 as well as the current contents of your configuration. 141 142 If `terraform plan` failed with an error, read the error message 143 and fix the error that occurred. At this stage, it is probably a 144 syntax error in the configuration. 145 146 The output format is similar to the diff format generated by tools 147 such as Git. The output has a "+" next to "aws\_instance.example", 148 meaning that Terraform will create this resource. Beneath that, 149 it shows the attributes that will be set. When the value displayed 150 is `<computed>`, it means that the value won't be known 151 until the resource is created. 152 153 ## Apply 154 155 The plan looks good, our configuration appears valid, so it's time to 156 create real resources. Run `terraform apply` in the same directory 157 as your `example.tf`, and watch it go! It will take a few minutes 158 since Terraform waits for the EC2 instance to become available. 159 160 ``` 161 $ terraform apply 162 aws_instance.example: Creating... 163 ami: "" => "ami-0d729a60" 164 instance_type: "" => "t2.micro" 165 [...] 166 167 aws_instance.example: Still creating... (10s elapsed) 168 aws_instance.example: Creation complete 169 170 Apply complete! Resources: 1 added, 0 changed, 0 destroyed. 171 172 ... 173 ``` 174 175 Done! You can go to the AWS console to prove to yourself that the 176 EC2 instance has been created. 177 178 Terraform also puts some state into the `terraform.tfstate` file 179 by default. This state file is extremely important; it maps various 180 resource metadata to actual resource IDs so that Terraform knows 181 what it is managing. This file must be saved and distributed 182 to anyone who might run Terraform. We recommend simply putting it 183 into version control, since it generally isn't too large. 184 185 You can inspect the state using `terraform show`: 186 187 ``` 188 $ terraform show 189 aws_instance.example: 190 id = i-32cf65a8 191 ami = ami-0d729a60 192 availability_zone = us-east-1a 193 instance_state = running 194 instance_type = t2.micro 195 private_ip = 172.31.30.244 196 public_dns = ec2-52-90-212-55.compute-1.amazonaws.com 197 public_ip = 52.90.212.55 198 subnet_id = subnet-1497024d 199 vpc_security_group_ids.# = 1 200 vpc_security_group_ids.3348721628 = sg-67652003 201 ``` 202 203 You can see that by creating our resource, we've also gathered 204 a lot more metadata about it. This metadata can actually be referenced 205 for other resources or outputs, which will be covered later in 206 the getting started guide. 207 208 ## Provisioning 209 210 The EC2 instance we launched at this point is based on the AMI 211 given, but has no additional software installed. If you're running 212 an image-based infrastructure (perhaps creating images with 213 [Packer](https://www.packer.io)), then this is all you need. 214 215 However, many infrastructures still require some sort of initialization 216 or software provisioning step. Terraform supports 217 provisioners, 218 which we'll cover a little bit later in the getting started guide, 219 in order to do this. 220 221 ## Next 222 223 Congratulations! You've built your first infrastructure with Terraform. 224 You've seen the configuration syntax, an example of a basic execution 225 plan, and understand the state file. 226 227 Next, we're going to move on to [changing and destroying infrastructure](/intro/getting-started/change.html).