AWS LAMBDA → STACKIT · ARCHITECTURE

AWS Lambda on STACKIT: choose the container platform per function

A Lambda function is code plus a trigger plus a billing model. STACKIT carries the code as an always-on process, either as a Cloud Foundry app or as a container on SKE, and the trigger has to be rebuilt. StackToIT assessed a queue worker and a scheduled report function and classed them differently, because what invokes a function matters more than its runtime.

The options for one function

Pick per function, not per estate. A queue worker, an HTTP function and a nightly job rarely want the same platform.

OptionWhat changesTrade-off
Cloud Foundry appThe handler is wrapped in an HTTP server or worker loop and pushed with a manifest. Buildpacks stage the code.Little platform work and offline buildpacks for common languages. Whether a buildpack ships your exact runtime version is not documented, so check it. The run found no documented way to push a prebuilt image.
Container on SKEYou build an image and run it as a Deployment, Job or CronJob on a managed Kubernetes cluster.Keeps container-image functions as they are and gives schedules a native object. You operate the manifests, the registry and the image build.
Queue consumer inside the serviceThe consumer loop for the queue is written into the application, which reads from RabbitMQ.Removes the event-source mapping completely, but is a code change and a messaging redesign, not a deployment.
STACKIT Functions APICalls an API that the run found only as an early-version specification.StackToIT offers these calls only behind an explicit opt-in and never as a default step. Do not plan a production estate on it.

The Functions API row states what the run found. STACKIT's product overview listed no function service on 4 November 2026 (its runtime products are Cloud Foundry, Edge Cloud and Kubernetes Engine), and the stackitcloud/stackit provider, in the version the run used (0.121.0) and in 0.122.0, has no function resource.

A queue worker: the function and its trigger

Input written for this page and assessed on 4 November 2026. Left: a container-image function and its SQS event-source mapping. Right: the Cloud Foundry manifest StackToIT wrote for it, without the comment lines above it in the file.

Example inputmain.tf
resource "aws_lambda_function" "worker" {
  function_name = "orders-worker"
  role          = aws_iam_role.fn.arn
  package_type  = "Image"
  image_uri     = "123456789012.dkr.ecr.eu-central-1.amazonaws.com/orders-worker:1.4.0"
  memory_size   = 512
  timeout       = 60

  environment {
    variables = {
      QUEUE_URL = aws_sqs_queue.orders.url
    }
  }
}

resource "aws_lambda_event_source_mapping" "orders" {
  event_source_arn = aws_sqs_queue.orders.arn
  function_name    = aws_lambda_function.worker.arn
  batch_size       = 10
}
Cloud Foundry manifest by StackToITterraform/cloudfoundry/orders-worker/manifest.yml
---
applications:
- name: "orders-worker"
  memory: 512M
  instances: 1 # one always-on instance; size from peak concurrency (App AutoScaler for elasticity)
  stack: cflinuxfs4
  buildpacks:
  - ((buildpack))
  no-route: true
  health-check-type: process
  env:
    "QUEUE_URL": ((orders_worker_queue_url))
  • REDESIGN, confidence LOW

    Two findings stack up: an SQS event-source mapping has no trigger twin on STACKIT, and a container image gives a buildpack nothing to stage.

  • The worker runs without a route

    The manifest sets no-route and a process health check, because nothing calls the worker over HTTP. The comments in the file mark these two attributes as unconfirmed against STACKIT’s own documentation.

  • The queue moves with it

    The SQS queue is classed REPLATFORM, with a RabbitMQ instance drafted. Queue names and visibility timeout are not created; the consumer acknowledges instead.

A scheduled, HTTP-invoked function

The second function has a zip package, a schedule rule and a function URL. It is classed CONTAINERIZE with confidence MEDIUM. Right: its manifest, without the comment lines above it in the file.

Example inputmain.tf
resource "aws_lambda_function" "report" {
  function_name = "nightly-report"
  role          = aws_iam_role.fn.arn
  runtime       = "python3.12"
  handler       = "app.handler"
  filename      = "report.zip"
  memory_size   = 256
  timeout       = 300
}

resource "aws_cloudwatch_event_rule" "nightly" {
  name                = "nightly-report"
  schedule_expression = "cron(0 2 * * ? *)"
}
Cloud Foundry manifest by StackToITterraform/cloudfoundry/nightly-report/manifest.yml
---
applications:
- name: "nightly-report"
  memory: 256M
  instances: 1 # one always-on instance; size from peak concurrency (App AutoScaler for elasticity)
  stack: cflinuxfs4
  buildpacks:
  - python_buildpack_offline
  • Runtime mapped to a buildpack

    python3.12 maps to the offline Python buildpack. STACKIT lists that buildpack for the cflinuxfs4 stack, but not which Python versions it ships.

  • The schedule becomes a CronJob

    The EventBridge rule is classed CONTAINERIZE and drafts an SKE cluster. The CronJob manifest itself is written by hand.

  • IAM-protected URL, public route

    The function URL requires AWS IAM signing. A Cloud Foundry route is public, so the app must authenticate callers itself.

The platform blocks in Terraform

The two Terraform resources that carry these decisions: the organisation that hosts the apps and the cluster for containers. Spaces and apps are pushed with the cf tool, not Terraform.

STACKIT Terraform by StackToITterraform/apps.tf
resource "stackit_scf_organization" "migrated_apps" {
  project_id = var.project_id
  name       = "migrated-apps"
}
STACKIT Terraform by 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
  }]
}

How to decide for each function

  • What invokes it?

    An HTTP caller fits a Cloud Foundry route. A queue needs a consumer loop. A schedule fits a CronJob. Everything that invoked the function in AWS has to be rebuilt; the manifests state that no trigger carries over automatically.

  • How is it packaged?

    A zip package can go to a buildpack. A container image stays a container, so it goes to SKE.

  • Does it need scale to zero?

    Cloud Foundry and SKE run instances you size. The per-invocation billing and scale-to-zero of Lambda do not carry over. Short, rare jobs need not hold an instance as a CronJob: they run only on schedule, on nodes the cluster already has.

  • How long does a call run?

    The Lambda timeout is not carried: a manifest timeout is a start-up timeout. Put the limit into the application or the platform around it.

  • What does it hold?

    The execution role becomes a service account or service credentials supplied through the environment. List what the attached policies allowed and grant the same on the STACKIT targets.

Questions platform teams ask

Is there a Lambda equivalent on STACKIT?

Not as a generally available function service. As of November 2026 STACKIT's product overview lists none, and the Terraform provider has no function resource, neither in the version the run used nor in the current one. The container paths are Cloud Foundry and SKE.

Why is one function MEDIUM and the other LOW?

The nightly report is a zip package an offline buildpack can stage, and its function URL becomes a route, with a finding on authentication. The queue worker has an event-source mapping with no counterpart and a container image that buildpacks cannot stage.

Does StackToIT build my images or write my CronJobs?

No. It drafts the platform resources and the Cloud Foundry manifests, and it names what is left: the image build, the registry, the handler wrapper and the CronJob manifest.

What happens to idempotency?

AWS documents that an SQS event source mapping processes each event at least once and recommends idempotent code. A RabbitMQ consumer with acknowledgements has the same need, so keep that property.

Sources

Your next move: STACKIT.

Tell us about your estate. We show you what StackToIT delivers for it: target architecture, Terraform artifacts and a structured migration plan.