Bird
Raised Fist0
Terraformcloud~5 mins

Creation-time vs destruction-time in Terraform - CLI Comparison

Choose your learning style10 modes available
Introduction
When you create or delete cloud resources with Terraform, some actions happen when you first make the resource, and others happen when you remove it. Understanding when these actions run helps you control your infrastructure safely.
When you want to run a script only once when a resource is created, like setting up a database schema.
When you need to clean up external resources or data when deleting a cloud resource.
When you want to avoid running expensive or risky commands every time you update your infrastructure.
When you want to manage lifecycle hooks to control resource creation and destruction order.
When you want to automate backups before deleting storage buckets.
Config File - main.tf
main.tf
resource "null_resource" "example" {
  provisioner "local-exec" {
    command = "echo 'This runs at creation time'"
  }

  lifecycle {
    create_before_destroy = true
  }

  provisioner "local-exec" {
    when    = "destroy"
    command = "echo 'This runs at destruction time'"
  }
}

This Terraform file defines a null_resource that runs commands at different times.

  • The first local-exec provisioner runs a command when the resource is created.
  • The lifecycle block ensures the resource is created before the old one is destroyed.
  • The second local-exec provisioner with when = "destroy" runs a command only when the resource is deleted.
Commands
This command sets up Terraform in the current folder by downloading necessary plugins and preparing the environment.
Terminal
terraform init
Expected OutputExpected
Initializing the backend... Initializing provider plugins... - Finding latest version of hashicorp/null... - Installing hashicorp/null v3.1.0... - Installed hashicorp/null v3.1.0 (signed by HashiCorp) Terraform has been successfully initialized!
This command creates the resource defined in the configuration and runs the creation-time command automatically.
Terminal
terraform apply -auto-approve
Expected OutputExpected
null_resource.example: Creating... null_resource.example: Provisioning with 'local-exec'... null_resource.example (local-exec): Executing: ["/bin/sh" "-c" "echo 'This runs at creation time'"] null_resource.example (local-exec): This runs at creation time null_resource.example: Creation complete after 0s [id=1234567890] Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
→
-auto-approve - Skip manual approval to apply changes immediately
This command deletes the resource and runs the destruction-time command automatically.
Terminal
terraform destroy -auto-approve
Expected OutputExpected
null_resource.example: Destroying... null_resource.example: Provisioning with 'local-exec'... null_resource.example (local-exec): Executing: ["/bin/sh" "-c" "echo 'This runs at destruction time'"] null_resource.example (local-exec): This runs at destruction time null_resource.example: Destruction complete after 0s Destroy complete! Resources: 1 destroyed.
→
-auto-approve - Skip manual approval to destroy resources immediately
Key Concept

If you remember nothing else from this pattern, remember: creation-time actions run when making resources, destruction-time actions run only when removing them.

Common Mistakes
Running destruction-time commands during resource updates.
Destruction-time commands should only run when deleting resources, not when changing them, to avoid unwanted side effects.
Use the 'when = "destroy"' setting in provisioners to ensure commands run only at destruction.
Not using lifecycle rules when replacing resources.
Without lifecycle rules, Terraform might destroy a resource before creating a new one, causing downtime.
Use 'create_before_destroy = true' to create new resources before deleting old ones.
Summary
Use provisioners with 'when = "destroy"' to run commands only when deleting resources.
Use normal provisioners to run commands at creation time.
Use lifecycle rules like 'create_before_destroy' to control resource replacement order.

Practice

(1/5)
1. What does creation-time mean in Terraform?
easy
A. The moment when resources are first set up or created
B. The moment when resources are deleted or removed
C. The time when Terraform runs a plan without changes
D. The time when Terraform refreshes the state

Solution

  1. Step 1: Understand creation-time meaning

    Creation-time refers to when Terraform sets up resources for the first time.
  2. Step 2: Differentiate from destruction-time

    Destruction-time is when resources are removed, not created.
  3. Final Answer:

    The moment when resources are first set up or created -> Option A
  4. Quick Check:

    Creation-time = resource setup [OK]
Hint: Creation-time means resource setup, destruction-time means removal [OK]
Common Mistakes:
  • Confusing creation-time with destruction-time
  • Thinking creation-time is when resources are deleted
  • Mixing creation-time with Terraform plan execution
2. Which Terraform lifecycle argument controls actions at destruction-time?
easy
A. create_before_destroy
B. depends_on
C. ignore_changes
D. prevent_destroy

Solution

  1. Step 1: Identify destruction-time control arguments

    The prevent_destroy argument stops Terraform from deleting a resource.
  2. Step 2: Compare other lifecycle arguments

    create_before_destroy affects creation and replacement order, not destruction prevention.
  3. Final Answer:

    prevent_destroy -> Option D
  4. Quick Check:

    Destruction-time control = prevent_destroy [OK]
Hint: Use prevent_destroy to block resource deletion at destruction-time [OK]
Common Mistakes:
  • Choosing create_before_destroy which affects creation order
  • Confusing ignore_changes with destruction control
  • Using depends_on which manages resource dependencies
3. Given this Terraform snippet:
resource "aws_instance" "example" {
  ami           = "ami-123456"
  instance_type = "t2.micro"

  lifecycle {
    create_before_destroy = true
  }
}

What happens when you change instance_type from t2.micro to t2.small?
medium
A. Terraform destroys the old instance first, then creates the new one
B. Terraform updates the instance in place without destruction
C. Terraform creates the new instance first, then destroys the old one
D. Terraform throws an error due to lifecycle conflict

Solution

  1. Step 1: Understand create_before_destroy effect

    This setting makes Terraform create the new resource before destroying the old one.
  2. Step 2: Apply to instance_type change

    Changing instance_type forces replacement, so new instance is created first, then old destroyed.
  3. Final Answer:

    Terraform creates the new instance first, then destroys the old one -> Option C
  4. Quick Check:

    create_before_destroy = new before old [OK]
Hint: create_before_destroy means new resource before old is removed [OK]
Common Mistakes:
  • Assuming in-place update without replacement
  • Thinking old resource is destroyed before new is created
  • Believing lifecycle causes errors on changes
4. You added prevent_destroy = true to a resource but Terraform still deletes it on terraform destroy. What is the likely cause?
medium
A. You ran terraform destroy which ignores prevent_destroy
B. The prevent_destroy argument is misspelled or misplaced
C. The resource is referenced by another resource with depends_on
D. Terraform does not support prevent_destroy for that resource type

Solution

  1. Step 1: Check prevent_destroy usage

    It must be inside the lifecycle block and spelled correctly.
  2. Step 2: Understand terraform destroy behavior

    terraform destroy respects prevent_destroy and will error if deletion is blocked.
  3. Final Answer:

    The prevent_destroy argument is misspelled or misplaced -> Option B
  4. Quick Check:

    Misplaced prevent_destroy causes deletion despite protection [OK]
Hint: Ensure prevent_destroy is inside lifecycle block and spelled right [OK]
Common Mistakes:
  • Assuming terraform destroy ignores prevent_destroy
  • Placing prevent_destroy outside lifecycle block
  • Thinking depends_on affects prevent_destroy behavior
5. You want to replace a resource safely without downtime. Which lifecycle settings should you use to ensure the new resource is created before the old one is destroyed, and prevent accidental deletion?
hard
A. Set create_before_destroy = true and prevent_destroy = true
B. Set create_before_destroy = false and prevent_destroy = true
C. Set create_before_destroy = true and ignore_changes = [all]
D. Set prevent_destroy = false and ignore_changes = [all]

Solution

  1. Step 1: Use create_before_destroy for safe replacement

    This ensures the new resource is ready before the old one is removed, avoiding downtime.
  2. Step 2: Use prevent_destroy to block accidental deletion

    This stops Terraform from deleting the resource unless explicitly allowed, adding safety.
  3. Final Answer:

    Set create_before_destroy = true and prevent_destroy = true -> Option A
  4. Quick Check:

    Safe replacement = create_before_destroy + prevent_destroy [OK]
Hint: Combine create_before_destroy and prevent_destroy for safe updates [OK]
Common Mistakes:
  • Setting prevent_destroy without create_before_destroy causes downtime
  • Using ignore_changes to avoid destruction which doesn't prevent deletion
  • Disabling prevent_destroy risks accidental resource loss
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard