Let's Encrypt, Nomad und Traefik

Wenn man mit einem Overlay VPN Infrastruktur bei völlig unabhängigen (Cloud-) Providern verbindet und Nomad benutzt, um diese dann zu integrieren (bzw. zu abstrahieren), dann müssen für die verschiedenen Endpunkte, an denen Dienste angeboten werden sollen, natürlich gültige SSL-Zertifikate verfügbar sein.

Mit der http-01 Challenge ist es dann nicht mehr so einfach, diese für verschiedene Endpunkte auch zu bekommen. Ziel ist es also mit der dns-01 Challenge , ein Wildcard-Zertifikat für eine (Sub-)Domain auszustellen, welches an allen Endpunkten verwendet werden kann.

Eine sehr geschickte Methode hat Michael Aldridge in Building a Nomad Cluster: Traffic Ingress beschrieben. Die kommt auch in seinem Vortrag zur Hashiconf 2025

vor, zu dem auch ein Repository auf Github gehört:

GitHub - the-maldridge/matrix: A Void based Nomad cluster
A Void based Nomad cluster. Contribute to the-maldridge/matrix development by creating an account on GitHub.

Der Trick ist, mit diesem Nomad Job

matrix/jobs/letsencrypt.nomad at master · the-maldridge/matrix
A Void based Nomad cluster. Contribute to the-maldridge/matrix development by creating an account on GitHub.

in einem Docker-Container mit Terraform zyklisch dieses Terraform Skript

matrix/terraform/letsencrypt/certs.tf at master · the-maldridge/matrix
A Void based Nomad cluster. Contribute to the-maldridge/matrix development by creating an account on GitHub.

auszuführen. Damit das funktioniert, wird natürlich ein Backend benötigt, in dem Terraform seinen State speichern kann. Auch das hat Michael Aldridge geschrieben:

GitHub - the-maldridge/terrastate: Remote state daemon for TerraForm
Remote state daemon for TerraForm. Contribute to the-maldridge/terrastate development by creating an account on GitHub.

Der "Batch-Job" letsencrypt.nomad wird "@weekly" von Nomad aufgerufen und führt den Terraform-Container mit dem Terraform Skript certs.tf aus. Der dort verwendete Terraform Provider acme unterstützt über lego eine große Auswahl an DNS-Providern:

DNS Providers :: Let’s Encrypt client and ACME library written in Go.
Important lego is an independent, free, and open-source project, if you value it, consider supporting it! ❤️ This project is not owned by a company. I’m not an employee of a company. I don’t have gifted domains/accounts from DNS companies. I’ve been maintaining it for about 10 years. Configuration and Credentials Credentials and DNS configuration for DNS providers must be passed through environment variables.

Die damit ausgestellten Zertifikate werden mit dem Nomad Provider in Nomad Variablen gespeichert, stehen damit im gesamten Cluster zur Verfügung und können damit natürlich auch einfach in einem traefik.nomad Job verwendet werden. Genauso kann man sie dann natürlich auch für Caddy bereitstellen.

Da es im Nomad Cluster auch noch andere Dinge gibt, die man gut per Terraform konfigurieren kann (z. B. das Verwalten von Policies), ist so ein Setup sehr sinnvoll.

Der Vortrag von Michael Aldridge ist aber auch unter anderen Aspekten durchaus interessant. Ein komplettes Datacenter für seinen Arbeitgeber Backblaze innerhalb von drei Stunden fertig bereitzustellen, ist durchaus respektabel.