{{< partial "learn_x_header" >}}

Terraform is an alternative to cloud-specific resource management tools. CloudFormation and Azure's Resource Manager template maintenance are boons for automation.

I work with Amazon Web Services, so I tried the AWS Cloud Development Kit (CDK). The CDK sounds like a great idea on paper, but the documentation is abysmal. While sifting through GitHub repositories is fun, it is not a fun full-time job. Most of my time spent using the CDK required digging for examples rather than writing code.

It was time to start looking for alternatives. In the past, I had evaluated Terraform. I decided to avoid it when it was less mature. I'm not a fan of learning new syntax if learning that language doesn't increase my productivity.

One of the strengths of the tool is the [support for several providers]. In addition, learning [the Terraform language] syntax is now worth the time, given its broad applications.

Terraform language uses a [declarative approach]. This approach provides a current state view of deployed resources in the code. This is in opposition to tools like [Ansible] and [Chef] that use a [procedural approach].

So far, my experience with Terraform has been impressive. First, I was able to get an EC2 instance spun up with a small amount of markup.

```hcl
locals {
  key_name = "YourKeyName" // Update to the name of your key pair
  security_groups = ["default"] // Update to your security group
}

provider "aws" {
  profile    = "default"
  region     = "us-east-1"
}

resource "aws_instance" "docker_container_runner" {
  // Get the latest Amazon Linux ami id
  // aws ec2 describe-images --region us-east-1 --owners amazon --filters 'Name=name,Values=amzn-ami-hvm-????.??.?.????????-x86_64-gp2' 'Name=state,Values=available' --query 'reverse(sort_by(Images, &CreationDate))[:1].ImageId' --output text
  ami             = "ami-123"
  instance_type   = "t2.micro"
  key_name        = local.key_name
  security_groups = local.security_groups
  user_data       = file("user_data.sh")
}
```

Place this script in a user_data.sh file in the same directory as your template.

```sh
#!/bin/bash -ex
sudo yum install -y docker vim
sudo chkconfig docker on
sudo service docker start
sudo usermod -aG docker ec2-user
```

This template will provide an EC2 instance with Docker at the ready. It's quite concise and should need minimal work to maintain in the future. I will be continuing my Terraform learning; at this point, it's a sound time investment.

## Learning Terraform - Beyond the Basics

- [Terraform: Up and Running: Writing Infrastructure as Code]
- [Terraform - Getting Started]
- [Learning Terraform]




[support for several providers]: https://www.terraform.io/docs/providers/index.html
[the terraform language]: https://www.terraform.io/docs/configuration/index.html
[declarative approach]: https://en.wikipedia.org/wiki/Declarative_programming
[ansible]: https://www.ansible.com/
[chef]: https://www.chef.io/
[procedural approach]: https://en.wikipedia.org/wiki/Procedural_programming
[terraform: up and running: writing infrastructure as code]: https://amzn.to/2OSpwH0
[terraform - getting started]: https://www.pluralsight.com/courses/terraform-getting-started
[learning terraform]: https://www.linkedin.com/learning/learning-terraform/installing-terraform?u=2130809