Bird
Raised Fist0
Terraformcloud~5 mins

Resource block syntax in Terraform - Commands & Configuration

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 uses resource blocks to define infrastructure components like servers or databases. Each block tells Terraform what to create and how to configure it.
When you want to create a virtual machine in the cloud with specific settings.
When you need to set up a storage bucket to hold files for your application.
When you want to define a network with certain rules and subnets.
When you need to manage DNS records for your website.
When you want to automate creating and updating cloud resources consistently.
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 sets the cloud provider and region.

The resource block defines an AWS EC2 instance with a specific AMI and instance type.

The tags section adds a name label to the instance for easy identification.

Commands
This command initializes the Terraform working directory. It downloads the provider plugins needed to create resources.
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 before making any changes. It previews the resources to be created.
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" + arn = (known after apply) + instance_type = "t2.micro" + tags = { + "Name" = "example-instance" } } Plan: 1 to add, 0 to change, 0 to destroy.
This command applies the changes to create the resources defined in the configuration. The flag skips the confirmation prompt.
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 manual approval to apply changes immediately
This command displays the current state of the resources Terraform manages, showing details of the created infrastructure.
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: a resource block in Terraform defines one piece of infrastructure with its settings.

Common Mistakes
Forgetting to specify the resource type or name inside the resource block.
Terraform cannot identify what resource to create or how to reference it later.
Always include both the resource type and a unique name, like resource "aws_instance" "example".
Using incorrect or missing required arguments inside the resource block.
Terraform will fail to plan or apply because it lacks necessary information to create the resource.
Check the provider documentation for required arguments and include them all.
Not running terraform init before terraform plan or apply.
Terraform won't have the provider plugins downloaded and will error out.
Always run terraform init first to prepare the working directory.
Summary
Define infrastructure components using resource blocks with a type and name.
Initialize Terraform with terraform init to download providers.
Use terraform plan to preview changes and terraform apply to create resources.
Check created resources with terraform show.

Practice

(1/5)
1. What is the correct way to start a resource block in Terraform?
easy
A. resource "aws_instance" { example }
B. resource aws_instance example { }
C. resource "example" "aws_instance" { }
D. resource "aws_instance" "example" { }

Solution

  1. Step 1: Understand resource block syntax

    A resource block starts with the keyword resource, followed by the resource type in quotes, then the resource name in quotes.
  2. Step 2: Match the correct syntax

    resource "aws_instance" "example" { } correctly uses resource "aws_instance" "example" { }, which matches the required syntax.
  3. Final Answer:

    resource "aws_instance" "example" { } -> Option D
  4. Quick Check:

    Resource block syntax = resource "type" "name" { } [OK]
Hint: Resource block always uses resource "type" "name" [OK]
Common Mistakes:
  • Omitting quotes around type or name
  • Swapping type and name order
  • Using braces incorrectly
2. Which of the following is a valid property assignment inside a Terraform resource block?
easy
A. instance_type = t2.micro
B. instance_type => "t2.micro"
C. instance_type = "t2.micro"
D. instance_type: "t2.micro"

Solution

  1. Step 1: Identify correct property syntax

    Terraform uses = to assign values, and string values must be in quotes.
  2. Step 2: Check each option

    instance_type = "t2.micro" uses instance_type = "t2.micro", which is correct. instance_type = t2.micro misses quotes, B and C use invalid assignment symbols.
  3. Final Answer:

    instance_type = "t2.micro" -> Option C
  4. Quick Check:

    Property assignment uses = and quotes for strings [OK]
Hint: Use = and quotes for string values inside resource blocks [OK]
Common Mistakes:
  • Forgetting quotes around string values
  • Using colon or arrow instead of =
  • Missing equal sign
3. Given this resource block snippet, what will Terraform create?
resource "aws_s3_bucket" "mybucket" {
  bucket = "my-unique-bucket-123"
  acl    = "private"
}
medium
A. An S3 bucket named "mybucket" with public access
B. An S3 bucket named "my-unique-bucket-123" with private access
C. An S3 bucket named "aws_s3_bucket" with private access
D. A storage container with default public access

Solution

  1. Step 1: Identify resource type and name

    The resource type is aws_s3_bucket, and the resource name is mybucket. The bucket property sets the actual bucket name.
  2. Step 2: Understand properties

    The bucket property sets the bucket's real name to "my-unique-bucket-123". The acl is set to "private", meaning no public access.
  3. Final Answer:

    An S3 bucket named "my-unique-bucket-123" with private access -> Option B
  4. Quick Check:

    Bucket name = property value, ACL = private [OK]
Hint: Bucket name is from bucket property, not resource name [OK]
Common Mistakes:
  • Confusing resource name with actual bucket name
  • Assuming default ACL is public
  • Ignoring property values inside the block
4. Identify the error in this Terraform resource block:
resource "aws_instance" "web" {
  ami = "ami-123456"
  instance_type = t2.micro
}
medium
A. Missing quotes around the instance_type value
B. Resource block missing closing brace
C. Incorrect resource type name
D. Missing resource name

Solution

  1. Step 1: Check property value syntax

    The instance_type property value t2.micro is missing quotes, which is required for string values.
  2. Step 2: Verify block structure

    The resource block has correct braces and resource type/name, so no errors there.
  3. Final Answer:

    Missing quotes around the instance_type value -> Option A
  4. Quick Check:

    String values must be quoted [OK]
Hint: Always quote string values inside resource blocks [OK]
Common Mistakes:
  • Forgetting quotes around string properties
  • Assuming braces are optional
  • Mixing resource type and name order
5. You want to create two AWS EC2 instances with different names but the same AMI and instance type using resource blocks. Which is the best way to write this in Terraform?
hard
A.
resource "aws_instance" "web1" {
  ami = "ami-abc123"
  instance_type = "t2.micro"
}
resource "aws_instance" "web2" {
  ami = "ami-abc123"
  instance_type = "t2.micro"
}
B.
resource "aws_instance" "web" {
  count = 2
  ami = "ami-abc123"
  instance_type = "t2.micro"
}
C.
resource "aws_instance" "web" {
  ami = "ami-abc123"
  instance_type = "t2.micro"
  name = ["web1", "web2"]
}
D.
resource "aws_instance" "web" {
  ami = "ami-abc123"
  instance_type = "t2.micro"
  for_each = ["web1", "web2"]
}

Solution

  1. Step 1: Understand resource naming and duplication

    Each resource block must have a unique name.
    resource "aws_instance" "web1" {
      ami = "ami-abc123"
      instance_type = "t2.micro"
    }
    resource "aws_instance" "web2" {
      ami = "ami-abc123"
      instance_type = "t2.micro"
    }
    defines two separate resources with different names.
  2. Step 2: Evaluate other options

    resource "aws_instance" "web" {
      count = 2
      ami = "ami-abc123"
      instance_type = "t2.micro"
    }
    uses count but does not differentiate names.
    resource "aws_instance" "web" {
      ami = "ami-abc123"
      instance_type = "t2.micro"
      name = ["web1", "web2"]
    }
    tries to assign a list to name property, which is invalid.
    resource "aws_instance" "web" {
      ami = "ami-abc123"
      instance_type = "t2.micro"
      for_each = ["web1", "web2"]
    }
    uses for_each incorrectly without mapping names.
  3. Final Answer:

    Define two separate resource blocks with unique names -> Option A
  4. Quick Check:

    Unique resource names needed for multiple instances [OK]
Hint: Use separate resource blocks with unique names for multiple instances [OK]
Common Mistakes:
  • Using count without unique names
  • Assigning list to single property
  • Misusing for_each without proper keys