Bird
Raised Fist0
Terraformcloud~5 mins

Why resources are Terraform's core - Why It Works

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
Terraform manages infrastructure by defining resources that represent real-world components like servers or databases. Resources are the main building blocks that Terraform creates, updates, and deletes to match your desired setup.
When you want to create a virtual machine in the cloud to run your application
When you need to set up a database instance for storing your app data
When you want to configure a network with subnets and firewalls for security
When you need to manage cloud storage buckets for your files
When you want to automate the setup of any cloud service or infrastructure component
Config File - main.tf
main.tf
provider "aws" {
  region = "us-east-1"
}

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

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

The provider block tells Terraform which cloud to use and where.

The resource block defines a virtual machine (EC2 instance) with a specific image and size.

Terraform uses this resource to create and manage the server in the cloud.

Commands
This command sets up Terraform in your folder by downloading the necessary plugins for AWS. It prepares Terraform to work with your configuration.
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. It previews creating the EC2 instance without making any changes 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_instance.example will be created + resource "aws_instance" "example" { + ami = "ami-0c55b159cbfafe1f0" + instance_type = "t2.micro" + tags = { + "Name" = "example-instance" } } Plan: 1 to add, 0 to change, 0 to destroy. ───────────────────────────────────────────────────────────────────────────── Note: You didn't specify an "-out" parameter to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" later.
This command applies the changes to create the EC2 instance. The flag skips the confirmation prompt to speed up the process.
Terminal
terraform apply -auto-approve
Expected OutputExpected
aws_instance.example: Creating... aws_instance.example: Still creating... [10s elapsed] aws_instance.example: Creation complete after 20s [id=i-0abcd1234efgh5678] Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
→
-auto-approve - Skips manual approval to apply changes immediately
This command displays the current state of the infrastructure Terraform manages, showing details of the created EC2 instance.
Terminal
terraform show
Expected OutputExpected
aws_instance.example: id = i-0abcd1234efgh5678 ami = ami-0c55b159cbfafe1f0 instance_type = t2.micro tags = { Name = example-instance }
Key Concept

If you remember nothing else from this pattern, remember: resources are the real things Terraform creates and manages to build your infrastructure.

Common Mistakes
Writing a resource block with missing required fields like AMI or instance type
Terraform cannot create the resource without essential information, causing errors during apply
Always include all required fields for each resource type as documented
Running terraform apply before terraform init
Terraform needs to download provider plugins first; skipping init causes errors
Always run terraform init first to prepare the working directory
Not running terraform plan before apply
You miss the chance to review changes, which can lead to unexpected infrastructure updates
Run terraform plan to preview changes before applying
Summary
Define resources in Terraform files to represent real infrastructure components.
Use terraform init to prepare Terraform and download providers.
Use terraform plan to preview changes and terraform apply to create or update resources.

Practice

(1/5)
1. What is the main role of a resource in Terraform?
easy
A. It defines what cloud or system object Terraform will create or manage.
B. It stores variables for Terraform configurations.
C. It runs scripts during deployment.
D. It controls user access permissions.

Solution

  1. Step 1: Understand Terraform's purpose

    Terraform manages infrastructure by creating or updating real-world objects like servers or databases.
  2. Step 2: Identify the role of resources

    Resources tell Terraform exactly which objects to create or manage in the cloud or system.
  3. Final Answer:

    It defines what cloud or system object Terraform will create or manage. -> Option A
  4. Quick Check:

    Resources = Define infrastructure objects [OK]
Hint: Resources = real cloud objects Terraform manages [OK]
Common Mistakes:
  • Confusing resources with variables
  • Thinking resources run scripts
  • Assuming resources control permissions
2. Which of the following is the correct syntax to declare an AWS EC2 instance resource in Terraform?
easy
A. resource "aws_instance" "example" { ami = "ami-123456" instance_type = "t2.micro" }
B. resource aws_instance example { ami = "ami-123456" instance_type = "t2.micro" }
C. resource "aws_instance" example { ami = "ami-123456" instance_type = "t2.micro" }
D. resource "aws_instance" "example" ( ami = "ami-123456", instance_type = "t2.micro" )

Solution

  1. Step 1: Recall Terraform resource syntax

    Terraform resource blocks require the keyword resource, followed by the resource type and name in quotes, then a block with settings.
  2. Step 2: Check each option

    resource "aws_instance" "example" { ami = "ami-123456" instance_type = "t2.micro" } correctly uses quotes around type and name, and curly braces for settings. Others miss quotes or use wrong brackets.
  3. Final Answer:

    resource "aws_instance" "example" { ami = "ami-123456" instance_type = "t2.micro" } -> Option A
  4. Quick Check:

    Correct resource syntax uses quotes and braces [OK]
Hint: Resource type and name must be in quotes with braces [OK]
Common Mistakes:
  • Omitting quotes around resource type or name
  • Using parentheses instead of braces
  • Missing commas or wrong separators
3. Given this Terraform resource snippet:
resource "aws_s3_bucket" "mybucket" {
  bucket = "my-unique-bucket-123"
  acl    = "private"
}

What will Terraform do when applying this configuration?
medium
A. Create a new S3 bucket named 'mybucket' with public access.
B. Delete any existing S3 bucket named 'mybucket'.
C. Update the ACL of all S3 buckets to 'private'.
D. Create a new S3 bucket named 'my-unique-bucket-123' with private access.

Solution

  1. Step 1: Read the resource block details

    The resource is an AWS S3 bucket named 'mybucket' in Terraform, with bucket name 'my-unique-bucket-123' and ACL set to 'private'.
  2. Step 2: Understand Terraform behavior

    Terraform will create or manage the bucket named 'my-unique-bucket-123' with the specified ACL. It does not delete unrelated buckets or change all buckets.
  3. Final Answer:

    Create a new S3 bucket named 'my-unique-bucket-123' with private access. -> Option D
  4. Quick Check:

    Resource defines exact object and settings [OK]
Hint: Resource name is internal; bucket attribute is actual bucket name [OK]
Common Mistakes:
  • Confusing resource name with actual bucket name
  • Thinking it deletes buckets
  • Assuming ACL is public by default
4. You wrote this Terraform resource:
resource "aws_instance" "web" {
  ami = "ami-abc123"
  instance_type = t2.micro
}

What is the error in this configuration?
medium
A. The AMI ID is missing.
B. The instance_type value should be in quotes.
C. The resource name "web" should not be in quotes.
D. The resource type aws_instance is invalid.

Solution

  1. Step 1: Check the instance_type attribute

    The value t2.micro is a string and must be enclosed in quotes in Terraform.
  2. Step 2: Verify other parts

    The resource type and name are correctly quoted. The AMI ID is present as "ami-abc123".
  3. Final Answer:

    The instance_type value should be in quotes. -> Option B
  4. Quick Check:

    String values need quotes in Terraform [OK]
Hint: String values always need quotes in resource blocks [OK]
Common Mistakes:
  • Forgetting quotes around string values
  • Misquoting resource names or types
  • Assuming AMI ID is optional
5. You want to create two AWS EC2 instances with different names but the same AMI and instance type using Terraform resources. Which approach correctly uses resources to achieve this?
hard
A. Use a variable to store the AMI and instance_type, but only one resource block with one name.
B. Define one resource block and try to assign two names separated by a comma.
C. Define two separate resource blocks with different names but same AMI and instance_type values.
D. Create one resource block and duplicate it manually in the same file with the same name.

Solution

  1. Step 1: Understand resource uniqueness

    Each resource block must have a unique name to represent a distinct object Terraform manages.
  2. Step 2: Check options for creating multiple instances

    Define two separate resource blocks with different names but same AMI and instance_type values correctly defines two resource blocks with different names but same settings. Others either reuse names or misuse syntax.
  3. Final Answer:

    Define two separate resource blocks with different names but same AMI and instance_type values. -> Option C
  4. Quick Check:

    Unique resource names needed for multiple objects [OK]
Hint: Use unique resource names for each object [OK]
Common Mistakes:
  • Trying to assign multiple names in one resource
  • Duplicating resource blocks with same name
  • Using variables but only one resource block