Terraform
Frequently used terraform snippets
One-liners
Validate configurations: terraform validate
Start terraform config: terraform init
Give format to files within direcoty terrafom fmt
Execute terraform terraform apply --auto-approve
Frecuently used AMI IDs
Ubuntu server 18.04 (HVM) 64bits x86:
ami-0a63f96e85105c6d3
Recipes
Setup AWS instances
Get AWS access key/AWS secret key
execute
aws configureusing credentials from 1.execute
terraform initwhen starting new project at the root of the directory
Get list of AMI IDs matching criteria
variable "image_name" {
description = "The name of the image to use"
default = "ubuntu-*-18.04*"
}
provider "aws" {
region = "us-east-2"
}
data "aws_ami" "images" {
owners = ["amazon"]
most_recent = true
filter {
name = "name"
values = [var.image_name]
}
}
output "ids" {
value = "\nName: ${data.aws_ami.images.name}\nId: ${data.aws_ami.images.id}"
Single ec2 with ubuntu 18.04 x86
variable "key_name" {
description = "Key to use for accessing the instance"
}
variable "sec_group" {
description = "Security group for the instance"
}
variable "instance_name" {
description = "Instance's name"
}
provider "aws" {
region = "us-east-2"
}
resource "aws_instance" "example" {
ami = "ami-f4f4cf91"
instance_type = "t2.micro"
key_name = var.key_name
vpc_security_group_ids = var.sec_group
tags = {
Name = var.instance_name
}
}
output "public_ip" {
value = "Created instance (public_dns): ${aws_instance.example.public_dns}"
}Create and attach ebs storage
aws_ebs_volume and aws_instance ideally belong to the same availability_zone
resource "aws_volume_attachment" "ebs_att" {
device_name = "/dev/sdh"
volume_id = "${aws_ebs_volume.example.id}"
instance_id = "${aws_instance.web.id}"
}
resource "aws_instance" "web" {
ami = "ami-21f78e11"
availability_zone = "us-west-2a"
instance_type = "t1.micro"
tags = {
Name = "HelloWorld"
}
}
resource "aws_ebs_volume" "example" {
availability_zone = "us-west-2a"
size = 1
}Define storage from ec2 creation
variable "EC2_ROOT_VOLUME_SIZE" {
type = "string"
default = "30"
description = "The volume size for the root volume in GiB"
}
variable "EC2_ROOT_VOLUME_TYPE" {
type = "string"
default = "gp2"
description = "The type of data storage: standard, gp2, io1"
}
variable "EC2_ROOT_VOLUME_DELETE_ON_TERMINATION" {
default = true
description = "Delete the root volume on instance termination."
}
# then
resource "aws_instance" "example" {
ami = "${var.AMI_ID}"
instance_type = "${var.EC2_INSTANCE_SIZE}"
root_block_device {
volume_size = "${var.EC2_ROOT_VOLUME_SIZE}"
volume_type = "${var.EC2_ROOT_VOLUME_TYPE}"
delete_on_termination = "${var.EC2_ROOT_VOLUME_DELETE_ON_TERMINATION}"
}
}Create a security group and use it afterwards (Allow income from 8080)
resource "aws_security_group" "http_group" {
name = "terraform-example-instance"
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
# add the property
# vpc_security_group_ids = ["${aws_security_group.http_group.id}"]
# in the aws_instanceCreate a security group for ssh access (Experimental)
resource "aws_security_group" "ssh_group" {
name = "terraform-example-instance"
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
# add the property
# vpc_security_group_ids = ["${aws_security_group.ssh_group.id}"]
# in the aws_instanceStoping/Starting instances with AWS CLI
aws ec2 stop-instances --region us-east-2 --instance-ids i-0123456789abcdef
aws ec2 start-instances --region us-east-2 --instance-ids i-0123456789abcdef
#If you need to fetch the instance ID quickly, you can define a TF output and get at it that way:
terraform output id
# i-0123456789abcdefReferences
[Terraform up and running (local book)](/media/w/6529BB496A1EC696/Yevgeniy Brikman - Terraform Up and Running (Early Release)-O'Reilly Media (2017).pdf)
https://learn.hashicorp.com/terraform/getting-started/build
http://blog.shippable.com/setup-a-container-cluster-on-aws-with-terraform-part-2-provision-a-cluster
https://towardsdatascience.com/seamlessly-integrated-deep-learning-environment-with-terraform-google-cloud-gitlab-and-docker-faee4b351e94
Last updated
Was this helpful?