Registry Terraform Io: Public Distribution, Private Governance, and Operational Reality

The Terraform Registry is the reference point for almost every Terraform workflow. When terraform init runs on a new project, Terraform contacts registry.terraform.io in the background, locates the providers declared in configuration, and downloads them. Most engineers treat this as background infrastructure. The registry is doing real work, and understanding how it functions changes how modules are structured, how providers are managed, and how IaC is governed as teams scale.

The public registry gives access to thousands of provider plugins and reusable configuration templates. The private registry, whether hosted by HCP Terraform, env zero, GitLab, or a self-hosted solution, gives an organization control over what gets used and by whom. Knowing the difference, and when each applies, is foundational to running Terraform at anything beyond a solo project.

The decisions made about the registry early, which modules to trust, how to version what is published, whether to run a private one, tend to compound. Practical guidance for all three aspects is essential for sustainable operations.

April 2026. The material was refreshed to cover Terraform 1.15 release candidate, OpenTofu registry differences, private registry options, and CI/CD automation patterns.

The Terraform Registry is the official distribution platform for Terraform providers, modules, and policy libraries, hosted at registry.terraform.io, with broad module compatibility with the Terraform Registry.

What the Terraform Registry Contains

The registry is not a single thing.

The public Terraform registry is a great option when the goal is to share a module or provider with the whole world, for instance when open-source modules and providers are written.

The Terraform Registry is an interactive resource for discovering a wide selection of integrations, providers, configuration packages, modules, and security rules, policies, for use with Terraform. The Registry includes solutions developed by HashiCorp, third-party vendors, and the Terraform community. The goal with the Registry is to provide plugins to manage any infrastructure API, pre-made modules to quickly configure common infrastructure components, and examples of how to write quality Terraform code.

The Registry is integrated directly into Terraform so providers and modules can be specified directly. Anyone can publish and consume providers, modules, and policies on the public Terraform Registry. To publish private modules within an organization, a private registry or reference repositories and other sources can be used directly.

The registry has a number of different categories for modules, providers, and policies to help navigate the large number of available options. A provider or module card can be selected to learn more, filter results to a specific tier, or use the search field at the top of the Registry. Search supports keyboard navigation.

Individuals interested in publishing can use a GitHub account to sign in to the Terraform Registry.

The landing page for the public Terraform registry is available at registry.terraform.io.

  • To see the available providers you go to registry.terraform.io/browse/providers
  • To see the available modules you go to registry.terraform.io/browse/modules

The page for each provider and module contain thorough documentation to help get started using that provider or module.

Each module has its own dedicated git repository.

Public Registry Reference Formats and Initialization

Using providers from the public Terraform registry is done by specifying a URL in the format <HOSTNAME>/<NAMESPACE>/<TYPE> in the required_providers block nested inside a terraform block.

Example:

hcl terraform { required_providers { aws = { source = "registry.terraform.io/hashicorp/aws" version = "5.58.0" } } }

When providers are referenced in the public Terraform registry the <HOSTNAME> part of the URL can be skipped and the shorthand <NAMESPACE>/<TYPE> can be used instead.

The example above then becomes:

hcl terraform { required_providers { aws = { source = "hashicorp/aws" version = "5.58.0" } } }

No matter how providers are referenced they will be downloaded once terraform init is run:

$ terraform init Initializing the backend... Initializing provider plugins... - Finding hashicorp/aws versions matching "5.58.0"... - Installing hashicorp/aws v5.58.0... - Installed hashicorp/aws v5.58.0 (signed by HashiCorp) Terraform has created a lock file

The lock file should be included in version control so that Terraform can guarantee to make the same selections by default when terraform init is run in the future.

Terraform has been successfully initialized!

After running the terraform init command the downloaded providers can be seen in the working directory, more specifically in a new directory named .terraform:

$ tree -a . . ├── .terraform │ └── providers │ └── registry.terraform.io │ └── hashicorp │ └── aws │ └── 5.58.0 │ └── linux_amd64 │ ├── LICENSE.txt │ └── terraform-provider-aws_v5.58.0_x5 ├── .terraform.lock.hcl └── main.tf 7 directories, 4 files

The exact directory structure will depend on computer architecture and what providers are referenced.

Using modules from the public Terraform registry is similar to referencing providers. A URL in the format <HOSTNAME>/<NAMESPACE>/<NAME>/<PROVIDER> is used:

hcl module "network" { source = "registry.terraform.io/terraform-aws-modules/vpc/aws" version = "5.16.0" }

Just like with providers the shorthand reference can be used:

hcl module "network" { source = "terraform-aws-modules/vpc/aws" version = "5.16.0" }

External modules from the public registry are downloaded and placed in the .terraform directory when terraform init is run:

$ terraform init Initializing the backend... Initializing modules... Downloading registry.terraform.io/terraform-aws-modules/vpc/aws 5.16.0 for vpc... - vpc in

A typical module declaration in code may look like:

hcl module "azure_networking" { source = "registry.terraform.io/Azure/vnet/azurerm" version = "5.0.1" }

Private Registry Options and Governance

A Terraform private registry is a secure, organization-specific version of Terraform's public registry. It serves as a central hub for sharing, versioning, and governing Terraform modules and providers within a company, rather than relying on the open public Terraform Registry.

Private registries also provide:

  • Access control: Only authorized users or teams can see or use the modules and providers.
  • Version management: Multiple versions can be published and control over which ones are approved for production.
  • Auditability: Tracking who published which version and when.
  • Consistency: Everyone uses the same vetted Terraform components, reducing drift and errors.

It lets teams standardize infrastructure building blocks, control access, and reduce supply-chain risk by curating what can be used and by whom.

A registry can be run yourself, used as a managed option like HCP Terraform, or used as a third-party registry such as Spacelift.

What is a Terraform private registry?

A Terraform private registry is a secure, organization-specific version of Terraform's public registry. It serves as a central hub for sharing, versioning, and governing Terraform modules and providers within your company, rather than relying on the open, public Terraform Registry.

How to publish to Terraform private registries

There are three main options for how to set up a Terraform private registry:

  • Build and host the private registry yourself.
  • Use a managed private registry on your infrastructure automation platform, e.g., Spacelift or HCP Terraform.
  • Use a third-party implementation of a private registry.

In the following sections, these options are discussed.

Most Terraform configurations that grow beyond a few resources and data sources should use Terraform modules. Terraform modules group logically connected pieces of infrastructure into a reusable package.

A module can be local, existing only as a subdirectory in the same Git repository as the root module where it is used. Using a local module means nobody else can reuse the same module without copying and pasting the same code into their own root module.

Public vs Private Registry Characteristics

Attribute Public Registry Private Registry
Scope Global, open Organization-specific
Access control Open Authorized users or teams only
Version governance Community maintained Organization controlled approval
Auditability Limited to public history Publish tracking per organization
Risk profile Supply chain exposure Curated, reduced supply-chain risk

Operational Health and Troubleshooting

Registry availability affects initialization speed and reliability.

Uptime history for registry.terraform.io shows consistent availability in the sampled period.

Date Response Time Status
2026-06-25T20:40:39+00:00 293 ms Up
2026-06-25T17:39:40+00:00 128 ms Up
2026-06-25T17:11:51+00:00 114 ms Up
2026-06-25T17:10:02+00:00 695 ms Up
2026-06-25T16:47:51+00:00 127 ms Up
2026-06-25T16:46:29+00:00 281 ms Up
2026-06-25T16:41:53+00:00 207 ms Up
2026-06-18T17:13:12+00:00 358 ms Up
2026-06-16T08:24:41+00:00 265 ms Up
2026-06-16T08:19:10+00:00 363 ms Up

If registry.terraform.io is not able to be reached, it might be a connection issue.

Troubleshooting tips include:

  • Refresh your browser
    • Force a full refresh of your browser page by clicking Ctrl + F5 at the same time. This should work on Internet Explorer, Firefox and Chrome.
    • Clear your browser temporary cache and cookie to make sure you have the recent version of registry.terraform.io.

Advanced tips:

  • Clear your local DNS cache to make sure you have the recent version from your ISP for registry.terraform.io

Conclusion

The Terraform Registry is both a discovery mechanism and an operational dependency. The public registry at registry.terraform.io provides a wide selection of providers, modules, and policies developed by HashiCorp, third-party vendors, and the community, with direct integration into Terraform initialization and lock file management.

Public usage relies on canonical source URLs and shorthand references, with providers downloaded to .terraform/providers/registry.terraform.io/... and modules staged during terraform init. This works well for open source sharing and rapid adoption.

As teams scale, governance needs drive adoption of private registries. Private registries provide access control, version management, auditability, and consistency, and can be built and hosted yourself, used as a managed option like HCP Terraform or Spacelift, or implemented via third-party solutions.

The registry decision compounds over time. Early choices about which modules to trust, how to version published artifacts, and whether to operate a private registry shape supply-chain risk, reuse velocity, and compliance posture. Understanding the public distribution mechanics, private governance options, and operational health of registry.terraform.io is foundational to running Terraform beyond a solo project.

Sources

  1. env0.com blog
  2. spacelift.io blog
  3. mattias.engineer blog
  4. developer.hashicorp.com
  5. notopening.com

Related Posts