I wrote an example of how to use Terraform with Chef (specifically chef-solo) to provision an environment in AWS EC2. While Terraform does include a built-in Chef provisioner, it requires running the Chef Server. This example instead ships cookbooks to the nodes with the Terraform file provisioning functionality, and uses a simple bash script to install and run chef-solo.
To run the example, you will need an AWS account with API credentials (Access Key ID and Secret Access Key).
git clone git@github.com:mjuuso/provisioning_example.git
cd provisioning_example
./run.sh <aws_access_key> <aws_secret_key>
The script will make sure you have all the prerequisites for running the example (terraform, curl, ssh and ssh-keygen installed), generate SSH keys, run terraform and then verify that the load balancer works as expected.
This will create you the following resources in AWS:
- two application instances (t2.micro) running a sample Golang application server
- a load balancer instance (t2.micro) with nginx proxying requests to the application nodes in round-robin fashion
- an SSH key pair (generated by the wrapper script)
- two Security Groups -- one for the load balancer, one for the application nodes
- a Virtual Private Cloud (VPC)
- two subnets within the VPC, on availability zones eu-west-1a, eu-west-1b
- an Internet gateway, a routing table and routing table associations
The example could be trivially extended to include a tier of database servers, or even an autoscaling group for the application servers.
For the code, check out https://github.com/mjuuso/provisioning_example.
Find something to improve? Pull requests are very welcome!
Read next: How to use a custom domain name with Amazon Web Services EC2 instances