Bird
Raised Fist0
Terraformcloud~5 mins

Declarative vs imperative IaC in Terraform - CLI Comparison

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
When managing cloud resources, you can tell the system what you want (declarative) or how to do it step-by-step (imperative). Terraform uses the declarative way, which means you describe the desired state and it figures out the steps to get there.
When you want to create or update cloud resources by describing what they should look like, not how to create them.
When you want your infrastructure setup to be easy to read and maintain by others.
When you want to avoid mistakes from manual step-by-step commands.
When you want to track changes to your infrastructure over time.
When you want to automate cloud resource management safely and predictably.
Config File - main.tf
main.tf
provider "aws" {
  region = "us-east-1"
}

resource "aws_s3_bucket" "example_bucket" {
  bucket = "my-example-bucket-terraform-12345"
  acl    = "private"
}

This Terraform file declares a provider (AWS) and a resource (an S3 bucket). You describe the bucket you want, and Terraform will create it for you. You do not write commands to create the bucket; you just say what you want.

Commands
This command sets up Terraform in your folder by downloading the AWS provider plugin. It prepares Terraform to work with AWS.
Terminal
terraform init
Expected OutputExpected
Initializing the backend... Initializing provider plugins... - Finding latest version of hashicorp/aws... - Installing hashicorp/aws v4.0.0... - Installed hashicorp/aws v4.0.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.
This command shows what Terraform will do to reach the desired state described in the config file. It does not change anything yet.
Terminal
terraform plan
Expected OutputExpected
An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # aws_s3_bucket.example_bucket will be created + resource "aws_s3_bucket" "example_bucket" { + acl = "private" + bucket = "my-example-bucket-terraform-12345" + id = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy.
This command applies the changes to create the S3 bucket as described. The -auto-approve flag skips the manual confirmation step.
Terminal
terraform apply -auto-approve
Expected OutputExpected
aws_s3_bucket.example_bucket: Creating... aws_s3_bucket.example_bucket: Creation complete after 2s [id=my-example-bucket-terraform-12345] Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
→
-auto-approve - Automatically approve the apply without asking for confirmation
This command removes the S3 bucket created by Terraform. It cleans up the resources to avoid extra costs.
Terminal
terraform destroy -auto-approve
Expected OutputExpected
aws_s3_bucket.example_bucket: Destroying... aws_s3_bucket.example_bucket: Destruction complete after 1s Destroy complete! Resources: 1 destroyed.
→
-auto-approve - Automatically approve the destroy without asking for confirmation
Key Concept

If you remember nothing else, remember: declarative IaC means you describe what you want, and the tool figures out how to do it.

Common Mistakes
Trying to write step-by-step commands inside the Terraform config file.
Terraform config files only describe the desired state, not the steps to get there.
Write resource blocks that describe the final infrastructure you want, and use Terraform commands to apply changes.
Running terraform apply without running terraform plan first.
You might apply unexpected changes without reviewing them first.
Always run terraform plan to see what changes will happen before applying.
Summary
Terraform uses declarative IaC to describe the desired cloud resources.
You write config files that say what you want, not how to do it.
Commands like terraform plan and terraform apply help you see and make changes safely.

Practice

(1/5)
1. What is the main difference between declarative and imperative Infrastructure as Code (IaC)?
easy
A. Declarative IaC describes the desired end state, while imperative IaC specifies exact steps to reach it.
B. Declarative IaC requires manual commands, while imperative IaC is fully automatic.
C. Declarative IaC is only for cloud, imperative IaC is for on-premises.
D. Declarative IaC uses scripts, imperative IaC uses configuration files.

Solution

  1. Step 1: Understand declarative IaC

    Declarative IaC focuses on describing the final desired state of infrastructure without specifying how to achieve it.
  2. Step 2: Understand imperative IaC

    Imperative IaC lists the exact commands or steps needed to create or change infrastructure.
  3. Final Answer:

    Declarative IaC describes the desired end state, while imperative IaC specifies exact steps to reach it. -> Option A
  4. Quick Check:

    Declarative = final state, Imperative = steps [OK]
Hint: Declarative = what you want; imperative = how to do it [OK]
Common Mistakes:
  • Confusing declarative with imperative steps
  • Thinking declarative requires manual commands
  • Assuming declarative only works for cloud
2. Which of the following Terraform code snippets correctly shows a declarative resource definition?
easy
A. create_instance("ami-123", "t2.micro")
B. resource "aws_instance" "web" { ami = "ami-123" instance_type = "t2.micro" }
C. if not instance_exists() then create_instance()
D. run_command("aws ec2 run-instances --image-id ami-123")

Solution

  1. Step 1: Identify declarative syntax

    Terraform resource blocks declare the desired state, like the resource "aws_instance" "web" { ... } block.
  2. Step 2: Compare with imperative styles

    Options B, C, and D show commands or logic steps, which are imperative, not declarative.
  3. Final Answer:

    The Terraform resource block syntax is declarative. -> Option B
  4. Quick Check:

    Terraform resource block = declarative [OK]
Hint: Terraform resource blocks are declarative descriptions [OK]
Common Mistakes:
  • Choosing imperative command syntax as declarative
  • Confusing function calls with resource declarations
  • Ignoring the resource block structure
3. Given this Terraform snippet, what will Terraform do when you run terraform apply if the AWS instance does not exist yet?
resource "aws_instance" "example" {
  ami           = "ami-abc123"
  instance_type = "t2.micro"
}
medium
A. Terraform will prompt for manual commands to create the instance.
B. Terraform will delete any existing instances and do nothing else.
C. Terraform will create a new AWS instance with the specified AMI and instance type.
D. Terraform will throw a syntax error because the resource block is incomplete.

Solution

  1. Step 1: Understand Terraform apply behavior

    Terraform compares the current state with the desired state defined in the resource block.
  2. Step 2: Predict action if resource missing

    If the AWS instance does not exist, Terraform will create it to match the declared state.
  3. Final Answer:

    Terraform will create a new AWS instance with the specified AMI and instance type. -> Option C
  4. Quick Check:

    Missing resource = Terraform creates it [OK]
Hint: Terraform creates missing resources to match declared state [OK]
Common Mistakes:
  • Thinking Terraform deletes resources by default
  • Expecting manual commands during apply
  • Assuming syntax error in valid resource block
4. You wrote this Terraform code but terraform apply fails with an error:
resource "aws_instance" "web" {
  ami = "ami-123"
  instance_type = t2.micro
}
What is the likely cause of the error?
medium
A. Terraform requires an explicit create command inside the resource block.
B. The resource name "web" is invalid and must be changed.
C. The AMI ID "ami-123" is not allowed in Terraform.
D. Missing quotes around the instance_type value causes a syntax error.

Solution

  1. Step 1: Check syntax of resource attributes

    Terraform requires string values to be in quotes. The instance_type value is missing quotes.
  2. Step 2: Identify error cause

    Missing quotes cause a syntax error, preventing Terraform from parsing the file.
  3. Final Answer:

    Missing quotes around the instance_type value causes a syntax error. -> Option D
  4. Quick Check:

    Strings need quotes in Terraform [OK]
Hint: Always quote string values in Terraform resource blocks [OK]
Common Mistakes:
  • Ignoring missing quotes around strings
  • Thinking resource names cause syntax errors
  • Expecting commands inside resource blocks
5. You want to create a cloud infrastructure using Terraform declarative IaC. Which approach best fits this goal?
hard
A. Write a Terraform configuration file describing the desired resources and run terraform apply.
B. Write a script with commands to create each resource step-by-step manually.
C. Manually create resources in the cloud console, then import them into Terraform.
D. Use a shell script to run cloud CLI commands in order.

Solution

  1. Step 1: Understand declarative IaC goal

    Declarative IaC means describing the final infrastructure state in configuration files.
  2. Step 2: Identify Terraform usage

    Terraform uses configuration files to declare resources, then applies changes automatically.
  3. Final Answer:

    Write a Terraform configuration file describing the desired resources and run terraform apply. -> Option A
  4. Quick Check:

    Declarative IaC = config files + apply [OK]
Hint: Use Terraform config files, not manual scripts, for declarative IaC [OK]
Common Mistakes:
  • Confusing declarative IaC with manual scripting
  • Thinking manual cloud console use is declarative
  • Using imperative CLI commands instead of config files