OpenWhisk
Overview
Apache OpenWhisk is an open-source, distributed serverless (Functions-as-a-Service) platform. You write small functions, called actions, and OpenWhisk runs each one inside an isolated container in response to a direct invocation or an event. It scales on demand and charges only for real execution time.
This guide covers the SecureAnyCloud Apache OpenWhisk image on Ubuntu 24.04 on Azure. The image is a complete, self-contained appliance built on the upstream Standalone mode (core/standalone). The OpenWhisk controller, invoker and datastore run together in a single process, and a local Docker daemon runs the real action containers as functions are invoked.
That gives you a working FaaS endpoint on first boot, without the full distributed OpenWhisk stack (Kafka, ZooKeeper, CouchDB and separate controller and invoker nodes), which is far too large for a single VM.
What you get:
- The official
openwhisk/standalonecontainer, with the controller, invoker and an in-memory datastore in one process, run under systemd asopenwhisk-standalone.service. It exposes the OpenWhisk REST API on port 3233 and the Playground UI on port 3232. - A local Docker daemon that runs the action-runtime containers as siblings, with the Node.js action runtime pre-pulled into the image so your first invocation runs fast and offline.
- The
wskcommand-line tool (Apache OpenWhisk CLI 1.2.0), preconfigured on the VM to talk to the local platform with this instance's own authentication key. - A per-instance authentication key generated on first boot and written to
/root/openwhisk-credentials.txt(mode 0600, root only), so no default or example credential is ever live. - A base OS patched at build time, with unattended security upgrades enabled.
Security by design: no usable default credential. Standalone OpenWhisk ships a well-known default authentication key for its guest namespace (23bc46b1-...:123zO3xZC..., published in the upstream source). On this image that key is never valid.
The platform service is gated, so it cannot start until a per-instance users configuration exists. On the first boot of every VM, a one-shot service generates a fresh uuid:key pair unique to that instance and starts the platform for the first time already carrying that key. It then proves that the upstream default key is rejected and writes the new key to /root/openwhisk-credentials.txt. There is no window in which the well-known default key can be used against your instance.
Prerequisites
- An active Azure subscription, an SSH public key, and a VNet with a subnet in your target region.
- A subscription to the Apache OpenWhisk listing on Azure Marketplace.
- A network security group (NSG) that allows TCP 22 for administration and TCP 3233 from the hosts that call the OpenWhisk API, for example your CI runners or a remote
wskclient.
The API is served over HTTP on port 3233. If you expose it beyond a trusted network, front it with your own TLS-terminating reverse proxy or restrict the NSG source.
Recommended virtual machine size: Standard_B2ms (2 vCPU, 8 GB RAM). The OpenWhisk controller and invoker form a JVM process, and each action runs in its own container, so 8 GB gives comfortable headroom for concurrent invocations.
The image is tuned to boot and run on a 4 GB Standard_B2s for light evaluation. Use Standard_B2ms for real workloads.
Deploy from the Azure Portal
Search the Azure Marketplace for Apache OpenWhisk, select the SecureAnyCloud publisher, and choose Create.
Configure the network security group to allow TCP 22 for administration and TCP 3233 from the hosts that call the API. Complete the wizard and create the VM.
Deploy from the Azure CLI
RG="openwhisk-prod"; LOCATION="eastus"; VM_NAME="openwhisk-01" IMAGE_URN="sac1647283583153:openwhisk:default:latest" SSH_KEY="$(cat ~/.ssh/id_rsa.pub)" az group create --name "$RG" --location "$LOCATION"
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:openwhisk:default:latest
az vm create \
--resource-group "$RG" --name "$VM_NAME" \
--image "$IMAGE_URN" \
--size Standard_B2ms \
--admin-username azureuser \
--ssh-key-values "$SSH_KEY" \
--public-ip-sku Standard
# Open the API port to the callers that need it:
az vm open-port --resource-group "$RG" --name "$VM_NAME" --port 3233 --priority 1010First boot and the per-instance key
On first boot, a one-shot service generates this instance's own authentication key, starts the platform and records the details. SSH in as azureuser and read the root-only credentials file:
sudo cat /root/openwhisk-credentials.txtExpected output. The key half is unique to your VM and is masked here:
# Apache OpenWhisk (Standalone) — Per-VM Credentials OPENWHISK_API_HOST=http://<your-vm-ip>:3233 OPENWHISK_GUEST_AUTH=5b636ff8-b85d-4fda-bff9-73306c885edf:********************************The wsk CLI on the VM is already configured with this key, so you can start using the platform immediately. Confirm that the platform is up:
systemctl is-active docker openwhisk-standalone curl -s http://127.0.0.1:3233/ping wsk namespace listThe curl .../ping request returns pong. The wsk namespace list command returns your guest namespace, which confirms that the CLI is authenticated against the local platform with this instance's key.
Create and invoke your first function
Create a small Node.js action and invoke it. The result comes back from a real Docker action container that executes your function:
cat > hello.js <<'EOF' function main(params) { return { greeting: 'Hello, ' + (params.name || 'world') + '!', runtime: process.version }; } EOF wsk action delete hello 2>/dev/null || true wsk action create hello hello.js --kind nodejs:default wsk action invoke hello --result --param name sacExpected output:
{ "greeting": "Hello, sac!", "runtime": "v20.19.0" }You can also invoke actions over the REST API, expose them as public web actions (wsk action create --web true), and chain them into sequences. For event-driven execution, attach triggers and rules. See the Apache OpenWhisk documentation for the full action, trigger and rule model.
Verify the security posture
This image ships no usable default credential. A helper on the VM proves the round trip: this instance's own key authenticates, while the well-known upstream default key is rejected.
sudo /usr/local/sbin/openwhisk-cred-roundtrip.shExpected output:
OKEvery invocation is recorded as an activation. List the activations and the action-runtime containers that the platform spawned:
sudo docker ps --format '{{.Names}} {{.Image}} {{.Status}}' wsk activation list --limit 3Connect a remote wsk client (optional)
To drive the platform from your workstation or CI, install the wsk CLI and point it at your VM. Use the API host and key from /root/openwhisk-credentials.txt:
# Run this on your workstation, not the VM. Replace <vm-ip> and the auth key. wsk property set --apihost http://<vm-ip>:3233 --auth <OPENWHISK_GUEST_AUTH> wsk action listThe API is served over HTTP on port 3233, so expose it only to trusted networks. Alternatively, place a TLS-terminating reverse proxy in front of it and restrict the NSG source ranges accordingly.
Support
SecureAnyCloud maintains this image and backs it with 24/7 support. For deployment help or questions about running Apache OpenWhisk on Azure, contact the SecureAnyCloud team through the Azure Marketplace listing.
Deploy on Azure
Launch Apache OpenWhisk on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com