Infrastructure as Code with Terraform [Part 3]

Hey everyone! Today we're going to learn about Terraform configuration file (.tfstate file). As DevOps engineers, we know that infrastructure is a key component of any successful project. Terraform provides an effective way to build, manage and deploy cloud-based infrastructure quickly and easily. An important part of this process is the state file which Terraform creates automatically in the local workspace directory named “terraform.tfstate” when we use it to build our infrastructure.


Terraform.tfstate file

The tfstate file contains information about all the resources that have been provisioned by Terraform including their current configuration settings as well as how they are linked together within your network architecture or application stack setup. This allows for rapid changes without having to manually configure each resource individually every time something needs updating or changing - saving us both time and money!

The state file also helps ensure consistency between different environments such as development, staging or production by providing a single source of truth for what has already been created so far with regards to our environment's configuration settings; allowing us more confidence when making changes across multiple systems at once rather than relying on manual checks/updates being performed correctly every time there's an update required somewhere in our stack setup.

In short then: whenever you make changes using your terraform configurations files, this tfstate will be used by terraform to determine which parts need updating - ensuring accuracy while reducing the effort involved in managing complex cloud-based infrastructures efficiently!

Let's say you want to create an EC2 instance with Terraform and you have written the below code and performed a terraform apply.

resource "aws_instance" "example" {
  ami           = "ami-0fb653ca2d3203ac1"
  instance_type = "t2.micro"
}

The .tfstate file would be generated automatically similar to this

{
  "version": 4,
  "terraform_version": "1.2.3",
  "serial": 1,
  "lineage": "86545604-7463-4aa5-e9e8-a2a221de98d2",
  "outputs": {},
  "resources": [
    {
      "mode": "managed",
      "type": "aws_instance",
      "name": "example",
      "provider": "provider[\"registry.terraform.io/...\"]",
      "instances": [
        {
          "schema_version": 1,
          "attributes": {
            "ami": "ami-0fb653ca2d3203ac1",
            "availability_zone": "us-east-2b",
            "id": "i-0bc4bbe5b84387543",
            "instance_state": "running",
            "instance_type": "t2.micro",
            "(...)": "(truncated)"
          }
        }
      ]
    }
  ]
}

Using this JSON format, Terraform knows that a resource with the type aws_instance and name the example corresponds to an EC2 Instance in your AWS account with ID i-0bc4bbe5b84387543. Every time you run Terraform, it can fetch the latest status of this EC2 Instance from AWS and compare that to what’s in your Terraform configurations to determine what changes need to be applied. In other words, the output of the plan command is a diff between the code on your computer and the infrastructure deployed in the real world, as discovered via IDs in the state file.


Check your terraform.tfstate file in Visual Studio code here


Format of Terraform State File

The state file is written in a simply readable language called JSON (JavaScript Object Notation). This makes it easy to understand what’s going on with each resource and how they are connected.

Having a well-structured state file can be very helpful when troubleshooting issues or understanding complex configurations that involve multiple resources working together. For example, if you need to know which EC2 instance belongs to which Auto Scaling Group or VPC Security Group then looking at the state file can help quickly identify this relationship without having to manually search through each resource individually.

Another great feature of the State File is its ability for versioning control; by keeping track of changes made over time you can easily roll back any unwanted changes should something go wrong during an update process - saving both time and energy! Additionally, since it’s stored in plain text format it also allows for easier sharing between teams who may not necessarily be familiar with terraforming but still need access to certain pieces of information from within a configuration setup.


Managing .tfstate file

Managing a Terraform state file is an important part of any team's workflow. Without proper management, it can quickly become difficult to keep track of changes and ensure the integrity of your infrastructure. Fortunately, there are several strategies you can use to manage your Terraform state files effectively.

The most common method for managing a Terraform state file is storing it in a version control system like GitHub or Bitbucket. This allows all members of the team access to view and edit the same configuration files at once while also providing logging capabilities that enable tracking changes over time. Additionally, many version control systems offer to lock mechanisms that prevent multiple users from editing simultaneously and causing conflicts in their codebase Alternatively, some teams opt for using cloud services such as Amazon S3 buckets combined with DynamoDB tables which provide similar features as well as additional security options such as encryption keys or multi-factor authentication (MFA) when accessing sensitive data stored within them. Finally, if you're looking for an even more robust solution, consider using tools like HashiCorp's own Terraform Cloud service which offers built-in locking systems along with other advanced features. No matter what strategy you choose, properly managing your terraforming states will help ensure smooth collaboration between teammates while also protecting against potential disasters caused by human error or malicious intent.

Important tip: Always keep a copy of your .tfstate file and store it in a secure place. It's better not to mess with it.


What is the Terraform Backup State File?

Alright let's discuss the importance of Terraform's backup file, terraform.tfstate.backup. As a developer / DevOps engineer, you may often find yourself needing to make changes to your code and apply them - resulting in changes to resources that are stored in your tfstate file. In this case, us as developers / DevOps engineers need to have an old version of the state file so that we can easily revert if something goes wrong with our new modifications or if there is any unexpected behavior after applying our code change(s).

The terraform.tfstate.backup allows us just that; when making a change such as changing an instance type from “t2.micro” to “t3.micro” and then applying the code, this will create a copy of the original tfstate into this backup file before making any actual changes on our system/resources via Terraform itself. This provides peace of mind knowing that all necessary information about previous versions of resource details is being saved for easy retrieval should something go wrong during the application process or post-application review period!

In conclusion, having access to these backups help ensure developers / DevOps engineers remain confident while executing their tasks without fear of losing data due to incorrect execution or unforeseen errors within their codes – allowing them more time & energy focused on actually building great products instead worrying about potential issues down the road!

I hope now all of you got a clear understanding of terraform.tfstate file and terraform.tfstate.backup file. To get a deep understanding, I will recommend you create some resources on your own with Terraform and check these files and try to understand their configurations.

Cool! Stay tuned for the upcoming blog posts where we dive deeper into how this amazing tool works so that you can get the most out of your experience with it. Thanks again everyone – have a great rest of your day/weekend!


Today's top 3 books to read

“The way to get rid of darkness is with light; the way to overcome cold is with heat; the way to overcome the negative thought is to substitute the good thought. Affirm the good, and the bad will vanish."

― Joseph Murphy, The Power of Your Subconscious Mind


Aaqib Ahmad
DevOps Engineer