Table of Contents
Introduction
In this tutorial, How to build a simple environment with one EC2 instance base AWS. Terraform build EC2 instance. This time, I created as follows.
- VPC
- Internet Gateway
- Subnet
- Route Table
- Security Group
- EC2
My Environment for Terraform build EC2 instance
- OS Window
- Terraform
To install Terraform, By referring to the following.
If you are on Windows, you can install it as follows.
choco install terraform
terraform -help
Create a template file
First of all, Create a subdirectory and a Terraform template file in it. The name of the template file is arbitrary, but the extensions are *.tf
$ mkdir terraform-aws
$ cd terraform-aws
$ touch main.tf
Terraform Provider settings
We use the provided settings AWS. Terraform supports multiple providers.
provider "aws" {
access_key = "ACCESS_KEY_HERE"
secret_key = "SECRET_KEY_HERE"
region = "us-west-2"
}
Credential information
Use of Terraform variables
variable "access_key" {}
variable "secret_key" {}
provider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "us-west-2"
}
Assigning a value to a variable
There are three ways to assign a value to a variable.
1.Terraform command
$ terraform apply \
-var 'access_key=AXXXXXXXXXXXXXXXXXXXXXX' \
-var 'secret_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
2.Value in the environment variable
$ export TF_VAR_access_key="AXXXXXXXXXXXXXXXXXXXXX"
$ export TF_VAR_secret_key="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
3.Pass the value in a file
For example, the content terraform.tfvars file.
aws_access_key = "AXXXXXXXXXXXXXXXXXXXXX"
aws_secret_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
How to set Default value of variable
For example, We can set default values for variables.
variable "aws_access_key" {}
variable "aws_secret_key" {}
variable "region" {
default = "us-west-2"
}
provider "aws" {
access_key = "${var.aws_access_key}"
secret_key = "${var.aws_secret_key}"
region = "${var.region}"
}
Provider: AWS –Terraform by HashiCorp
Terraform Resource settings.
In Terraform the resource type is aws_* predefined. Example aws_vpc a VPC, EC2 is aws_instance. Each AWS resource in the format of item name = value. Example the VPC settings.
resource "aws_vpc" "myVPC" {
cidr_block = "10.1.0.0/16"
instance_tenancy = "default"
enable_dns_support = "true"
enable_dns_hostnames = "false"
tags = {
Name = "myVPC"
}
}
Refer other resources
Internet Gateway settings.
resource "aws_vpc" "myVPC" {
cidr_block = "10.1.0.0/16"
instance_tenancy = "default"
enable_dns_support = "true"
enable_dns_hostnames = "false"
tags {
Name = "myVPC"
}
}
resource "aws_internet_gateway" "myGW" {
vpc_id = "${aws_vpc.myVPC.id}"
}
Dependencies between resources
For example, set up a dependency between the VPC and Internet Gateway.
resource "aws_vpc" "myVPC" {
cidr_block = "10.1.0.0/16"
instance_tenancy = "default"
enable_dns_support = "true"
enable_dns_hostnames = "false"
tags {
Name = "myVPC"
}
}
resource "aws_internet_gateway" "myGW" {
vpc_id = "${aws_vpc.myVPC.id}"
depends_on = "${aws_vpc.myVPC}"
}
We mentioned above how to set the default value for a variable. we use of Map as follows
variable "images" {
default = {
us-east-1 = "ami-1ecae776"
us-west-2 = "ami-e7527ed7"
us-west-1 = "ami-d114f295"
}
}
The values of variables defined as var.images.us-east-1
Output on the console
output "public ip of aws-test" {
value = "${aws_instance.aws-test.public_ip}"
}
Terraform build EC2 instance summary
variable "aws_access_key" {}
variable "aws_secret_key" {}
variable "region" {
default = "us-west-2"
}
variable "images" {
default = {
us-east-1 = "ami-1ecae776"
us-west-2 = "ami-e7527ed7"
us-west-1 = "ami-d114f295"
}
}
provider "aws" {
access_key = "${var.aws_access_key}"
secret_key = "${var.aws_secret_key}"
region = "${var.region}"
}
resource "aws_vpc" "myVPC" {
cidr_block = "10.1.0.0/16"
instance_tenancy = "default"
enable_dns_support = "true"
enable_dns_hostnames = "false"
tags {
Name = "myVPC"
}
}
resource "aws_internet_gateway" "myGW" {
vpc_id = "${aws_vpc.myVPC.id}"
}
resource "aws_subnet" "public-a" {
vpc_id = "${aws_vpc.myVPC.id}"
cidr_block = "10.1.1.0/24"
availability_zone = "us-west-2a"
}
resource "aws_route_table" "public-route" {
vpc_id = "${aws_vpc.myVPC.id}"
route {
cidr_block = "0.0.0.0/0"
gateway_id = "${aws_internet_gateway.myGW.id}"
}
}
resource "aws_route_table_association" "puclic-a" {
subnet_id = "${aws_subnet.public-a.id}"
route_table_id = "${aws_route_table.public-route.id}"
}
resource "aws_security_group" "admin" {
name = "admin"
description = "Allow SSH inbound traffic"
vpc_id = "${aws_vpc.myVPC.id}"
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_instance" "aws-test" {
ami = "${var.images.us-west-2}"
instance_type = "t2.micro"
key_name = "aws.devopsroles.com"
vpc_security_group_ids = [
"${aws_security_group.admin.id}"
]
subnet_id = "${aws_subnet.public-a.id}"
associate_public_ip_address = "true"
root_block_device = {
volume_type = "gp2"
volume_size = "20"
}
ebs_block_device = {
device_name = "/dev/sdf"
volume_type = "gp2"
volume_size = "100"
}
tags {
Name = "aws-test"
}
}
output "public ip of aws-test" {
value = "${aws_instance.aws-test.public_ip}"
}
Dry-Run Terraform command
$ terraform plan
terraform plan command will check for syntax errors and parameter errors set in the block, but will not check for the correctness of the parameter values.
Applying a template
Let’s go we apply the template and create a resource on AWS.
$ terraform apply
Use terraform to show the display the content
$ terraform show
Resource changes
- We add the content in main.tf file.
- Use terraform plan to check the execution plan. marked with a ” -/ + “. This indicates that the resource will be deleted & recreated as the attribute changes .
- terraform apply command for creating.
Delete resource
terraform destroy command can delete a set of resources in the template. terraform plan -destroy you can find out the execution plan for resource deletion.
$ terraform plan -destroy
$ terraform destroy
How to split template file
I have settings together in one template file main.tf
You can be divided into 3 files as below
main.tf
provider "aws" {
access_key = "${var.aws_access_key}"
secret_key = "${var.aws_secret_key}"
region = "${var.region}"
}
## Describe the definition of the resource
resource "aws_vpc" "myVPC" {
cidr_block = "10.1.0.0/16"
instance_tenancy = "default"
enable_dns_support = "true"
enable_dns_hostnames = "false"
tags {
Name = "myVPC"
}
}
...
variables.tf
variable "aws_access_key" {}
variable "aws_secret_key" {}
variable "region" {
default = "us-west-2"
}
variable "images" {
default = {
us-east-1 = "ami-1ecae776"
us-west-2 = "ami-e7527ed7"
us-west-1 = "ami-d114f295"
}
}
outputs.tf
output "public ip of aws-test" {
value = "${aws_instance.aws-test.public_ip}"
}
Conclusion
You have to use Terraform build EC2 instance. I hope will this your helpful. Thank you for reading the DevopsRoles page!
2 thoughts on “Terraform build EC2 instance”