Terraform Extensions

Two module extensions live in //terraform:extensions.bzl:

terraform_toolchains

No user-facing configuration. On evaluation it materializes one hub repo (@terraform_toolchains) that declares a toolchain per (version, platform), each guarded by a target_settings matching //terraform/settings:version_<v>. rules_terraform's own MODULE.bazel use_repos the hub and register_toolchainss it, so downstream users get toolchain resolution for free — no ceremony beyond flipping //terraform/settings:version to pick which Terraform release to actually download. Per-(version, platform) http_archives are lazy; only the selected combination is fetched.

# In your MODULE.bazel — nothing to do beyond `bazel_dep`:
bazel_dep(name = "rules_terraform", version = "...")

terraform

Carries providers and modules tag classes for users who want to pin providers or registry-modules via Bazel-managed fetching.

terraform = use_extension("@rules_terraform//terraform:extensions.bzl", "terraform")

# One providers hub per `.terraform.lock.hcl` you want to fetch.
terraform.providers(
    name = "my_providers",
    lock = "//path/to/module:.terraform.lock.hcl",
    # registry = "registry.opentofu.org",  # optional; defaults to registry.terraform.io
)

# One modules hub per `terraform_modules.lock.json` (generated by lockgen).
terraform.modules(
    name = "my_modules",
    lock = "//path/to/module:terraform_modules.lock.json",
)

use_repo(terraform, "my_providers", "my_modules")

terraform.providers

AttributeTypeDescription
namestring (required)Hub repository name. Each declared provider lives at @<name>//<namespace>_<name>.
locklabel (required).terraform.lock.hcl file to fetch providers from.
registrystring (default registry.terraform.io)Registry host to query.

terraform.modules

AttributeTypeDescription
namestring (required)Hub repository name. Each fetched module is aggregated under @<name>//:<name>.
locklabel (required)terraform_modules.lock.json file (see terraform_modules_lock.md).