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).