github.com/jmbataller/terraform@v0.6.8-0.20151125192640-b7a12e3a580c/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](http://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](http://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](http://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](http://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-408c7f28"
    63  	instance_type = "t1.micro"
    64  }
    65  ```
    66  
    67  Replace the `ACCESS_KEY_HERE` and `SECRET_KEY_HERE` with your
    68  AWS access key and secret key, available from
    69  [this page](https://console.aws.amazon.com/iam/home?#security_credential).
    70  We're hardcoding them for now, but will extract these into
    71  variables later in the getting started guide.
    72  
    73  This is a complete configuration that Terraform is ready to apply.
    74  The general structure should be intuitive and straightforward.
    75  
    76  The `provider` block is used to configure the named provider, in
    77  our case "aws." A provider is responsible for creating and
    78  managing resources. Multiple provider blocks can exist if a
    79  Terraform configuration is comprised of multiple providers,
    80  which is a common situation.
    81  
    82  The `resource` block defines a resource that exists within
    83  the infrastructure. A resource might be a physical component such
    84  as an EC2 instance, or it can be a logical resource such as
    85  a Heroku application.
    86  
    87  The resource block has two strings before opening the block:
    88  the resource type and the resource name. In our example, the
    89  resource type is "aws\_instance" and the name is "example."
    90  The prefix of the type maps to the provider. In our case
    91  "aws\_instance" automatically tells Terraform that it is
    92  managed by the "aws" provider.
    93  
    94  Within the resource block itself is configuration for that
    95  resource. This is dependent on each resource provider and
    96  is fully documented within our
    97  [providers reference](/docs/providers/index.html). For our EC2 instance, we specify
    98  an AMI for Ubuntu, and request a "t1.micro" instance so we
    99  qualify under the free tier.
   100  
   101  ## Execution Plan
   102  
   103  Next, let's see what Terraform would do if we asked it to
   104  apply this configuration. In the same directory as the
   105  `example.tf` file you created, run `terraform plan`. You
   106  should see output similar to what is copied below. We've
   107  truncated some of the output to save space.
   108  
   109  ```
   110  $ terraform plan
   111  ...
   112  
   113  + aws_instance.example
   114      ami:               "" => "ami-408c7f28"
   115      availability_zone: "" => "<computed>"
   116      instance_type:     "" => "t1.micro"
   117      key_name:          "" => "<computed>"
   118      private_dns:       "" => "<computed>"
   119      private_ip:        "" => "<computed>"
   120      public_dns:        "" => "<computed>"
   121      public_ip:         "" => "<computed>"
   122      security_groups:   "" => "<computed>"
   123      subnet_id:         "" => "<computed>"
   124  ```
   125  
   126  `terraform plan` shows what changes Terraform will apply to
   127  your infrastructure given the current state of your infrastructure
   128  as well as the current contents of your configuration.
   129  
   130  If `terraform plan` failed with an error, read the error message
   131  and fix the error that occurred. At this stage, it is probably a
   132  syntax error in the configuration.
   133  
   134  The output format is similar to the diff format generated by tools
   135  such as Git. The output has a "+" next to "aws\_instance.example",
   136  meaning that Terraform will create this resource. Beneath that,
   137  it shows the attributes that will be set. When the value it is
   138  going to is `<computed>`, it means that the value won't be known
   139  until the resource is created.
   140  
   141  ## Apply
   142  
   143  The plan looks good, our configuration appears valid, so it's time to
   144  create real resources. Run `terraform apply` in the same directory
   145  as your `example.tf`, and watch it go! It will take a few minutes
   146  since Terraform waits for the EC2 instance to become available.
   147  
   148  ```
   149  $ terraform apply
   150  aws_instance.example: Creating...
   151    ami:           "" => "ami-408c7f28"
   152    instance_type: "" => "t1.micro"
   153  
   154  Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
   155  
   156  ...
   157  ```
   158  
   159  Done! You can go to the AWS console to prove to yourself that the
   160  EC2 instance has been created.
   161  
   162  Terraform also put some state into the `terraform.tfstate` file
   163  by default. This state file is extremely important; it maps various
   164  resource metadata to actual resource IDs so that Terraform knows
   165  what it is managing. This file must be saved and distributed
   166  to anyone who might run Terraform. We recommend simply putting it
   167  into version control, since it generally isn't too large.
   168  
   169  You can inspect the state using `terraform show`:
   170  
   171  ```
   172  $ terraform show
   173  aws_instance.example:
   174    id = i-e60900cd
   175    ami = ami-408c7f28
   176    availability_zone = us-east-1c
   177    instance_type = t1.micro
   178    key_name =
   179    private_dns = domU-12-31-39-12-38-AB.compute-1.internal
   180    private_ip = 10.200.59.89
   181    public_dns = ec2-54-81-21-192.compute-1.amazonaws.com
   182    public_ip = 54.81.21.192
   183    security_groups.# = 1
   184    security_groups.0 = default
   185    subnet_id =
   186  ```
   187  
   188  You can see that by creating our resource, we've also gathered
   189  a lot more metadata about it. This metadata can actually be referenced
   190  for other resources or outputs, which will be covered later in
   191  the getting started guide.
   192  
   193  ## Provisioning
   194  
   195  The EC2 instance we launched at this point is based on the AMI
   196  given, but has no additional software installed. If you're running
   197  an image-based infrastructure (perhaps creating images with
   198  [Packer](https://www.packer.io)), then this is all you need.
   199  
   200  However, many infrastructures still require some sort of initialization
   201  or software provisioning step. Terraform supports
   202  provisioners,
   203  which we'll cover a little bit later in the getting started guide,
   204  in order to do this.
   205  
   206  ## Next
   207  
   208  Congratulations! You've built your first infrastructure with Terraform.
   209  You've seen the configuration syntax, an example of a basic execution
   210  plan, and understand the state file.
   211  
   212  Next, we're going to move on to [changing and destroying infrastructure](/intro/getting-started/change.html).