Building Infrastructure with Terraform
Terraform is similar to Amazon Cloud Formation. It allows you to automate the creation of your infrastructure like VPCs, ELBS, ASGs, Instances. Terraform is generic, it works with other provides besides AWS like containers and even bare-metal servers. Terraform build infrastructure, but also launch it as well.
Terraform enables infrastructure as a Code because you can describe your whole infrastructure with a simple set of declarative files. Terraform keeps track of state, so will tell you if can do something or can't do some operation. This is very cool for operation point of view. To use Terraform you just need to download the binaries for your OS and them put Terraform in your PATH. Once you have the config files you can do $ terraform apply and the magic will happen :-)
Today i will show how to build a very simple infrastructure on AWS, you just need have your credential(ID and Secret). Main.tf is your config for the infrastructure. Variables are var you can use into your main and outputs is what terraform will output for you when its done. Download all this 3 scripts put into terraform folder, drop you pem file as well and just run $ terraform apply.
main.tf
outputs.tf
variables.tf
Cheers,
Diego Pacheco
Terraform enables infrastructure as a Code because you can describe your whole infrastructure with a simple set of declarative files. Terraform keeps track of state, so will tell you if can do something or can't do some operation. This is very cool for operation point of view. To use Terraform you just need to download the binaries for your OS and them put Terraform in your PATH. Once you have the config files you can do $ terraform apply and the magic will happen :-)
Today i will show how to build a very simple infrastructure on AWS, you just need have your credential(ID and Secret). Main.tf is your config for the infrastructure. Variables are var you can use into your main and outputs is what terraform will output for you when its done. Download all this 3 scripts put into terraform folder, drop you pem file as well and just run $ terraform apply.
main.tf
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Specify the provider and access details | |
provider "aws" { | |
region = "${var.aws_region}" | |
} | |
# Our default security group to access | |
# the instances over SSH and HTTP | |
resource "aws_security_group" "default" { | |
name = "terraform_example" | |
description = "Used in the terraform" | |
# SSH access from anywhere | |
ingress { | |
from_port = 22 | |
to_port = 22 | |
protocol = "tcp" | |
cidr_blocks = ["0.0.0.0/0"] | |
} | |
# HTTP access from anywhere | |
ingress { | |
from_port = 80 | |
to_port = 80 | |
protocol = "tcp" | |
cidr_blocks = ["0.0.0.0/0"] | |
} | |
# outbound internet access | |
egress { | |
from_port = 0 | |
to_port = 0 | |
protocol = "-1" | |
cidr_blocks = ["0.0.0.0/0"] | |
} | |
} | |
resource "aws_elb" "web" { | |
name = "terraform-example-elb" | |
# The same availability zone as our instance | |
availability_zones = ["${aws_instance.web.availability_zone}"] | |
listener { | |
instance_port = 80 | |
instance_protocol = "http" | |
lb_port = 80 | |
lb_protocol = "http" | |
} | |
# The instance is registered automatically | |
instances = ["${aws_instance.web.id}"] | |
} | |
resource "aws_instance" "web" { | |
# The connection block tells our provisioner how to | |
# communicate with the resource (instance) | |
connection { | |
# The default username for our AMI | |
user = "ubuntu" | |
# The path to your keyfile | |
key_file = "${var.key_path}" | |
} | |
instance_type = "m1.small" | |
# Lookup the correct AMI based on the region | |
# we specified | |
ami = "${lookup(var.aws_amis, var.aws_region)}" | |
# The name of our SSH keypair you've created and downloaded | |
# from the AWS console. | |
# | |
# https://console.aws.amazon.com/ec2/v2/home?region=us-west-2#KeyPairs: | |
# | |
key_name = "${var.key_name}" | |
# Our Security group to allow HTTP and SSH access | |
security_groups = ["${aws_security_group.default.name}"] | |
# We run a remote provisioner on the instance after creating it. | |
# In this case, we just install nginx and start it. By default, | |
# this should be on port 80 | |
provisioner "remote-exec" { | |
inline = [ | |
"sudo apt-get -y update", | |
"sudo apt-get -y install nginx", | |
"sudo service nginx start" | |
] | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
output "address" { | |
value = "${aws_elb.web.dns_name}" | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
variable "key_name" { | |
description = "Name of the SSH keypair to use in AWS." | |
} | |
variable "key_path" { | |
description = "Path to the private portion of the SSH key specified." | |
} | |
variable "aws_region" { | |
description = "AWS region to launch servers." | |
default = "us-west-2" | |
} | |
# Ubuntu Precise 12.04 LTS (x64) | |
variable "aws_amis" { | |
default = { | |
eu-west-1 = "ami-b1cf19c6" | |
us-east-1 = "ami-de7ab6b6" | |
us-west-1 = "ami-3f75767a" | |
us-west-2 = "ami-21f78e11" | |
} | |
} |
Diego Pacheco