A code example
terraform
/ˈtɛrəfɔːm/
verb:
terraform something to make a planet more like Earth, so that people can live on it
Oops not this kind of terraform..
If you are a DevOps Engineer or you have widen responsibilities inside your team, probably you have needed to create a server on cloud , or a pipeline or whatever..
And if you use AWS cloud, wow so many configurations and screens etc. mess.
Here comes the Terraform, an infrastructure as code tool that let you define both cloud and on-prem resources in human-readable configuration files that you can version, reuse, and share.
In other words, Terraform is a DevOps tool that you can use to design, create, destroy infrastructure.
Example given you can create applications, environments, networks, servers, pipelines etc.
Terraform provides support for manage resources on Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes etc.
For more info you can check the official terraform website.
Few months ago, in my team we faced the problem to automate our deployment process and we needed more environments to test the new deliverables with QA team and partners. The environments should be identical and have same build and deployment flow.
So we decided to use Terraform to create new applications, environments and code pipelines on AWS cloud.
In this post, I will step on the first part of the solution we followed and I will describe the procedure how to build an AWS Beanstalk environment.
Prerequisite:
- Before we start Download Terraform
- Assume also that you already have already an AWS account.
So you already have an:
access_key
secret_key
region
We need these credentials in order to login on AWS cloud.
Starting:
Let’s see what resources we need to create :
1. An aws elastic beanstalk application
2. An aws elastic beanstalk environment
May you want to associate an aws key pair .
A key pair (public key, private key) is used to control login access to EC2 instances. Anyone with the private key, you can SSH into the EC2 machine .
Check here how can create one
We declare all resources inside the resources.tf file and all the variables inside the var.tf file.
So on resources.tf we want to create the elastic beanstalk application and theelastic beanstalk environment that will run a specific application version. Remember more than one environments can belong to one application.
# Create elastic beanstalk application resource
“aws_elastic_beanstalk_application” “beanstalk-app” {
name = var.beanstalk_app_name
}
# Create elastic beanstalk Environment resource
“aws_elastic_beanstalk_environment” “beanstalk-app-env” {
name = var.beanstalk_env_name
application = var.beanstalk_app_name
solution_stack_name = var.solution_stack_name
<... add environment properties... >
}
As you see , we define
the name of the environment,
the application name,
the solution_stack_name which specifies the platform will be used , in my example “64bit Amazon Linux 2018.03 v3.4.19 running Tomcat 8.5 Java 8”(check the supproted EB platforms here)
and of course all the environment properties, as is the aws credentials, the database configuration (here a postgres configuration) etc
The environment properties (in Environment Configuration) can be declared “static”
setting {
namespace =“aws:elasticbeanstalk:application:environment”
name = “AWS_ACCESS_KEY_ID”
value = var.aws_access_key
}
or “dynamic”
dynamic “setting” {
for_each = var.settings
content {
namespace = setting.value[“namespace”]
name = setting.value[“name”]
value = setting.value[“value”]
}
}
Go to Action:
Now we have created the resources.tf and var.tf file, we will execute the terraform commands to create the infrastructure.
On terminal, locate to folder that you have created these files.
First of all we need to initialise Terraform
terraform init
Now, terraform should creates an execution plan, detects the changes needed which and lets you preview them . The below command will show the resources that will be created, versioned, or scaled down
terraform plan
If everything looks fine to you, time to apply the changes. Terraform executes the actions scripted in the resources.tf file and creates the infrastructure.
terraform apply
Now assume that you want to destroy all remote objects managed by the configuration file (resources.tf ), execute
terraform destroy
You may want to destroy only some parts of infrastructure, e.g. to destroy the beanstalk environment or the the beanstalk application
terraform destroy -target=aws_elastic_beanstalk_environment.beanstalk-app-env
terraform destroy -target=aws_elastic_beanstalk_application.beanstalk-app
A more complete guide of how you can destroy resources in respect of terraform state you can check how-to-destroy-terraform-resources.
You can check the example source code on GitHub .
Happy “colonize” AWS :))