Commit 2fcbacf
[docs] Document Terraform modules in the Pulumi Cloud registry (#19453)
* [registry] Document Terraform module hosting in the Pulumi Cloud registry
Add a new concept page under IDP describing how Pulumi Cloud hosts Terraform modules: authentication via `terraform login`, the three HCP-compatible publish paths (go-tfe, hashicorp/tfe provider, tfc-workflows-github Action), the standard module layout we extract from at publish, consumption from OpenTofu / Terraform via the Module Registry Protocol, and consumption from a Pulumi program via `pulumi package add terraform-module`.
Cross-link from the existing "Use a Terraform Module in Pulumi" guide so consumers landing on the IaC guide can discover the Pulumi-Cloud-hosted path.
Design doc: https://app.notion.com/p/Terraform-module-hosting-in-the-Pulumi-Cloud-registry-372fdbdf1cce801ea7a3f4946c1e4154
Fixes pulumi/pulumi-service#44080
## Test plan
- Render the IDP concepts section locally and confirm the new "Terraform Modules" entry appears under the Concepts menu
- Click through every internal link in the new page to confirm targets exist
* [registry] Add launch blog post; correct registry host to tf.pulumi.com
Add the announcement blog post for hosting Terraform modules in the
Pulumi Cloud registry, and correct the registry host across the docs and
blog from app.pulumi.com to the canonical tf.pulumi.com (per
pulumi/pulumi-service#44889; app.pulumi.com is the console only).
Move the migration guidance out of the blog and into the concept page,
and document the one naming rule that differs from HCP Terraform: module
names reject underscores.
* [registry] Fix auth: Pulumi access token, not terraform login
The TFE discovery document (cmd/service/api/tfe_discover.go) advertises
tfe.v2, state.v2, and modules.v1 but no login.v1, so terraform login
against tf.pulumi.com is unsupported.
Document the real auth instead: a Pulumi access token is the bearer for
publish (go-tfe, the tfe provider, the GitHub Action), pulumi login for
pulumi package add, and TF_TOKEN_tf_pulumi_com for plain OpenTofu or
Terraform.
* [registry] Address review: drop GitHub Action, fix injection and layout
- Remove the tfc-workflows-github Action from the publish and delete
paths and from the auth list. create-run triggers a run; it does not
touch the module registry. The testbed only exercised go-tfe and the
tfe provider.
- Consume from Pulumi: drop the rejected "CLI injects TF_TOKEN_<host>"
detail. After pulumi login the provider resolves the module with your
Pulumi credentials. Note that terraform-module is a parameterized
provider and name its parameters.
- Module layout: parse all root .tf files (any filenames); examples and
README are captured at publish, not rendered (console rendering is not
built yet).
- Say packages, not components.
* [registry] Brand: sentence-case the concept page title; link state backend
Apply the Pulumi brand writing-style rules: sentence case for the
concept page title_tag/title/h1 and no over-capitalized concepts, so
"Terraform modules in the Pulumi Cloud registry" rather than title case.
Drop the "just" minimizer from the migration line.
Link "keep Terraform state in Pulumi Cloud" in the blog to the state
backend guide.
* [registry] Consume via the hcl package instead of terraform-module
The Pulumi-program consume path now uses the forthcoming hcl package:
pulumi package add hcl module <source> [version], with the version
optional (omit for latest, pass to pin). Drops the terraform-module
alias parameter, since the hcl module form derives the package name
from the module.
* [registry] Document conversion as the default Pulumi consumption path
Publishing a module version converts it into a Pulumi package, and neither the
concept page, the launch post, nor the Terraform module guide said so. All three
taught `pulumi package add hcl module ...` as the way to consume from a Pulumi
program, which is now the fallback rather than the default.
The concept page gains a section on what publishing produces: the
`<name>-<system>` package name, that conversion runs per version, and where to
see which versions have converted. `pulumi package add <name>-<system>` becomes
the documented path. The `hcl module` form stays, for versions still converting,
noting that it runs the same conversion locally rather than using the published
package. The guide's "Using a Module from Pulumi Cloud" section follows the same
order.
The pages describe what the package gives a consumer, not only that one exists:
the module becomes a multi-language component, so its variables are typed inputs
and its outputs typed outputs, with a generated SDK in the project's language,
its resources visible individually in previews and the resource graph, an API
reference generated from those variables and outputs, and a record of which
stacks depend on it and which are behind the latest version.
Usage tracking follows the package, so a consumer reaching the module over the
Terraform protocol does not report a dependency and does not appear in the usage
columns or the "Used by" tab. Both pages say so.
Consuming from OpenTofu or Terraform moves below the Pulumi path on the concept
page and in the post. It still documents that existing `.tf` consumers are
unaffected and how to reference the module and its submodules.
All three state that installing a converted package needs Pulumi CLI 3.248.0 or
newer, verified by bisect: 3.247.0 fails the plugin handshake, 3.248.0 works.
The Terraform module detail page is being removed from the console, so the
pages describe conversion state as living on the package's page instead.
Fixes #20555
## Test plan
1. Automated checks
- `./scripts/format.sh` on all three files
- `vale --config=.vale.ini` on all three: 0 errors; remaining warnings are on
lines this change does not touch
* [registry] Retitle the launch post and set its author
The title names the payoff rather than the hosting. Author set to the existing
team entry.
* [registry] Stop selling local conversion as a fallback, link install and console URLs
Local conversion runs the same `hcl` provider the registry runs, so a module the
registry could not convert fails locally for the same reason. All three pages
offered it as the answer for a module using Terraform features Pulumi cannot
express, which it is not. It is now described as what it is: the same
conversion, run at the moment you run it, useful while a version is still
converting. The concept page's section is renamed to match and says outright
that it is not a way around a failed conversion.
The CLI version requirement links to Download & Install Pulumi on all three
pages, so a reader on an older CLI has somewhere to go.
The concept page picks up aliases for the two docs URLs the console links to,
both of which 404 today:
- `/docs/terraform-modules/`, from the package install card
- `/docs/iac/using-pulumi/pulumi-cloud/registry/terraform-modules/`, from the
Terraform modules list page
The concept page's deletion section is removed while we decide what deleting a
converted package should do to the module it came from
(pulumi/pulumi-service#47170). Documenting module deletion now would describe
behavior we expect to change.
The post is dated 2026-08-04.
* [registry] Fix lint failures and the review's link and style findings
`make lint` gates the build and was failing:
- The post was missing the required `category` front matter. It announces a
shipped feature, so `product`
- Its `meta_desc` was 182 characters against a 160 limit. Dropped the usage
tracking clause, which the post covers in the body
- Removing the concept page's deletion section left a trailing blank line
From the pre-merge review:
- The multi-language component link 404s. `pulumi-hcl` has no `main` branch;
`https://github.com/pulumi/pulumi-hcl/blob/master/docs/mlc.md` resolves.
Fixed in the post and the concept page
- The access token link went through an alias. The page's canonical route is
`/docs/administration/access-identity/access-tokens/`; the old path is line
19 of that page's own aliases list
- The closing line of "Converting a module locally" restated what the
Authenticate section already establishes
- Style: two `It is` openings and one `mostly`
- The guide's new heading was Title Case, against AGENTS.md's sentence case
rule for H2 and below
The module name rule is now stated as the regex the service enforces,
`[a-z0-9][a-z0-9-]*` (`pkg/apitype/registry_artifact.go`), rather than a
character list that implied a leading hyphen was valid.
Two review findings are not acted on. The registry host is `tf.pulumi.com`:
`tfe.pulumi.com` is a dead record that CloudFront-403s since the distribution
alias, ALB host rule, and service dispatch moved, so the provider test the
review cites is stale. And `canonical_url` pointing at the concept page is what
BLOGGING.md prescribes for a feature announcement documented in the docs.
* [registry] Address review: heading context, define system, trim inside baseball
* [registry] Split the blog into #20648; make local conversion a fallback, not a wait-saver
* [registry] Say plainly that local conversion publishes no package
---------
Co-authored-by: Christian Nunciato <chris@nunciato.org>1 parent 3cf8dc4 commit 2fcbacf
2 files changed
Lines changed: 165 additions & 0 deletions
File tree
- content/docs
- iac/guides/building-extending/using-existing-tools
- idp/concepts
Lines changed: 20 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
84 | 84 | | |
85 | 85 | | |
86 | 86 | | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
87 | 107 | | |
88 | 108 | | |
89 | 109 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
0 commit comments