{{< 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