{"id":49426,"date":"2025-05-22T01:48:50","date_gmt":"2025-05-22T01:48:50","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49426"},"modified":"2025-05-22T01:48:50","modified_gmt":"2025-05-22T01:48:50","slug":"terraform-source-for-modules-from-git-all-patterns-examples","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/terraform-source-for-modules-from-git-all-patterns-examples\/","title":{"rendered":"Terraform source for Modules from Git: All Patterns &amp; Examples"},"content":{"rendered":"\n<p>Here\u2019s a comprehensive <strong>tutorial on all valid Terraform <code>module \"source\"<\/code> Git URL patterns<\/strong>, with <strong>clear examples<\/strong> (no Drivemode references), so you can master using modules from <strong>GitHub<\/strong>, <strong>GitLab<\/strong>, <strong>Bitbucket<\/strong>, and <strong>private repos<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\u2705 Terraform <code>source<\/code> for Modules from Git: All Patterns &amp; Examples<\/h1>\n\n\n\n<p>Terraform supports loading modules from Git repositories using either <strong>HTTPS<\/strong>, <strong>SSH<\/strong>, or <strong>GitHub short syntax<\/strong>. Below are all common patterns with examples.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd39 1. GitHub (HTTPS)<\/h2>\n\n\n\n<p>Use this when you don&#8217;t want SSH keys or are using public repos.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">module<\/span> <span class=\"hljs-string\">\"vpc\"<\/span> {\n  source = <span class=\"hljs-string\">\"git::https:\/\/github.com\/terraform-aws-modules\/terraform-aws-vpc.git\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">\u2705 With Subdirectory<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">module<\/span> <span class=\"hljs-string\">\"s3\"<\/span> {\n  source = <span class=\"hljs-string\">\"git::https:\/\/github.com\/your-org\/terraform-modules.git\/\/modules\/s3_bucket\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">\u2705 With Tag \/ Branch<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">source = <span class=\"hljs-string\">\"git::https:\/\/github.com\/your-org\/terraform-modules.git\/\/modules\/s3_bucket?ref=v1.2.0\"<\/span>\nsource = <span class=\"hljs-string\">\"git::https:\/\/github.com\/your-org\/terraform-modules.git\/\/modules\/s3_bucket?ref=main\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd39 2. GitHub (SSH)<\/h2>\n\n\n\n<p>Use SSH if you&#8217;re pulling private modules using a deploy key or SSH agent.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">module<\/span> <span class=\"hljs-string\">\"eks\"<\/span> {\n  source = <span class=\"hljs-string\">\"git::ssh:\/\/git@github.com\/your-org\/terraform-modules.git\/\/modules\/eks_cluster?ref=main\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u2705 Use <code>git::ssh:\/\/<\/code> for <strong>SSH<\/strong> \u2013 don&#8217;t use raw <code>git@github.com<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd39 3. GitHub (Short Syntax \u2013 Only for Public Modules)<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">module<\/span> <span class=\"hljs-string\">\"vpc\"<\/span> {\n  source = <span class=\"hljs-string\">\"github.com\/terraform-aws-modules\/terraform-aws-vpc\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u26a0\ufe0f This works only for the root of the repo (no subdirectories, no tags).<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd39 4. GitLab (HTTPS)<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">module<\/span> <span class=\"hljs-string\">\"firewall\"<\/span> {\n  source = <span class=\"hljs-string\">\"git::https:\/\/gitlab.com\/your-org\/infra-modules.git\/\/firewall?ref=main\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd39 5. Bitbucket (HTTPS)<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">module<\/span> <span class=\"hljs-string\">\"app\"<\/span> {\n  source = <span class=\"hljs-string\">\"git::https:\/\/bitbucket.org\/your-team\/terraform-modules.git\/\/modules\/app?ref=release-1.0\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd39 6. Private Git Repos (with SSH)<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">module<\/span> <span class=\"hljs-string\">\"db\"<\/span> {\n  source = <span class=\"hljs-string\">\"git::ssh:\/\/git@bitbucket.org\/your-org\/terraform-db-modules.git\/\/rds?ref=main\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li>Make sure your runner (Terraform Cloud or CI) has access via SSH key.<\/li>\n\n\n\n<li>Can also use <code>.netrc<\/code> or <code>GIT_ASKPASS<\/code> for HTTPS auth in private repos.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udce6 Structure of a Terraform Git Source URL<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">git::<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">protocol<\/span>&gt;<\/span>:\/\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">host<\/span>&gt;<\/span>\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repo<\/span>&gt;<\/span>.git\/\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">subdir<\/span>&gt;<\/span>?ref=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">branch|tag|commit<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Part<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td><code>git::<\/code> prefix<\/td><td>tells Terraform to treat it as a Git source<\/td><\/tr><tr><td><code>https:\/\/<\/code> or <code>ssh:\/\/<\/code><\/td><td>Git protocol<\/td><\/tr><tr><td><code>\/\/modules\/x<\/code><\/td><td>points to subdirectory inside the repo<\/td><\/tr><tr><td><code>?ref=<\/code><\/td><td>tag, branch, or commit hash<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 Pro Tips<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Tip<\/th><th>Reason<\/th><\/tr><\/thead><tbody><tr><td>Always pin a tag using <code>?ref=...<\/code><\/td><td>Prevents breaking changes<\/td><\/tr><tr><td>Use double slashes <code>\/\/<\/code> before module subdir<\/td><td>Required for subdirectory paths<\/td><\/tr><tr><td>Prefer HTTPS for public or Terraform Cloud<\/td><td>Easier integration<\/td><\/tr><tr><td>Use SSH only if you\u2019ve configured keys properly<\/td><td>Avoids access errors<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\ude80 Real-World Example<\/h2>\n\n\n\n<p>Let\u2019s say you have this repo:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">https:<span class=\"hljs-comment\">\/\/github.com\/acme-corp\/terraform-infra-modules<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>With a folder structure like:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">terraform-infra-modules\/\n\u251c\u2500\u2500 vpc\/\n\u251c\u2500\u2500 eks\/\n\u2514\u2500\u2500 s3\/\n<\/code><\/span><\/pre>\n\n\n<p>You can use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">module<\/span> <span class=\"hljs-string\">\"vpc\"<\/span> {\n  source = <span class=\"hljs-string\">\"git::https:\/\/github.com\/acme-corp\/terraform-infra-modules.git\/\/vpc?ref=v1.0.0\"<\/span>\n}\n\n<span class=\"hljs-built_in\">module<\/span> <span class=\"hljs-string\">\"eks\"<\/span> {\n  source = <span class=\"hljs-string\">\"git::ssh:\/\/git@github.com\/acme-corp\/terraform-infra-modules.git\/\/eks?ref=main\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Here\u2019s a comprehensive tutorial on all valid Terraform module &#8220;source&#8221; Git URL patterns, with clear examples (no Drivemode references), so you can master using modules from GitHub, GitLab, Bitbucket, and&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-49426","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49426","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=49426"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49426\/revisions"}],"predecessor-version":[{"id":49427,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49426\/revisions\/49427"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49426"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49426"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49426"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}