Bird
Raised Fist0
Terraformcloud~5 mins

Creating your first resource in Terraform - Step-by-Step CLI 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
Introduction
When you want to build infrastructure using code, you start by defining resources. Terraform lets you write simple files to create things like servers or storage automatically.
When you want to launch a virtual server in the cloud without clicking in a web console.
When you need to create a storage bucket to save files for your app.
When you want to set up a database instance quickly and repeatably.
When you want to manage your infrastructure in a safe, trackable way using code.
When you want to share your infrastructure setup with teammates easily.
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_s3_bucket" "my_bucket" {
  bucket = "example-terraform-bucket-12345"
  acl    = "private"
}

This file tells Terraform to use the AWS provider in the us-east-1 region.

The aws_s3_bucket resource creates a new S3 bucket named example-terraform-bucket-12345 with private access.

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 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 required for your infrastructure.
This command shows what Terraform will do before making any changes. It helps you check that your resource will be created as expected.
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.my_bucket will be created + resource "aws_s3_bucket" "my_bucket" { + acl = "private" + bucket = "example-terraform-bucket-12345" + force_destroy = false + id = (known after apply) + region = (known after apply) } 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 that exactly these actions will be performed if "terraform apply" is subsequently run.
This command creates the S3 bucket as defined in your file. The flag skips the manual approval step to speed up the process.
Terminal
terraform apply -auto-approve
Expected OutputExpected
aws_s3_bucket.my_bucket: Creating... aws_s3_bucket.my_bucket: Creation complete after 2s [id=example-terraform-bucket-12345] Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
→
-auto-approve - Skips asking for confirmation before applying changes
This command displays the current state of your infrastructure as Terraform knows it, confirming your bucket was created.
Terminal
terraform show
Expected OutputExpected
aws_s3_bucket.my_bucket: id = example-terraform-bucket-12345 arn = arn:aws:s3:::example-terraform-bucket-12345 bucket = example-terraform-bucket-12345 acl = private region = us-east-1
Key Concept

If you remember nothing else from this pattern, remember: Terraform uses simple files to describe resources, then commands to create and check them safely.

Common Mistakes
Not running 'terraform init' before other commands
Terraform needs to download provider plugins first; without init, commands fail.
Always run 'terraform init' once before planning or applying.
Using a bucket name that already exists globally
S3 bucket names must be unique worldwide; duplicate names cause errors.
Choose a unique bucket name, often by adding random numbers or your company name.
Running 'terraform apply' without reviewing the plan
You might create or change resources unintentionally.
Run 'terraform plan' first to see what will happen, then apply.
Summary
Write a Terraform file describing the resource you want to create.
Run 'terraform init' to prepare Terraform and download providers.
Use 'terraform plan' to preview changes before applying.
Run 'terraform apply' to create the resource in your cloud account.
Use 'terraform show' to see the current state of your resources.

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