Will Terraform Delete my Existing Infrastructure on AWS when Apply?
This can be the serious concern if you
- Already have AWS and resources created manually
- Considering adopt Terraform
You know that Terraform will try to create the infrastructure as described in the code.
This means adding something, editing something and deleting something.
If you have only one resource in the code, you worry that Terraform will delete everything else when apply to match the infra in the code.
Short Answer: No
Terraform will only delete something they create.
Long Answer: No, It see everything by State File
To understand why, you have to know that Terraform will see the infrastructure by “State file”.
It will not go to your AWS and inspecting everything.
When first apply, Terraform create state file.
When apply change, Terraform see state file, make change, then update state file.
When destroy, Terraform see state file, delete resources it see, then update state file.
Some Experiment: Creating EC2
You can see this by yourself with simple hands-on experiment for example, creating the EC2 with Terraform.
Create empty folder and add main.tf
with following code.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
required_version = ">= 1.2.0"
}
provider "aws" {
region = "ap-southeast-1"
}
resource "aws_instance" "app_server" {
ami = "ami-078c1149d8ad719a7"
instance_type = "t2.micro"
tags = {
Name = "ExampleAppServerInstance"
}
}
You can dry run to check before applying with plan
command.
You see only one thing Terraform add and nothing to destroy.
$ terraform plan
...
Plan: 1 to add, 0 to change, 0 to destroy.
Then you run terraform apply
, now you see the EC2 created and terraform.tfstate
appears. You see EC2 in the state file.
Nothing else in your AWS account is deleted.
Try Deleting State file
Then if you delete the state file terraform.tfstate
Then run plan
command again. It try to create the duplicated EC2.
This prove Terraform inspect nothing. It reads, operates and writes through the state file.
When apply, you can see the duplicated instance created.
Now you see how it works.
Bonus: How to destroy EC2 in the first state file you deleted
Now you run terraform destroy
the first ExampleAppServerInstance
is going away.
Now, you must delete the orphan ExampleAppServerInstance
manually because this go away with first state file you delete.
Another recovery way is to import it manually.
You see instance id in the console, then you recover this by import
command.
terraform import aws_instance.app_server i-043d6ee6568720eed
Now your terraform know the instance and match this with app_server
in the main.tf
file.
Now Terraform know this resource.
So you can delete this by terraform destroy
!
See you next time : )