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

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
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.
Unsere Ideen
Weitere Blogs
Contact



