--- description: |- Terraform enables you to safely and predictably create, change, and improve production infrastructure. It is an open source tool that codifies APIs into declarative configuration files that can be shared amongst team members, treated as code, edited, reviewed, and versioned. ---
<%= inline_svg "logo-hashicorp.svg", height: 120, class: "logo" %>

Write, Plan, and Create Infrastructure as Code

Get Started Download <%= latest_version %>

Simple and Powerful

Terraform enables you to safely and predictably create, change, and improve production infrastructure. It is an open source tool that codifies APIs into declarative configuration files that can be shared amongst team members, treated as code, edited, reviewed, and versioned.


Write

Infrastructure as Code

Define infrastructure as code to increase operator productivity and transparency.

Collaborate & share

Terraform configuration can be stored in version control, shared, and collaborated on by teams of operators.

Evolve your infrastructure

Track the complete history of infrastructure versions.

Automation friendly

If it can be codified, it can be automated.

<%= inline_svg "feature-write-bg.svg", class: "feature-image" %>
Plan

One Safe Workflow Across Providers

Terraform provides an elegant user experience for operators to safely and predictably make changes to infrastructure.

<%= inline_svg "feature-plan-bg.svg", class: "feature-image" %>

Map Resource Dependencies

Understand how a minor change could have potential cascading effects across an infrastructure before executing that change. Terraform builds a dependency graph from the configurations, and walks this graph to generate plans, refresh state, and more.

Separation of Plan & Apply

Separating plans and applies reduces mistakes and uncertainty at scale. Plans show operators what would happen, applies execute changes.

One Safe Workflow

Use Terraform to create resources across all major infrastructure providers (AWS, GCP, Azure, OpenStack, VMware, and more).

Create

Reproducible Infrastructure

Terraform lets operators easily use the same configurations in multiple places to reduce mistakes and save time.

<%= inline_svg "feature-create-bg.svg", class: "feature-image" %>

Environment parity

Use the same Terraform configuration to provision identical staging, QA, and production environments.

Shareable modules

Common Terraform configurations can be packaged as modules and used across teams and organizations.

Combine multiple providers consistently

Terraform allows you to effortlessly combine high-level system providers. Launch a server from one cloud provider, add a DNS entry with its IP with a different provider. Built-in dependency resolution means things happen in the right order.

Latest News

<%#= image_tag 'news/webinar-Terraform-4-4-2017.png', alt: 'Webinar April 4, 2017, 10:00 AM PST' %>

Webinar: Multi-Cloud, One Command with Terraform

Watch our recent webinar with Mitchell Hashimoto to learn how Terraform provisions infrastructure across different clouds using a consistent workflow.

Watch Now

Terraform 0.9 Released

Terraform 0.9 adds major new functionality to Terraform. Read the highlights from the 0.9 release

Read more

Applying Graph Theory to Infrastructure As Code

Watch this talk from HashiConf 2016 where we explore the graph theory at the heart of Terraform's orchestration engine.

Watch Video

Examples

Composing Resources

Use attributes from other resources to create an infrastructure composed of resources across multiple providers.

resource "digitalocean_droplet" "web" { name = "tf-web" size = "512mb" image = "centos-5-8-x32" region = "sfo1" } resource "dnsimple_record" "hello" { domain = "example.com" name = "test" value = "${digitalocean_droplet.web.ipv4_address}" type = "A" }

Fast, Simplified Interaction

Simple and intuitive configuration makes even the most complicated services approachable: no more web consoles, loading bars, or confusing CLI clients.

resource "aws_elb" "frontend" { name = "frontend-load-balancer" listener { instance_port = 8000 instance_protocol = "http" lb_port = 80 lb_protocol = "http" } instances = ["${aws_instance.app.*.id}"] } resource "aws_instance" "app" { count = 5 ami = "ami-408c7f28" instance_type = "t1.micro" }

The intro contains a walkthrough guide, introductory literature, and a range of examples to experiment with Terraform.

Get started

<%= inline_svg "terraform-enterprise-logo.svg", width: 300 %>

Collaborative Infrastructure Automation for organizations. Collaborate on Terraform configurations, validate changes, and automate provisioning across providers.

Learn More