Bird
Raised Fist0
Terraformcloud~30 mins

Module sources (local, registry, git) in Terraform - Mini Project: Build & Apply

Choose your learning style10 modes available
Using Terraform Module Sources: Local, Registry, and Git
📖 Scenario: You are managing infrastructure with Terraform. You want to reuse code by using modules from different sources: a local folder, the Terraform Registry, and a Git repository.
🎯 Goal: Build a Terraform configuration that uses three modules: one from a local path, one from the Terraform Registry, and one from a Git repository. This will help you organize and reuse your infrastructure code efficiently.
📋 What You'll Learn
Create a Terraform configuration file named main.tf.
Add a module named local_module sourced from a local folder ./modules/local_module.
Add a module named registry_module sourced from the Terraform Registry terraform-aws-modules/vpc/aws with version 3.14.2.
Add a module named git_module sourced from a Git repository https://github.com/hashicorp/example.git using the main branch.
💡 Why This Matters
🌍 Real World
Terraform modules help organize and reuse infrastructure code efficiently across projects and teams. Using different module sources allows flexibility in managing infrastructure components.
💼 Career
Understanding how to use modules from local paths, registries, and Git repositories is essential for infrastructure engineers and DevOps professionals working with Terraform.
Progress0 / 4 steps
1
Create the initial Terraform configuration with a local module source
Create a file named main.tf and add a module block named local_module with the source set to ./modules/local_module.
Terraform
Hint

Use the module block with the exact name local_module and set source to ./modules/local_module.

2
Add a module from the Terraform Registry
In main.tf, add a module block named registry_module with the source set to terraform-aws-modules/vpc/aws and version set to 3.14.2.
Terraform
Hint

Use the exact module name registry_module, set source to the registry path, and specify version as 3.14.2.

3
Add a module sourced from a Git repository
In main.tf, add a module block named git_module with the source set to git::https://github.com/hashicorp/example.git?ref=main.
Terraform
Hint

Use the exact module name git_module and set source to the Git URL with git:: prefix and ?ref=main to specify the branch.

4
Complete the Terraform configuration with required Terraform block
Add a terraform block at the top of main.tf specifying required_version as >= 1.0.0 and a required_providers block with aws provider source hashicorp/aws and version ~> 4.0.
Terraform
Hint

Start your file with a terraform block specifying the required Terraform version and the AWS provider source and version.

Practice

(1/5)
1. What does the source argument specify in a Terraform module block?
easy
A. The location where Terraform finds the module code
B. The version of Terraform to use
C. The cloud provider for the module
D. The output variables of the module

Solution

  1. Step 1: Understand the role of source in a module

    The source argument tells Terraform where to get the module code from, such as a local folder, registry, or Git repo.
  2. Step 2: Identify what source does not specify

    It does not specify Terraform version, cloud provider, or outputs; those are separate configurations.
  3. Final Answer:

    The location where Terraform finds the module code -> Option A
  4. Quick Check:

    Module source = module location [OK]
Hint: Remember: source means 'where to get the module' [OK]
Common Mistakes:
  • Confusing source with Terraform version
  • Thinking source defines outputs
  • Assuming source sets cloud provider
2. Which of the following is the correct syntax to use a local module located in a folder named modules/network?
easy
A. module "net" { source = "modules/network" }
B. module "net" { source = "registry/modules/network" }
C. module "net" { source = "git::https://example.com/network.git" }
D. module "net" { source = "network" }

Solution

  1. Step 1: Identify local module source syntax

    Local modules use a relative or absolute path as the source. Here, "modules/network" is a relative path.
  2. Step 2: Check other options for correctness

    module "net" { source = "registry/modules/network" } uses registry syntax incorrectly; module "net" { source = "git::https://example.com/network.git" } is for Git sources; module "net" { source = "network" } lacks the folder path.
  3. Final Answer:

    module "net" { source = "modules/network" } -> Option A
  4. Quick Check:

    Local module source = folder path [OK]
Hint: Local modules use folder paths as source [OK]
Common Mistakes:
  • Using registry or git syntax for local modules
  • Omitting folder path in source
  • Confusing source with module name
3. Given this module block:
module "web" {
  source = "git::https://github.com/example/terraform-web.git"
  version = "v1.0.0"
}

What will Terraform do when you run terraform init?
medium
A. Download the module from the local folder named terraform-web
B. Download the module from the Terraform Registry
C. Clone the Git repository at the given URL and checkout version v1.0.0
D. Fail because version is not supported for Git sources

Solution

  1. Step 1: Understand Git source syntax in Terraform

    The source starting with "git::" tells Terraform to clone a Git repository from the URL.
  2. Step 2: Interpret the version argument with Git sources

    The version here refers to a Git tag or branch to checkout, so Terraform will checkout "v1.0.0" after cloning.
  3. Final Answer:

    Clone the Git repository at the given URL and checkout version v1.0.0 -> Option C
  4. Quick Check:

    Git source + version = clone and checkout tag [OK]
Hint: Git source means clone repo; version is Git tag/branch [OK]
Common Mistakes:
  • Thinking version is Terraform Registry version
  • Assuming source is local folder
  • Believing version is unsupported for Git
4. You wrote this module block:
module "db" {
  source = "git::https://github.com/example/terraform-db.git"
  version = "1.0.0"
}

When running terraform init, you get an error. What is the likely cause?
medium
A. The module name 'db' is invalid
B. The version should be prefixed with 'v' like 'v1.0.0' to match Git tags
C. The source URL must be a local path for modules
D. Git URLs cannot be used as module sources

Solution

  1. Step 1: Check Git tag naming conventions

    Git tags often start with 'v' (e.g., 'v1.0.0'). If the tag is named with 'v', specifying '1.0.0' causes a mismatch.
  2. Step 2: Verify other options for errors

    Git URLs are valid sources; local path is not required; module name 'db' is valid.
  3. Final Answer:

    The version should be prefixed with 'v' like 'v1.0.0' to match Git tags -> Option B
  4. Quick Check:

    Git version tag must match exact Git tag name [OK]
Hint: Match version exactly to Git tag name (often starts with 'v') [OK]
Common Mistakes:
  • Omitting 'v' prefix in version for Git tags
  • Thinking Git URLs are invalid module sources
  • Assuming module names have strict rules
5. You want to reuse a module from the Terraform Registry named hashicorp/aws with version 4.0.0. Which is the correct module block to use?
hard
A. module "aws_module" { source = "git::https://github.com/hashicorp/aws.git" version = "4.0.0" }
B. module "aws_module" { source = "registry/hashicorp/aws" version = "4.0.0" }
C. module "aws_module" { source = "./hashicorp/aws" version = "4.0.0" }
D. module "aws_module" { source = "hashicorp/aws" version = "4.0.0" }

Solution

  1. Step 1: Identify Terraform Registry module source syntax

    Modules from the Terraform Registry use the format "namespace/module" as the source, e.g., "hashicorp/aws".
  2. Step 2: Check other options for correctness

    module "aws_module" { source = "git::https://github.com/hashicorp/aws.git" version = "4.0.0" } uses Git URL which is incorrect for Registry modules; module "aws_module" { source = "./hashicorp/aws" version = "4.0.0" } uses local path; module "aws_module" { source = "registry/hashicorp/aws" version = "4.0.0" } uses invalid prefix "registry/".
  3. Final Answer:

    module "aws_module" { source = "hashicorp/aws" version = "4.0.0" } -> Option D
  4. Quick Check:

    Registry modules use "namespace/module" source format [OK]
Hint: Registry modules use "namespace/module" as source [OK]
Common Mistakes:
  • Using Git URL for Registry modules
  • Adding extra prefixes like 'registry/'
  • Using local paths for Registry modules
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard