📖 Scenario: You are managing infrastructure using Terraform. To keep your infrastructure code organized and reusable, you use modules. Modules can have different versions, and you want to specify which version to use to ensure stability.
🎯 Goal: Learn how to specify a module source and pin its version in Terraform configuration.
📋 What You'll Learn
Create a Terraform configuration that uses a module
Specify the module source as a public Terraform Registry module
Pin the module version to a specific version number
💡 Why This Matters
🌍 Real World
Terraform modules are reusable building blocks for infrastructure. Pinning module versions ensures your infrastructure does not unexpectedly change when modules update.
💼 Career
Cloud engineers and DevOps professionals use module versioning to maintain stable and predictable infrastructure deployments.
Progress0 / 4 steps
1
Create a Terraform configuration with a module block
Create a Terraform configuration file with a module block named vpc that uses the source terraform-aws-modules/vpc/aws.
Terraform
Hint
Use the module block with the exact name vpc and set the source attribute to the module path.
2
Add a version constraint to the module
Add a version attribute to the vpc module block and set it to "3.14.0".
Terraform
Hint
Specify the exact version string using the version attribute inside the module block.
3
Add a variable to configure the module
Inside the vpc module block, add the variable name and set it to "my-vpc".
Terraform
Hint
Set the name variable inside the module block to configure the module.
4
Add Terraform required version and initialize
Add a terraform block at the top of the file specifying required_version as ">= 1.3.0" and add a required_providers block with aws provider version ">= 4.0.0".
Terraform
Hint
Use the terraform block to specify the Terraform version and provider version constraints.
Practice
(1/5)
1. What is the main purpose of specifying a version when using a Terraform module from a registry?
easy
A. To speed up Terraform plan execution
B. To enable local module usage
C. To automatically update the module to the latest version
D. To keep your infrastructure stable by locking the module version
Solution
Step 1: Understand module versioning purpose
Specifying a version locks the module to a specific release, preventing unexpected changes.
Step 2: Compare options
Only locking the version ensures stability; automatic updates or speed improvements are not guaranteed by versioning.
Final Answer:
To keep your infrastructure stable by locking the module version -> Option D
Quick Check:
Module versioning = Stability [OK]
Hint: Version locks module to prevent unexpected changes [OK]
Common Mistakes:
Thinking version speeds up execution
Assuming version auto-updates modules
Confusing local modules with versioned modules
2. Which of the following is the correct syntax to specify a module version from the Terraform Registry?
easy
A. module "example" { source = "registry/module" version = "1.2.0" }
B. module "example" { source = "registry/module" ver = "1.2.0" }
C. module "example" { source = "registry/module" version: "1.2.0" }
D. module "example" { source = "registry/module" v = "1.2.0" }
Solution
Step 1: Recall correct version attribute
The correct attribute to specify module version is version with an equals sign.
Step 2: Check syntax correctness
module "example" { source = "registry/module" version = "1.2.0" } uses correct attribute and syntax; others use incorrect attribute names or syntax.
Final Answer:
module "example" { source = "registry/module" version = "1.2.0" } -> Option A
Quick Check:
Correct attribute is version = "x.y.z" [OK]
Hint: Use 'version = "x.y.z"' exactly for module versions [OK]
Common Mistakes:
Using 'ver' or 'v' instead of 'version'
Using colon instead of equals sign
Omitting quotes around version number
3. Given this Terraform module block:
module "network" {
source = "terraform-aws-modules/vpc/aws"
version = "3.0.0"
}
What happens if a newer version 3.1.0 is released and you run terraform init without changing the version?
medium
A. Terraform upgrades the module to version 3.1.0 automatically
B. Terraform uses version 3.0.0 and does not upgrade automatically
C. Terraform throws an error about version mismatch
D. Terraform ignores the version and uses the latest
Solution
Step 1: Understand version locking behavior
Specifying version "3.0.0" locks the module to that exact version.
Step 2: Effect of terraform init
Running terraform init downloads the locked version; it does not upgrade unless version is changed.
Final Answer:
Terraform uses version 3.0.0 and does not upgrade automatically -> Option B
Quick Check:
Locked version stays fixed until changed [OK]
Hint: Locked version stays fixed unless manually updated [OK]
You want to use a specific version tag v1.4.2. What is missing?
medium
A. Add tag = "v1.4.2" inside the block
B. Add version = "v1.4.2" inside the block
C. Add ?ref=v1.4.2 to the source URL
D. Nothing, it uses latest by default
Solution
Step 1: Understand versioning for Git modules
Git modules use URL query parameter ?ref= to specify version or tag.
Step 2: Identify correct way to specify tag
Adding ?ref=v1.4.2 to source URL locks module to that tag.
Final Answer:
Add ?ref=v1.4.2 to the source URL -> Option C
Quick Check:
Git module version = source URL + ?ref=tag [OK]
Hint: Use ?ref=tag in Git source URL for versioning [OK]
Common Mistakes:
Using version attribute for Git modules
Using tag attribute which does not exist
Assuming latest is always used without specifying ref
5. You have a local module at ./modules/app and a remote module from the registry. You want to ensure only the remote module uses versioning. How should you configure the modules?
hard
A. Specify version only for the remote module; omit for local module
B. Specify version for both local and remote modules
C. Specify version only for the local module
D. Omit version for both modules
Solution
Step 1: Recall versioning rules for local modules
Local modules do not support versioning; version attribute is ignored or causes error.
Step 2: Apply version only to remote modules
Only remote modules from registries or Git support versioning and require version locking.
Final Answer:
Specify version only for the remote module; omit for local module -> Option A
Quick Check:
Version only for remote modules [OK]
Hint: Version attribute only for remote modules, never local [OK]
Common Mistakes:
Adding version to local modules causing errors
Omitting version for remote modules causing instability
Confusing local and remote module versioning rules
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.