Bird
Raised Fist0
Terraformcloud~10 mins

Creating your first resource in Terraform - Visual Walkthrough

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
Process Flow - Creating your first resource
Write resource block
↓
Run terraform init
↓
Run terraform plan
↓
Review plan output
↓
Run terraform apply
↓
Resource created in cloud
↓
Run terraform show or state
↓
Verify resource exists
You write a resource block, initialize Terraform, plan the changes, apply them to create the resource, then verify it exists.
Execution Sample
Terraform
resource "aws_s3_bucket" "my_bucket" {
  bucket = "my-unique-bucket-12345"
  acl    = "private"
}
This code creates a private S3 bucket named 'my-unique-bucket-12345' in AWS.
Process Table
StepCommand/ActionTerraform Output/StateResult
1Write resource block in main.tfFile saved with resource definitionResource definition ready
2terraform initInitializes backend and providersTerraform ready to run plans
3terraform planShows plan to create aws_s3_bucket.my_bucketPlan shows resource will be created
4terraform applyApplies plan, creates S3 bucketS3 bucket created in AWS
5terraform showDisplays current state with aws_s3_bucket.my_bucketConfirms resource exists
6terraform state listLists resources in stateaws_s3_bucket.my_bucket listed
7terraform apply againNo changes detectedNo resources changed, idempotent
💡 No changes after first apply, resource exists and Terraform state is up to date
Status Tracker
VariableStartAfter Step 3After Step 4Final
aws_s3_bucket.my_bucketundefinedplanned for creationcreated with IDexists in state
Key Moments - 3 Insights
Why does terraform plan show changes before apply?
Because terraform plan compares current state (empty at first) with desired config and shows what will be created, as seen in step 3 of execution_table.
What happens if you run terraform apply again without changes?
Terraform detects no changes needed and does nothing, showing 'No changes detected' as in step 7 of execution_table.
How do you verify the resource was created?
By running terraform show or terraform state list (steps 5 and 6), which confirm the resource exists in the state.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what does terraform plan show at step 3?
AResource will be destroyed
BNo changes needed
CResource aws_s3_bucket.my_bucket will be created
DError in configuration
💡 Hint
Check the 'Terraform Output/State' column at step 3 in execution_table
At which step does Terraform actually create the S3 bucket?
AStep 2
BStep 4
CStep 3
DStep 5
💡 Hint
Look for 'Applies plan, creates S3 bucket' in the 'Command/Action' column
If you change the bucket name in the resource block and run terraform apply again, what will happen?
ATerraform will create a new bucket and delete the old one
BTerraform will ignore the change
CTerraform will update the existing bucket name in place
DTerraform will fail with an error
💡 Hint
Changing bucket name is a resource replacement, so terraform plans to create new and delete old (related to step 3 plan behavior)
Concept Snapshot
Terraform resource creation steps:
1. Write resource block in .tf file
2. Run 'terraform init' to prepare
3. Run 'terraform plan' to see changes
4. Run 'terraform apply' to create resource
5. Verify with 'terraform show' or 'terraform state list'
Terraform is idempotent: repeated apply with no changes does nothing.
Full Transcript
Creating your first resource with Terraform involves writing a resource block in a configuration file, initializing Terraform with 'terraform init', planning the changes with 'terraform plan', applying those changes with 'terraform apply', and verifying the resource exists using 'terraform show' or 'terraform state list'. The plan step shows what Terraform will do before it does it. After applying, Terraform records the resource in its state. Running apply again without changes results in no action, demonstrating idempotency.

Practice

(1/5)
1. What is the main purpose of a resource block in Terraform?
easy
A. To write a script to run on a server
B. To define a cloud component to create and manage
C. To store variables for reuse
D. To output values after deployment

Solution

  1. Step 1: Understand Terraform resource blocks

    A resource block tells Terraform what cloud component to create, like a server or database.
  2. Step 2: Differentiate resource from other blocks

    Variables store data, outputs show results, scripts run commands. Only resource creates infrastructure.
  3. Final Answer:

    To define a cloud component to create and manage -> Option B
  4. Quick Check:

    Resource block = cloud component definition [OK]
Hint: Resource blocks create cloud parts, not scripts or variables [OK]
Common Mistakes:
  • Confusing resource with variable or output blocks
  • Thinking resource runs code on servers
  • Assuming resource stores data only
2. Which of the following is the correct syntax to create an AWS S3 bucket resource named my_bucket in Terraform?
easy
A. resource "my_bucket" "aws_s3_bucket" {}
B. resource aws_s3_bucket my_bucket {}
C. resource "aws_s3_bucket" {}
D. resource "aws_s3_bucket" "my_bucket" {}

Solution

  1. Step 1: Recall Terraform resource syntax

    The syntax is: resource "resource_type" "resource_name" { ... } with quotes around type and name.
  2. Step 2: Match correct syntax

    resource "aws_s3_bucket" "my_bucket" {} matches this exactly with resource type aws_s3_bucket and name my_bucket in quotes.
  3. Final Answer:

    resource "aws_s3_bucket" "my_bucket" {} -> Option D
  4. Quick Check:

    Correct resource syntax uses quotes for type and name [OK]
Hint: Resource type and name must be in quotes inside resource block [OK]
Common Mistakes:
  • Omitting quotes around resource type or name
  • Swapping resource type and name order
  • Leaving resource name empty
3. Given this Terraform resource block:
resource "aws_instance" "example" {
  ami           = "ami-123456"
  instance_type = "t2.micro"
}

What will Terraform do when you run terraform apply?
medium
A. Output the AMI ID without creating resources
B. Delete all EC2 instances in the account
C. Create an AWS EC2 instance with the specified AMI and type
D. Create an S3 bucket named example

Solution

  1. Step 1: Identify resource type and attributes

    The resource is aws_instance named example with AMI and instance type set.
  2. Step 2: Understand Terraform apply behavior

    Terraform will create the EC2 instance with given AMI and instance type when applied.
  3. Final Answer:

    Create an AWS EC2 instance with the specified AMI and type -> Option C
  4. Quick Check:

    Resource block creates EC2 instance as defined [OK]
Hint: Resource type aws_instance creates EC2 instances [OK]
Common Mistakes:
  • Confusing resource type with S3 bucket
  • Thinking terraform apply deletes resources by default
  • Assuming terraform only outputs values
4. You wrote this Terraform resource:
resource "aws_s3_bucket" "mybucket" {
  bucket = mybucket
}

When running terraform plan, you get an error. What is the problem?
medium
A. The bucket name must be a quoted string, not a bare word
B. Resource type aws_s3_bucket does not exist
C. Resource name cannot be mybucket
D. Missing required provider block

Solution

  1. Step 1: Check bucket attribute syntax

    The bucket attribute expects a string value, so it must be in quotes like "mybucket".
  2. Step 2: Identify error cause

    Using bare word mybucket without quotes causes syntax error in Terraform.
  3. Final Answer:

    The bucket name must be a quoted string, not a bare word -> Option A
  4. Quick Check:

    String values require quotes in Terraform config [OK]
Hint: Always quote string values in resource attributes [OK]
Common Mistakes:
  • Forgetting quotes around string values
  • Assuming resource name restrictions cause error
  • Thinking provider block is missing for this error
5. You want to create two AWS EC2 instances with Terraform using the same configuration but different names. Which is the best way to do this?
hard
A. Use a resource block with a count or for_each to create multiple instances
B. Use a single resource block with a list of names in the bucket attribute
C. Create one resource block and duplicate it manually in the config file
D. Write two separate resource blocks with different names

Solution

  1. Step 1: Understand multiple resource creation methods

    You can create multiple similar resources by repeating blocks or using count/for_each.
  2. Step 2: Identify best practice

    Using count or for_each is efficient and scalable compared to manual duplication or separate blocks.
  3. Final Answer:

    Use a resource block with a count or for_each to create multiple instances -> Option A
  4. Quick Check:

    count/for_each = best for multiple similar resources [OK]
Hint: Use count or for_each for multiple similar resources [OK]
Common Mistakes:
  • Manually duplicating resource blocks causes errors
  • Trying to pass list to unrelated attribute
  • Not using count or for_each for multiple resources