2023
Oktober
17
2023

Ressourcen in mehreren Projekten mit Terraform

Mit unserem Terraform-Provider verwalten Sie Ihre Ressourcen bei cloudscale.ch "als Code". Indem Sie Ihre Cloud-Ressourcen in verschiedene Projekte gruppieren, trennen Sie sie zudem sauber voneinander – ganz nach Ihren konkreten Anforderungen. Im Folgenden möchten wir ein leicht zu übersehendes Feature von Terraform vorstellen, mit dem Sie diese Vorteile kombinieren und aus nur einem Terraform-Repository heraus Cloud-Ressourcen in mehreren Projekten pflegen.

Terraform: Infrastructure as Code

Terraform erlaubt es, die benötigte Cloud-Infrastruktur in Form von Konfigurationsdateien zu definieren. Auf Basis dieser Konfiguration erstellt Terraform anschliessend via API die tatsächlichen Cloud-Ressourcen. Im täglichen Betrieb kann Terraform dann den Zustand gemäss Konfiguration wieder herstellen, wenn sich in der Praxis Abweichungen ergeben haben, und Änderungen an der Konfiguration auf das reale Setup applizieren. Oft werden Terraform-Configs zudem in einem Versionsverwaltungssystem wie Git verwaltet und als Teil einer CI/CD Pipeline angewendet.

Projekte: Ordnung, Sicherheit und Transparenz

Bei cloudscale.ch werden Cloud-Ressourcen wie Server und Volumes in Projekten erstellt. Projekte ermöglichen die Gruppierung von Ressourcen, z.B. pro Endkunde oder zur Trennung von Dev- und Prod-Umgebungen. Wenn mehrere Beteiligte gemeinsam mit Cloud-Ressourcen arbeiten, können zudem die Berechtigungen von Personen und Teams für jedes Projekt einzeln festgelegt werden. Schliesslich werden auch die Kosten für jedes Projekt separat ausgewiesen und lassen sich anschliessend weiter nach den Ressourcen aufschlüsseln.

Auch API-Tokens für die cloudscale.ch API sind an ein Projekt gebunden und erlauben nur Zugriff auf Ressourcen innerhalb dieses Projekts. Als Praxisbeispiel könnte es daher gewünscht sein, etwa einen Backupserver in einem eigenen, separaten Projekt zu erstellen. Ein im Alltag häufig benutztes API-Token im primären Projekt (z.B. zum Verschieben einer Floating IP zwischen Servern) kann dann nicht benutzt werden, um Änderungen am Backupserver vorzunehmen.

Zentrale Verwaltung in Terraform

Möchte man nun alle Ressourcen zusammen in einem Zug mit Terraform erstellen, steht man vor der Frage, wie man den cloudscale-ch Provider mit mehreren API-Tokens verwenden kann. Die Lösung besteht darin, zwei provider Blöcke zu erstellen, also den Provider zweimal zu instanziieren und einer Instanz einen alias hinzuzufügen. Jeder Instanz kann man dann ihr eigenes API-Token zuweisen.

Das sieht dann etwa so aus:

terraform {
  required_providers {
    cloudscale = {
      source = "cloudscale-ch/cloudscale"
    }
  }
}

# Define variables for the API tokens
variable "cloudscale_api_token" {}
variable "cloudscale_backup_api_token" {}

# Define the provider for the default project
provider "cloudscale" {
  token = var.cloudscale_api_token
}

# Define the provider for the second project with an alias
provider "cloudscale" {
  alias = "backup"
  token = var.cloudscale_backup_api_token
}

Die Ressourcen im ersten Projekt kann man wie gewohnt deklarieren:

# Create servers using the default provider
# in the first project
resource "cloudscale_server" "demo-server" {
  name               = "demo-server-${count.index + 1}"
  flavor_slug        = "plus-8-4"
  image_slug         = "ubuntu-22.04"
  ssh_keys           = [file("~/.ssh/id_ed25519.pub")]
  zone_slug          = "lpg1"
  count              = 3
}

Die Ressourcen, welche ins zweite Projekt gehören, werden zusätzlich um das provider Keyword erweitert.

# Create a backup server using the aliased provider
# in the second project
resource "cloudscale_server" "backup-server" {
  # Use the aliased provider
  provider           = cloudscale.backup

  name               = "backup-server"
  flavor_slug        = "flex-4-2"
  image_slug         = "ubuntu-22.04"
  ssh_keys           = [file("~/.ssh/id_ed25519.pub")]
  zone_slug          = "rma1"
}

Nun lassen sich alle Ressourcen in beiden Projekten auf einmal erstellen:

terraform apply -var="cloudscale_api_token=$TOKEN1" \
                -var="cloudscale_backup_api_token=$TOKEN2"

Übrigens: als Feature von Terraform können Sie das alias Keyword nicht nur bei cloudscale.ch nutzen, um mehrere API-Tokens anzugeben, sondern allgemein immer dann, wenn Sie einen ansonsten identischen provider Block mit unterschiedlichen Parametern verwenden möchten.


Wählen Sie zur Verwaltung Ihrer Ressourcen bei cloudscale.ch den für Sie passenden Ansatz, je nach konkretem Setup, beteiligten Personen und der jeweils bevorzugten Arbeitsweise. Auch wenn Sie Ihre Cloud-Ressourcen dabei in mehrere Projekte aufteilen: Mit alias Instanzen des cloudscale-ch Providers können Sie die Fäden in einem einzelnen, konsolidierten Terraform-Repository zusammenlaufen lassen.

Ein Ziel, viele Namen:
Ihr cloudscale.ch-Team

Zurück zur Übersicht