GOOGLE CLOUD FUNCTIONS → STACKIT · GIDS

Google Cloud Functions naar STACKIT

STACKIT kent geen algemeen beschikbare function-as-a-service, dus een function wordt een app: een Cloud Foundry-app of een container op SKE. De code en de runtime verhuizen; de trigger niet, want een event uit Pub/Sub of Cloud Storage moet worden herschreven als consumer van de gemigreerde messaging- of opslagdienst. StackToIT deelt een function in als CONTAINERIZE en schrijft het platform eromheen.

De migratie, stap voor stap

De stappen volgen de eenheden van de voorbeeldrun, in de volgorde van de golven.

  1. Maak een lijst van functions per generatie en trigger

    Google documenteert twee generaties van Cloud Functions; de tweede generatie wordt beschreven in de Cloud Run-documentatie. Noteer per function de trigger (HTTP, Pub/Sub, storage-event, schema), runtime, geheugen, timeout, instancelimieten, ingress-instelling, service account en secrets.

  2. Kies het doelplatform

    Een Cloud Foundry-app past bij code die u met een buildpack pusht; een container op SKE past bij een function die al als image wordt geleverd of naast andere workloads moet staan. De run stelt voor de function Cloud Foundry voor en voor het schema SKE; consolideren op één platform is uw keuze.

  3. Verplaats eerst de fundamenten

    Service account, bronbucket en topic staan in golf 1 van de run; het secret volgt in golf 2. Het service account wordt een STACKIT-service account, de bucket een STACKIT Object Storage-bucket en het secret een sleutel in Secrets Manager.

  4. Herschrijf de trigger

    Het topic wordt een RabbitMQ-exchange en de subscription een queue. De code van de function stapt over van het Pub/Sub-event naar een AMQP-consumer, met bewust ingesteld bevestigings- en retrygedrag.

  5. Push de app

    Schrijf het manifest op basis van de lijst met niet overgenomen eigenschappen van de run. Voor het voorbeeld betekent dat de appnaam send-receipt, 256 MB geheugen, hoogstens 5 instances, de variabele MAIL_FROM en het secret MAIL_API_KEY; de timeout van 60 seconden van de function vergt een eigen beslissing. Push de app naar een space van de organization uit het concept.

  6. Maak het schema opnieuw aan

    Schrijf de CronJob, of een Cloud Foundry-task, die het nieuwe endpoint op het oude schema aanroept. Het endpointadres verandert, dus het doel van het schema verandert mee.

  7. Test, cutover, bewaar de oude function

    Publiceer testberichten, vergelijk de uitvoer met de function die nog draait, schakel de publishers over en verwijder de oude function na acceptatie. Dit is algemene praktijk, geen stap die de run uitvoert.

Een function met Pub/Sub-trigger, omgezet

Een omgeving die voor deze pagina is geschreven en op 4 november 2026 door StackToIT is beoordeeld: een function van de tweede generatie met een Pub/Sub-topic als trigger, het service account, een secret, een bronbucket en een nachtelijke Cloud Scheduler-job. Links: de function uit de invoer. Rechts: het blok dat de run ervoor als concept schreef; de reviewcommentaren boven het blok zijn hier weggelaten.

Voorbeeldinvoermain.tf
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"
  }
}
STACKIT-Terraform van StackToITterraform/apps.tf
resource "stackit_scf_organization" "migrated_apps" {
  project_id = var.project_id
  name       = "migrated-apps"
}
  • Een organization, geen app

    Het concept maakt de Cloud Foundry-organization aan die de gemigreerde apps host. De app zelf wordt met een manifest naar een space gepusht, en dat manifest genereert de run niet.

  • Wat in commentaren staat

    Naam, bronlocatie, geheugen, instances, omgeving, secrets en netwerkinstellingen staan vermeld als niet overgenomen, zodat u ze in het manifest kunt kopiëren.

  • Alleen-interne ingress wordt genoemd

    Een Cloud Foundry-app is bereikbaar op zijn route. De run meldt dat alleen-interne ingress niet wordt overgenomen en dat u moet beperken wie de app kan bereiken.

De trigger en het schema

De function draait niet alleen. Het topic en de schedulerjob worden een berichtenbroker en een cronjob, en de run schrijft de platforms die daarvoor nodig zijn als concept. Elk invoerblok staat naast het blok dat de run ervoor schreef; de reviewcommentaren zijn hier weggelaten.

Voorbeeldinvoer: topicmain.tf
resource "google_pubsub_topic" "orders_paid" {
  name = "orders-paid"
}
STACKIT-Terraform van StackToITterraform/messaging.tf
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)
  }
}
Voorbeeldinvoer: schedulerjobmain.tf
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"
  }
}
STACKIT-Terraform van StackToITterraform/kubernetes.tf
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
  }]
}
  • Van topic naar exchange

    Het topic wordt een exchange van een gedeelde RabbitMQ-instance, handmatig aangemaakt in RabbitMQ; subscriptions worden queues.

  • Van job naar CronJob

    De schedulerjob wordt een Kubernetes CronJob op SKE die het nieuwe endpoint van de function op hetzelfde schema aanroept, 0 3 * * * in Europe/Berlin. Het manifest wordt niet gegenereerd: naam, HTTP-methode, body, headers, deadline en retrybeleid schrijft u handmatig in.

Hoe de function-omgeving wordt gekoppeld

Eén rij per eenheid van de run: acht resources gescand, zes migratie-eenheden.

Google Cloud-resourceSTACKIT-doel in de runMigratieklasse
Cloud Functions-function (2e gen.)STACKIT Cloud Foundry-appContainerisatie
Cloud Scheduler-jobKubernetes CronJob op SKE, of de taskscheduler van Cloud FoundryContainerisatie
Pub/Sub-topicExchange van een STACKIT RabbitMQ-instanceReplatforming
Service accountSTACKIT-service accountHerconfiguratie
Secret Manager-secretSleutel in STACKIT Secrets Manager; de waarde wordt nooit in het concept gekopieerdHerconfiguratie
Cloud Storage-bucket (functionbron)STACKIT Object Storage-bucketHerconfiguratie

Klassen zoals de run ze bepaalde. De accessorbinding van Secret Manager en het bronarchief zijn geen eigen eenheden.

Beslissingen die de architect neemt

Openstaande punten van de run, te vinden in execution/manual/actions.md.

  • Identiteit van de applicatie

    Bepaal hoe de app inloggegevens krijgt. Functions die de metadata server gebruikten, hebben expliciete STACKIT-inloggegevens of workload identity nodig; de run noemt dit voor de function en voor zijn service account.

  • Bereikbaarheid via het netwerk

    De bronfunction accepteert alleen intern verkeer. Bepaal wie de Cloud Foundry-route mag bereiken en beoordeel de openstaande instellingen die de run aan de netwerkarchitect toewijst.

  • Scale-to-zero en facturering

    Schaling en facturering per aanroep vervallen. Dimensioneer instances op de belasting en accepteer een app die ook zonder belasting blijft draaien.

  • Secretinstellingen

    Maak het secret opnieuw aan als sleutel in de Secrets Manager-instance uit het concept en bepaal wie die mag lezen; de run laat secretinstellingen aan de security architect.

  • Data in de bronbucket

    De run legt de verplaatsing van de bucket vast als beslissing zonder gekozen mechanisme. Bevat de bucket alleen een deploymentarchief, dan is opnieuw bouwen vanuit de bron misschien eenvoudiger dan kopiëren.

  • Semantiek van de berichten

    De voorbeeldtrigger stelt retry_policy = RETRY_POLICY_RETRY in. Bevestigingstermijnen, retries en dead-lettertopics van Pub/Sub worden gekoppeld aan bevestigingen, requeueing en dead-letter-exchanges, zoals de mapping van de run aangeeft. Bepaal ze per queue en zorg dat de consumer hetzelfde bericht veilig twee keer kan verwerken.

Vragen van ontwikkelaars

Heeft STACKIT een dienst zoals Cloud Functions?

Volgens de mapping van de run is er geen function-as-a-service algemeen beschikbaar op STACKIT. De function draait als Cloud Foundry-app of als container op SKE, en schaling en facturering per aanroep worden niet overgenomen.

Wat gebeurt er met een Pub/Sub-trigger?

Die wordt herschreven als consumer. Het topic wordt een RabbitMQ-exchange en de function leest een queue die eraan is gebonden, dus de code gaat van Pub/Sub-events naar AMQP-berichten.

Genereert StackToIT het Cloud Foundry-manifest?

Nee. Het schrijft de organization als concept en noemt wat een manifest nodig heeft: naam, geheugen, instances, omgeving, secrets en netwerkinstellingen. U schrijft het manifest en pusht de app.

Controleert de run of er een buildpack bestaat voor onze runtime?

Nee. Het voorbeeld gebruikt python312 met het entrypoint handle_paid_order, en de run bewaart beide in zijn mappingnotitie voor het manifest. Of een buildpack voor uw taal en versie beschikbaar is op STACKIT Cloud Foundry, bevestigt uw team zelf; zo niet, bouw dan een image en draai dat op SKE. De Cloud Foundry-FAQ van STACKIT vermeldt dat cf buildpacks de huidige ingebouwde buildpacks toont en dat volledige ondersteuning alleen die dekt; een communitybuildpack kan met zijn GitHub-URL en versietag worden genoemd, maar alleen als tijdelijke maatregel.

Bronnen

Uw volgende stap: STACKIT.

Vertel ons over uw omgeving, dan laten wij zien wat StackToIT daarvoor oplevert: doelarchitectuur, Terraform-artefacten en een gestructureerd migratieplan.

Laat uw gegevens achter, onze specialisten nemen contact met u op.

Liever zelf een e-mail sturen? connect@stacktoit.com

Wij gebruiken uw gegevens alleen om dit verzoek te beantwoorden en een mogelijke pilot te bespreken. Privacyverklaring