Here’s a comprehensive tutorial on all valid Terraform module "source"
Git URL patterns, with clear examples (no Drivemode references), so you can master using modules from GitHub, GitLab, Bitbucket, and private repos.
✅ Terraform source
for Modules from Git: All Patterns & Examples
Terraform supports loading modules from Git repositories using either HTTPS, SSH, or GitHub short syntax. Below are all common patterns with examples.
🔹 1. GitHub (HTTPS)
Use this when you don’t want SSH keys or are using public repos.
module "vpc" {
source = "git::https://github.com/terraform-aws-modules/terraform-aws-vpc.git"
}
Code language: JavaScript (javascript)
✅ With Subdirectory
module "s3" {
source = "git::https://github.com/your-org/terraform-modules.git//modules/s3_bucket"
}
Code language: JavaScript (javascript)
✅ With Tag / Branch
source = "git::https://github.com/your-org/terraform-modules.git//modules/s3_bucket?ref=v1.2.0"
source = "git::https://github.com/your-org/terraform-modules.git//modules/s3_bucket?ref=main"
Code language: JavaScript (javascript)
🔹 2. GitHub (SSH)
Use SSH if you’re pulling private modules using a deploy key or SSH agent.
module "eks" {
source = "git::ssh://git@github.com/your-org/terraform-modules.git//modules/eks_cluster?ref=main"
}
Code language: JavaScript (javascript)
✅ Use
git::ssh://
for SSH – don’t use rawgit@github.com
.
🔹 3. GitHub (Short Syntax – Only for Public Modules)
module "vpc" {
source = "github.com/terraform-aws-modules/terraform-aws-vpc"
}
Code language: JavaScript (javascript)
⚠️ This works only for the root of the repo (no subdirectories, no tags).
🔹 4. GitLab (HTTPS)
module "firewall" {
source = "git::https://gitlab.com/your-org/infra-modules.git//firewall?ref=main"
}
Code language: JavaScript (javascript)
🔹 5. Bitbucket (HTTPS)
module "app" {
source = "git::https://bitbucket.org/your-team/terraform-modules.git//modules/app?ref=release-1.0"
}
Code language: JavaScript (javascript)
🔹 6. Private Git Repos (with SSH)
module "db" {
source = "git::ssh://git@bitbucket.org/your-org/terraform-db-modules.git//rds?ref=main"
}
Code language: JavaScript (javascript)
- Make sure your runner (Terraform Cloud or CI) has access via SSH key.
- Can also use
.netrc
orGIT_ASKPASS
for HTTPS auth in private repos.
📦 Structure of a Terraform Git Source URL
git::<protocol>://<host>/<repo>.git//<subdir>?ref=<branch|tag|commit>
Code language: HTML, XML (xml)
Part | Example |
---|---|
git:: prefix | tells Terraform to treat it as a Git source |
https:// or ssh:// | Git protocol |
//modules/x | points to subdirectory inside the repo |
?ref= | tag, branch, or commit hash |
✅ Pro Tips
Tip | Reason |
---|---|
Always pin a tag using ?ref=... | Prevents breaking changes |
Use double slashes // before module subdir | Required for subdirectory paths |
Prefer HTTPS for public or Terraform Cloud | Easier integration |
Use SSH only if you’ve configured keys properly | Avoids access errors |
🚀 Real-World Example
Let’s say you have this repo:
https://github.com/acme-corp/terraform-infra-modules
Code language: JavaScript (javascript)
With a folder structure like:
terraform-infra-modules/
├── vpc/
├── eks/
└── s3/
You can use:
module "vpc" {
source = "git::https://github.com/acme-corp/terraform-infra-modules.git//vpc?ref=v1.0.0"
}
module "eks" {
source = "git::ssh://git@github.com/acme-corp/terraform-infra-modules.git//eks?ref=main"
}
Code language: JavaScript (javascript)
I’m a DevOps/SRE/DevSecOps/Cloud Expert passionate about sharing knowledge and experiences. I have worked at Cotocus. I share tech blog at DevOps School, travel stories at Holiday Landmark, stock market tips at Stocks Mantra, health and fitness guidance at My Medic Plus, product reviews at TrueReviewNow , and SEO strategies at Wizbrand.
Do you want to learn Quantum Computing?
Please find my social handles as below;
Rajesh Kumar Personal Website
Rajesh Kumar at YOUTUBE
Rajesh Kumar at INSTAGRAM
Rajesh Kumar at X
Rajesh Kumar at FACEBOOK
Rajesh Kumar at LINKEDIN
Rajesh Kumar at WIZBRAND