Bird
Raised Fist0
Terraformcloud~5 mins

Ignore_changes lifecycle rule in Terraform - Commands & Configuration

Choose your learning style10 modes available
Introduction
Sometimes, you want Terraform to ignore changes to certain resource attributes so it does not try to update them every time. The ignore_changes lifecycle rule tells Terraform to skip tracking changes on specified parts of a resource.
When a resource attribute is changed outside Terraform and you don't want Terraform to overwrite it.
When a cloud provider automatically updates some resource fields and you want to avoid constant updates.
When you want to manage some parts of a resource manually without Terraform interfering.
When you want to prevent Terraform from recreating a resource due to changes in specific attributes.
When you want to keep Terraform state stable despite external changes to certain resource properties.
Config File - main.tf
main.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
  required_version = ">= 1.0"
}

provider "aws" {
  region = "us-east-1"
}

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

  lifecycle {
    ignore_changes = [
      "tags.Name"
    ]
  }

  tags = {
    Name = "example-instance"
  }
}

This Terraform file creates an AWS EC2 instance.

The lifecycle block with ignore_changes tells Terraform to ignore any changes to the Name tag on this instance.

This means if someone changes the Name tag manually in AWS, Terraform will not try to revert it back.

Commands
Initializes Terraform, downloads the AWS provider plugin, and prepares the working directory.
Terminal
terraform init
Expected OutputExpected
Initializing the backend... Initializing provider plugins... - Finding hashicorp/aws versions matching "~> 4.0"... - Installing hashicorp/aws v4.60.0... - Installed hashicorp/aws v4.60.0 (signed by HashiCorp) Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure.
Applies the Terraform configuration to create the AWS EC2 instance without asking for confirmation.
Terminal
terraform apply -auto-approve
Expected OutputExpected
aws_instance.example: Creating... aws_instance.example: Still creating... [10s elapsed] aws_instance.example: Creation complete after 15s [id=i-0abcd1234efgh5678] Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
→
-auto-approve - Skips interactive approval prompt
Shows the planned changes. If the Name tag is changed manually in AWS, Terraform will not plan to change it back because of ignore_changes.
Terminal
terraform plan
Expected OutputExpected
No changes. Infrastructure is up-to-date. This means that Terraform did not detect any changes to apply.
Key Concept

If you remember nothing else from this pattern, remember: ignore_changes tells Terraform to skip tracking and updating specific resource attributes.

Common Mistakes
Not specifying the exact attribute path in ignore_changes
Terraform will not ignore the intended changes and will try to update the resource anyway.
Use the correct attribute path syntax, like tags["Name"], to target the specific attribute.
Using ignore_changes to avoid fixing real configuration drift
It hides problems instead of solving them, leading to unmanaged differences and confusion.
Use ignore_changes only for attributes that change outside Terraform and are safe to ignore.
Summary
Use the lifecycle ignore_changes block inside a resource to tell Terraform which attributes to ignore.
Run terraform init to prepare the environment and terraform apply to create resources.
terraform plan shows no changes for ignored attributes even if they differ outside Terraform.

Practice

(1/5)
1. What is the main purpose of the ignore_changes lifecycle rule in Terraform?
easy
A. To prevent Terraform from updating specified resource attributes during apply
B. To delete resources automatically when attributes change
C. To force Terraform to recreate resources on every apply
D. To enable Terraform to ignore syntax errors in configuration files

Solution

  1. Step 1: Understand the role of ignore_changes

    This rule tells Terraform to skip updating certain attributes even if they change outside Terraform.
  2. Step 2: Compare options with this behavior

    Only 'To prevent Terraform from updating specified resource attributes during apply' matches this behavior by preventing updates on specified attributes.
  3. Final Answer:

    To prevent Terraform from updating specified resource attributes during apply -> Option A
  4. Quick Check:

    ignore_changes skips updates = D [OK]
Hint: Remember: ignore_changes skips updates on chosen attributes [OK]
Common Mistakes:
  • Thinking ignore_changes deletes resources
  • Confusing ignore_changes with forcing recreation
  • Believing ignore_changes fixes syntax errors
2. Which of the following is the correct syntax to ignore changes on the attribute tags in a resource lifecycle block?
easy
A. lifecycle { ignore_changes = tags }
B. lifecycle { ignore_changes = ["tags"] }
C. lifecycle { ignore_changes = { tags = true } }
D. lifecycle { ignore_changes = "tags" }

Solution

  1. Step 1: Recall the correct syntax for ignore_changes

    It requires a list of attribute names as strings inside square brackets.
  2. Step 2: Match options to this syntax

    Only lifecycle { ignore_changes = ["tags"] } uses a list with quotes around "tags" correctly.
  3. Final Answer:

    lifecycle { ignore_changes = ["tags"] } -> Option B
  4. Quick Check:

    ignore_changes needs list of strings = A [OK]
Hint: Use square brackets and quotes for ignore_changes list [OK]
Common Mistakes:
  • Omitting square brackets for the list
  • Using a map or boolean instead of list
  • Passing a single string without brackets
3. Given this Terraform resource snippet:
resource "aws_instance" "example" {
  ami           = "ami-123456"
  instance_type = "t2.micro"
  tags = {
    Name = "example-instance"
  }

  lifecycle {
    ignore_changes = ["tags"]
  }
}
If someone manually changes the tags in AWS console, what will happen when you run terraform apply next time?
medium
A. Terraform will throw an error about tag drift
B. Terraform will overwrite the tags back to the config values
C. Terraform will keep the manual tag changes and not overwrite them
D. Terraform will recreate the instance to fix tags

Solution

  1. Step 1: Understand ignore_changes effect on tags

    ignore_changes on "tags" means Terraform ignores any changes to tags outside Terraform.
  2. Step 2: Predict apply behavior

    Terraform will not overwrite manual tag changes and will keep them as is.
  3. Final Answer:

    Terraform will keep the manual tag changes and not overwrite them -> Option C
  4. Quick Check:

    ignore_changes on tags keeps manual changes = C [OK]
Hint: ignore_changes means Terraform skips updating those attributes [OK]
Common Mistakes:
  • Assuming Terraform always overwrites manual changes
  • Expecting errors on drift with ignore_changes
  • Thinking resource will be recreated due to tag changes
4. You wrote this lifecycle block:
lifecycle {
  ignore_changes = "tags"
}
Terraform plan shows an error. What is the problem and how to fix it?
medium
A. ignore_changes cannot include tags attribute
B. ignore_changes requires a boolean value, not string
C. ignore_changes must be outside lifecycle block
D. ignore_changes must be a list, fix by using ["tags"]

Solution

  1. Step 1: Identify syntax error in ignore_changes value

    ignore_changes expects a list of attribute names, not a single string.
  2. Step 2: Correct the syntax

    Wrap "tags" in square brackets to make it a list: ["tags"]
  3. Final Answer:

    ignore_changes must be a list, fix by using ["tags"] -> Option D
  4. Quick Check:

    ignore_changes needs list syntax = B [OK]
Hint: ignore_changes always needs a list, even for one attribute [OK]
Common Mistakes:
  • Passing a single string instead of list
  • Placing ignore_changes outside lifecycle block
  • Using boolean instead of list for ignore_changes
5. You manage an AWS S3 bucket with Terraform. The bucket has a versioning block that is sometimes changed manually outside Terraform. You want Terraform to manage all bucket settings except ignore changes to versioning.enabled. How do you configure ignore_changes correctly?
hard
A. lifecycle { ignore_changes = ["versioning[0].enabled"] }
B. lifecycle { ignore_changes = ["versioning.enabled"] }
C. lifecycle { ignore_changes = ["versioning"] }
D. lifecycle { ignore_changes = ["versioning.enabled.enabled"] }

Solution

  1. Step 1: Understand nested attribute syntax in ignore_changes

    For nested blocks like versioning, Terraform uses index notation like versioning[0].enabled to specify the attribute.
  2. Step 2: Choose the correct attribute path

    lifecycle { ignore_changes = ["versioning[0].enabled"] } uses the correct syntax with index 0 for the first versioning block and the enabled attribute.
  3. Final Answer:

    lifecycle { ignore_changes = ["versioning[0].enabled"] } -> Option A
  4. Quick Check:

    Nested block attribute needs index notation = A [OK]
Hint: Use index like versioning[0].enabled for nested block attributes [OK]
Common Mistakes:
  • Ignoring index notation for nested blocks
  • Using incomplete attribute path
  • Ignoring nested block structure in ignore_changes
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