GOOGLE CLOUD FUNCTIONS → STACKIT · LEITFADEN
Google Cloud Functions zu STACKIT
STACKIT bietet kein allgemein verfügbares Function-as-a-Service; deshalb wird eine Funktion zu einer Anwendung: einer Cloud-Foundry-App oder einem Container auf SKE. Code und Laufzeit ziehen um; der Trigger nicht, denn ein Ereignis aus Pub/Sub oder Cloud Storage muss als Consumer des migrierten Messaging- oder Storage-Dienstes neu geschrieben werden. StackToIT stuft eine Funktion als CONTAINERIZE ein und schreibt die Plattform darum herum.
Die Migration, Schritt für Schritt
Die Schritte folgen den Einheiten des Beispiellaufs in der Reihenfolge seiner Wellen.
Funktionen nach Generation und Trigger auflisten
Google dokumentiert zwei Generationen von Cloud Functions; die zweite Generation steht in der Cloud-Run-Dokumentation. Halten Sie je Funktion Trigger (HTTP, Pub/Sub, Storage-Ereignis, Zeitplan), Laufzeit, Speicher, Timeout, Instanzgrenzen, Ingress-Einstellung, Service Account und Secrets fest.
Zielplattform wählen
Eine Cloud-Foundry-App passt zu Code, den Sie mit einem Buildpack pushen; ein Container auf SKE passt zu einer Funktion, die schon als Image geliefert wird oder neben anderen Workloads laufen soll. Der Lauf schlägt Cloud Foundry für die Funktion und SKE für den Zeitplan vor; ob Sie auf eine Plattform vereinheitlichen, entscheiden Sie.
Zuerst die Grundlagen umziehen
Service Account, Quell-Bucket und Topic liegen in Welle 1 des Laufs; das Secret folgt in Welle 2. Der Service Account wird zum STACKIT-Service-Account, der Bucket zum STACKIT-Object-Storage-Bucket, das Secret zu einem Schlüssel im Secrets Manager.
Den Trigger neu schreiben
Das Topic wird zum RabbitMQ-Exchange, das Abonnement zur Queue. Der Funktionscode wechselt vom Pub/Sub-Ereignis zu einem AMQP-Consumer; Bestätigung und Wiederholung legen Sie bewusst fest.
Die App pushen
Schreiben Sie das Manifest aus der Liste der nicht übernommenen Einstellungen des Laufs. Im Beispiel sind das der App-Name send-receipt, 256 MB Speicher, höchstens 5 Instanzen, die Variable MAIL_FROM und das Secret MAIL_API_KEY; für das Timeout von 60 Sekunden braucht es eine eigene Entscheidung. Pushen Sie die App in einen Space der entworfenen Organisation.
Den Zeitplan neu anlegen
Schreiben Sie den CronJob oder einen Cloud-Foundry-Task, der den neuen Endpunkt nach dem alten Zeitplan aufruft. Die Endpunktadresse ändert sich, also auch das Ziel des Zeitplans.
Testen, umstellen, alte Funktion behalten
Senden Sie Testnachrichten, vergleichen Sie das Ergebnis mit der noch laufenden Funktion, stellen Sie die Publisher um und entfernen Sie die alte Funktion nach der Abnahme. Das ist Praxis, kein Schritt, den der Lauf ausführt.
Eine Pub/Sub-Funktion, umgewandelt
Eine für diese Seite geschriebene Umgebung, am 4. November 2026 von StackToIT bewertet: eine Funktion der zweiten Generation mit Pub/Sub-Trigger, ihr Service Account, ein Secret, ein Quell-Bucket und ein nächtlicher Cloud-Scheduler-Job. Links die Funktion der Eingabe, rechts der Block, den der Lauf dafür entworfen hat; die Prüfkommentare über dem Block sind hier ausgelassen.
resource "google_cloudfunctions2_function" "receipt" {
name = "send-receipt"
location = "europe-west3"
build_config {
runtime = "python312"
entry_point = "handle_paid_order"
source {
storage_source {
bucket = google_storage_bucket.fn_source.name
object = google_storage_bucket_object.receipt_zip.name
}
}
}
service_config {
available_memory = "256M"
timeout_seconds = 60
max_instance_count = 5
service_account_email = google_service_account.fn.email
ingress_settings = "ALLOW_INTERNAL_ONLY"
environment_variables = {
MAIL_FROM = "orders@example.com"
}
secret_environment_variables {
key = "MAIL_API_KEY"
project_id = "shop-events-prod"
secret = google_secret_manager_secret.mail_key.secret_id
version = "latest"
}
}
event_trigger {
trigger_region = "europe-west3"
event_type = "google.cloud.pubsub.topic.v1.messagePublished"
pubsub_topic = google_pubsub_topic.orders_paid.id
retry_policy = "RETRY_POLICY_RETRY"
}
}resource "stackit_scf_organization" "migrated_apps" {
project_id = var.project_id
name = "migrated-apps"
}Eine Organisation, keine App
Der Entwurf legt die Cloud-Foundry-Organization an, die die migrierten Apps beherbergt. Die App selbst wird mit einem Manifest in einen Space gepusht, das der Lauf nicht erzeugt.
Was in Kommentaren steht
Name, Quellort, Speicher, Instanzen, Umgebung, Secrets und Netzwerkeinstellungen stehen als nicht übernommen im Code, damit Sie sie ins Manifest kopieren können.
Interner Ingress wird benannt
Eine Cloud-Foundry-App ist über ihre Route erreichbar. Der Lauf hält fest, dass interner Ingress nicht übernommen wird und Sie einschränken müssen, wer die App erreicht.
Der Trigger und der Zeitplan
Die Funktion läuft nicht allein. Ihr Topic und ihr Scheduler-Job werden zu einem Message-Broker und einem Cron-Job, und der Lauf entwirft die Plattformen, die sie dafür brauchen. Jeder Eingabeblock steht neben dem Block, den der Lauf dafür geschrieben hat; die Prüfkommentare sind ausgelassen.
resource "google_pubsub_topic" "orders_paid" {
name = "orders-paid"
}resource "stackit_rabbitmq_instance" "messaging" {
project_id = var.project_id
name = "messaging"
plan_name = var.rabbitmq_plan_name
version = var.rabbitmq_version
parameters = {
sgw_acl = join(",", var.rabbitmq_allowed_cidrs)
}
}resource "google_cloud_scheduler_job" "nightly" {
name = "nightly-digest"
region = "europe-west3"
schedule = "0 3 * * *"
time_zone = "Europe/Berlin"
http_target {
uri = google_cloudfunctions2_function.receipt.service_config[0].uri
http_method = "POST"
}
}resource "stackit_ske_cluster" "containers" {
project_id = var.project_id
name = "containers"
node_pools = [{
name = "workloads"
machine_type = var.containers_machine_type
minimum = var.containers_nodes_min
maximum = var.containers_nodes_max
availability_zones = var.availability_zones
}]
}Topic zu Exchange
Das Topic wird zu einem Exchange einer gemeinsamen RabbitMQ-Instanz, von Hand in RabbitMQ angelegt; Abonnements werden zu Queues.
Job zu CronJob
Der Scheduler-Job wird zu einem Kubernetes-CronJob auf SKE, der den neuen Endpunkt der Funktion nach demselben Zeitplan aufruft: 0 3 * * * in Europe/Berlin. Sein Manifest wird nicht erzeugt; Name, HTTP-Methode, Body, Header, Frist und Wiederholungsregel tragen Sie von Hand ein.
So wird die Funktionsumgebung zugeordnet
Eine Zeile je Einheit des Laufs: acht Ressourcen gelesen, sechs Migrationseinheiten.
| Google-Cloud-Ressource | STACKIT-Ziel im Lauf | Migrationsklasse |
|---|---|---|
| Cloud-Functions-Funktion (2. Generation) | STACKIT-Cloud-Foundry-App | Containerisieren |
| Cloud-Scheduler-Job | Kubernetes-CronJob auf SKE oder der Task-Scheduler von Cloud Foundry | Containerisieren |
| Pub/Sub-Topic | Exchange einer STACKIT-RabbitMQ-Instanz | Replatforming |
| Service Account | STACKIT-Service-Account | Rekonfigurieren |
| Secret-Manager-Secret | Schlüssel im STACKIT Secrets Manager; der Wert wird nie in den Entwurf kopiert | Rekonfigurieren |
| Cloud-Storage-Bucket (Funktionsquelle) | STACKIT-Object-Storage-Bucket | Rekonfigurieren |
Klassen, wie der Lauf sie entschieden hat. Die Zugriffsbindung des Secrets und das Quellarchiv-Objekt sind keine eigenen Einheiten.
Entscheidungen, die beim Architekten liegen
Offene Punkte des Laufs, zu finden in execution/manual/actions.md.
Anwendungsidentität
Legen Sie fest, wie die App an Zugangsdaten kommt. Funktionen, die den Metadatenserver nutzten, brauchen explizite STACKIT-Zugangsdaten oder Workload-Identität; der Lauf führt das für die Funktion und für ihren Service Account auf.
Netzwerk-Erreichbarkeit
Die Quellfunktion nimmt nur internen Verkehr an. Entscheiden Sie, wer die Cloud-Foundry-Route erreichen darf, und prüfen Sie die offenen Einstellungen, die der Lauf dem Netzwerkarchitekten zuweist.
Scale-to-zero und Abrechnung
Skalierung und Abrechnung je Aufruf entfallen. Dimensionieren Sie Instanzen nach der Last und akzeptieren Sie eine App, die auch im Leerlauf läuft.
Secret-Einstellungen
Legen Sie das Secret als Schlüssel in der entworfenen Secrets-Manager-Instanz neu an und entscheiden Sie, wer es lesen darf; die Einstellungen überlässt der Lauf dem Sicherheitsarchitekten.
Daten des Quell-Buckets
Der Lauf führt den Datenumzug des Buckets als Entscheidung ohne gewählten Mechanismus. Enthält der Bucket nur ein Deployment-Archiv, kann ein Neubau aus dem Quellcode einfacher sein als das Kopieren.
Messaging-Semantik
Der Trigger im Beispiel setzt retry_policy = RETRY_POLICY_RETRY. Bestätigungsfristen, Wiederholungen und Dead-Letter-Topics von Pub/Sub entsprechen laut Zuordnung des Laufs Bestätigungen, Requeueing und Dead-Letter-Exchanges. Legen Sie sie je Queue fest und machen Sie den Consumer robust gegen doppelt zugestellte Nachrichten.
Fragen von Entwicklerteams
Hat STACKIT einen Dienst wie Cloud Functions?
Laut Zuordnung des Laufs ist auf STACKIT kein Function-as-a-Service allgemein verfügbar. Die Funktion läuft als Cloud-Foundry-App oder als Container auf SKE; Skalierung und Abrechnung je Aufruf entfallen.
Was geschieht mit einem Pub/Sub-Trigger?
Er wird als Consumer neu geschrieben. Das Topic wird zum RabbitMQ-Exchange, und die Funktion liest eine daran gebundene Queue; der Code wechselt von Pub/Sub-Ereignissen zu AMQP-Nachrichten.
Erzeugt StackToIT das Cloud-Foundry-Manifest?
Nein. Es entwirft die Organization und führt auf, was ein Manifest braucht: Name, Speicher, Instanzen, Umgebung, Secrets und Netzwerkeinstellungen. Das Manifest schreiben Sie, und Sie pushen die App.
Prüft der Lauf, ob es ein Buildpack für unsere Laufzeit gibt?
Nein. Das Beispiel nutzt python312 mit dem Einstiegspunkt handle_paid_order, und der Lauf hält beides in seiner Zuordnungsnotiz für das Manifest fest. Ob für Ihre Sprache und Version ein Buildpack auf STACKIT Cloud Foundry verfügbar ist, klärt Ihr Team; falls nicht, bauen Sie ein Image und betreiben es auf SKE. Laut FAQ von STACKIT Cloud Foundry listet cf buildpacks die aktuell eingebauten Buildpacks auf, und voller Support gilt nur für diese; ein Community-Buildpack lässt sich über GitHub-URL und Versions-Tag angeben, aber nur vorübergehend.
Quellen
Ihr nächster Schritt: STACKIT.
Erzählen Sie uns von Ihrer Umgebung. Wir zeigen Ihnen, was StackToIT dafür liefert: Zielarchitektur, Terraform-Artefakte und einen strukturierten Migrationsplan.