Blog

Wie Sie eine private Terraform-Anbieterregistrierung mit Google Cloud Storage erstellen

Mark van Holsteijn

Aktualisiert Oktober 20, 2025
4 Minuten

Seit Version 0.13 unterstützt terraform das Konzept eines Anbieterregisters. Sie können Ihren eigenen Anbieter erstellen und in der öffentlichen Registrierung veröffentlichen. Derzeit gibt es keine Implementierung einer privaten Registry. In diesem Blog zeige ich Ihnen, wie Sie eine private Terraform-Anbieterregistrierung auf Google Cloud Storage erstellen können. Ein Dienstprogramm generiert alle erforderlichen Dokumente, um eine statische Registrierung zu erstellen.

Bevor ich Ihnen erkläre, wie Sie Ihre eigene Terraform-Anbieterregistrierung erstellen, zeige ich Ihnen das erwartete Protokoll, das von einer Registrierung eingehalten wird. Dann zeige ich Ihnen die Anatomie der Freigabe eines Terraform-Anbieters. Schließlich zeige ich Ihnen, wie Sie das Register erstellen und einen Anbieter freigeben.

terraform Anbieter-Registrierungsprotokoll

Das Protokoll des Registers besteht aus den drei Dokumenttypen:

  • Entdeckungsdokument pro Registratur
  • Versionen Dokument pro Anbieter
  • Dokument pro Dokument herunterladen

In den folgenden Abschnitten zeige ich Beispiele für diese Dokumenttypen.

das Entdeckungsdokument

Dieses Dokument ermöglicht terraform die Abfrage des Endpunkts der Ressourcen::

$ curl $REGISTRY_URL/.well-known/terraform.json
{"providers.v1": "/v1/providers/"}

das Dokument Versionen

Die Versionsdokumente geben die verfügbaren Versionen und Plattform-Binärdateien pro Anbieter zurück.

$ curl $REGISTRY_URL/v1/providers/jianyuan/sentry/versions
{
  "versions": [{
      "version": "0.6.0",
      "protocols": ["5.0"],
      "platforms": [{"os": "darwin","arch": "amd64"}, {"os": "linux","arch": "amd64"}]
    }]
}

das Download-Dokument

Schließlich enthält das Download-Dokument die Metadaten, die zum Herunterladen einer Plattform-Binärdatei erforderlich sind.

$ curl $REGISTRY_URL/v1/providers/jianyuan/sentry/0.6.0/download/darwin/amd64
{
  "protocols": [
    "5.0"
  ],
  "os": "darwin",
  "arch": "amd64",
  "filename": "terraform-provider-sentry_0.6.0_darwin_amd64.zip",
  "download_url": "$REGISTRY_URL/binaries/jianyuan/terraform-provider-sentry/v0.6.0/terraform-provider-sentry_0.6.0_darwin_amd64.zip",
  "shasums_url": "$REGISTRY_URL/binaries/jianyuan/terraform-provider-sentry/v0.6.0/terraform-provider-sentry_0.6.0_SHA256SUMS",
  "shasums_signature_url": "$REGISTRY_URL/binaries/jianyuan/terraform-provider-sentry/v0.6.0/terraform-provider-sentry_0.6.0_SHA256SUMS.sig",
  "shasum": "a2c5881ea67e1c397cb26c6162d81829e058d5a993801bcb69df9982412d27e9",
  "signing_keys": {
    "gpg_public_keys": [
      {
        "key_id": "8B15B898C0AA84DC7A7B0E46B851229EAFE0F521",
        "ascii_armor": "-----BEGIN PGP PUBLIC KEY BLOCK-----...-----END PGP PUBLIC KEY BLOCK-----",
        "trust_signature": "",
        "source": "",
        "source_url": null
      }
    ]
  }

Da wir nun wissen, was erforderlich ist, werfen wir einen Blick auf die Veröffentlichung eines Terraform-Anbieters.

terraform-Anbieter veröffentlicht

Ein Terraform-Provider-Release ist eine Sammlung von gezippten Binärdateien. Eine neue Version eines Anbieters, der die Anforderungen von terraform erfüllt, sieht so aus:

terraform-provider-sentry_0.6.0_SHA256SUMS
terraform-provider-sentry_0.6.0_SHA256SUMS.sig
terraform-provider-sentry_0.6.0_darwin_amd64.zip
terraform-provider-sentry_0.6.0_freebsd_386.zip
terraform-provider-sentry_0.6.0_freebsd_amd64.zip
terraform-provider-sentry_0.6.0_freebsd_arm.zip
terraform-provider-sentry_0.6.0_freebsd_arm64.zip
terraform-provider-sentry_0.6.0_linux_386.zip
terraform-provider-sentry_0.6.0_linux_amd64.zip
terraform-provider-sentry_0.6.0_linux_arm.zip
terraform-provider-sentry_0.6.0_linux_arm64.zip
terraform-provider-sentry_0.6.0_windows_386.zip
terraform-provider-sentry_0.6.0_windows_amd64.zip

Eine Freigabe besteht aus einer:

  • zip-Datei, die die erstellte Provider-Binärdatei für jede Architektur enthält
  • Prüfsummendatei mit der Prüfsumme für jede der Zip-Dateien
  • Signaturdatei, die die Signatur der Prüfsummendatei enthält.

Das einzige, was in der Distribution fehlt, ist der öffentliche Schlüssel, mit dem die Prüfsummendatei signiert wird.

der Terraform-Anbieter-Registrierungsgenerator

Wie im vorigen Absatz gezeigt, enthält eine Version alles, was zur Implementierung des Terraform-Provider-Registrierungsprotokolls erforderlich ist. Der terraform provider registry api generator generiert alle erforderlichen JSON-Dokumente. Er liest eine Verteilung auf dem Bucket, lädt den öffentlichen PGP-Schlüssel und schreibt alle erforderlichen Dokumente.

Ihr eigenes privates Terraform-Anbieter-Register erstellen

Um Ihre eigene private Terraform-Anbieterregistrierung zu erstellen, konfigurieren Sie einen Cloud-Speicher-Bucket wie folgt, um eine statische Website zu hosten:

$ git clone https://github.com/mollie/tf-provider-registry-api-generator.git
$ cd tf-provider-registry-api-generator/example/terraform
$ terraform init
$ read -p "project id:" TF_VAR_project_id
$ read -p "dns zone name:" TF_VAR_dns_managed_zone
$ terraform apply

Um die URL der Registrierung zu erhalten, geben Sie ein:

$ REGISTRY_URL=https://registry.$(gcloud dns managed-zones 
     describe $TF_VAR_dns_managed_zone 
    --format 'value(dns_name)' | sed -e 's/.$//')

Nach ein paar Minuten sollten Sie eine 404 auf$REGISTRY_URL erhalten.

erstellen und für Ihre eigene private Registry freigeben

Der Einfachheit halber werde ich einen bestehenden Terraform-Anbieter erstellen und für meine private Registry freigeben. Dazu muss ich Folgendes tun:

  • den Anbieter aufbauen
  • Kopieren Sie die Freigabe des Eimers
  • Generieren Sie die Api-Dokumente der Terraform-Anbieter-Registrierung

bauen Sie den Terraforming-Anbieter

Um den Terraform-Anbieter zu erstellen, geben Sie ein:

$ git clone https://github.com/jianyuan/terraform-provider-sentry.git
$ cd terraform-provider-sentry
$ git checkout v0.6.0

$ curl -sS -o /tmp/goreleaser.yaml  https://raw.githubusercontent.com/hashicorp/terraform-provider-scaffolding/main/.goreleaser.yml
$ read -p  "pgp key fingerprint:" PGP_FINGERPRINT
$ goreleaser release -f /tmp/goreleaser.yaml --rm-dist

Kopieren Sie die Freigabe des Eimers

Um die neu erstellte Version auf den Bucket zu kopieren, geben Sie ein:

$ TF_REGISTRY_BUCKET=${TF_VAR_project_id}-tf-registry
$ gsutil cp . 
  gs://$TF_REGISTRY_BUCKET/binaries/terraform-provider-sentry/v0.6.0/

die API-Dokumente der Terraform-Anbieter-Registrierung zu generieren

Um die API-Dokumente der Terraform-Anbieter-Registrierung zu erzeugen, geben Sie ein:

$ go get github.com/mollie/tf-provider-registry-api-generator
$ $GOPATH/bin/tf-provider-registry-api-generator 
  --bucket-name $TF_REGISTRY_BUCKET 
  --prefix binaries/terraform-provider-sentry/v0.6.0/ 
  --namespace jianyuan 
  --fingerprint $PGP_FINGERPRINT 
  --protocols 5.0 
  --url $REGISTRY_URL

Jetzt sollten Sie in der Lage sein, die Registrierung abzufragen:

$ curl $REGISTRY_URL/.well-known/terraform.json
$ curl $REGISTRY_URL/v1/providers/jianyuan/sentry/versions
$ curl $REGISTRY_URL/v1/providers/jianyuan/sentry/0.6.0/download/darwin/amd64

Beachten Sie, dass alle oben genannten Schritte in einer einzigen Go-Release-Spezifikation kombiniert werden können.

Verweis auf Ihre private Registratur

Um den Anbieter aus Ihrer privaten Registrierung zu verwenden, fügen Sie den folgenden Ausschnitt in Ihre Terraform-Definition ein:

terraform {
  required_providers {
    sentry = {
      source = "<DOMAIN_NAME>/jianyuan/sentry"
    }
  }
}

Fazit

Für die meisten Zwecke empfehle ich die Verwendung der öffentlichen Terraform-Anbieterregistrierung. Es ist eine einfach zu verwendende, schlüsselfertige Lösung. Wenn Sie Ihre Anbieter aus irgendeinem Grund privat halten wollen, ist es ganz einfach, ein eigenes privates Anbieterregister zu erstellen.

Foto von Dayne Topkin auf Unsplash

Verfasst von

Mark van Holsteijn

Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.

Contact

Let’s discuss how we can support your journey.