Webassembly testen

Wer immer schonmal Webassembly testen wollte, hat derzeit mehrere Möglichkeiten.

Da ich mich insbesondere für die dafür notwendige Infrastruktur interessiere, habe ich mir zwei aktuelle Angebote angesehen:

Fermyon bietet auf github den "Fermyon Installer" an, mit dessen Hilfe man den "Fermyon Stack" lokal oder in verschiedenen Cloud Umgebungen ausrollen kann. Da keine für mich interessante Cloud dabei war, habe ich das Repository geforkt und den entsprechenden Terraform-Code hinzugefügt, um den "Fermyon Stack" auf Triton auszurollen.

Der "Fermyon Stack" besteht aus den Hashicorp Komponenten Nomad, Consul und Vault. Als Loadbalancer kommt noch Traefik dazu. Die eigentliche Webassembly-Plattform braucht noch Bindle, Hippo und Spin.

Der Installer erzeugt im Wesentlichen eine Cloudinstanz, auf die dann die genannten Komponenten heruntergeladen werden. Nomad, Consul und Vault werden jeweils im Dev-Modus gestartet (ist ja auch ein Entwicklungs-Setup) und Bindle, Hippo und Traefik werden dann als Nomad Jobs in Nomad ausgerollt. Deshalb sind auch alle Admin-Schnittstellen frei erreichbar:

Traefik sorgt dann dafür, dass man die laufenden Jobs über die Ports 80 und 443 erreichen kann.

Die aufmerksame Leserin wird sich jetzt fragen: "Und wo ist Docker?" oder "Und wo ist Podman?". Die Antwort ist einfach: Nirgends.

Alle drei Nomad Jobs verwenden den "raw_exec" Driver von Nomad, denn sowohl Hippo als auch Bindle sind einfache Rust-Binaries. Und Traefik ist ein Go-Binary.

task "bindle" {
  driver = "raw_exec"

  env {
    RUST_LOG = "error,bindle=debug"
  }

[...]

task "hippo" {
  driver = "raw_exec"

  env {
    # Enable for debug logging
    # Logging__LogLevel__Default = "Debug"

    Hippo__PlatformDomain = var.domain
    Scheduler__Driver     = "nomad"

[...]

task "traefik" {
  driver = "raw_exec"

  config {
    command = "traefik"
    args = [
      "--configfile", "local/traefik.toml"
    ]
  }

In Triton ist es relativ einfach per CNS entsprechende Service-Namen im DNS zu generieren:

resource "triton_machine" "spin" {
    name = var.instance_name
    package = var.package_name

    image = data.triton_image.os.id

    cns {
        services = ["bindle", "hippo"]
    }
    
    [...]

Als Fallback - falls kein dynamisches DNS zur Verfügung steht - wird sslip.io verwendet - davon hatte ich vorher noch nichts gehört.

Wenn sich die Umgebung selbst installiert hat, kann man dann mit der Entwicklung in Webassenbly mit Spin beginnen. Dazu lädt man sich das Spin-Binary herunter und folgt am Besten den Anweisungen unter https://spin.fermyon.dev/quickstart.

Beim Einloggen mit spin login muß man ggfs. auf den Parameter -k zurückgreifen, wenn (noch) keine "echten" SSL-Zertifikate vorliegen.

Einen guten Einstieg stellt auch das Video der Rawkode Academy dar:

Mit wasmCloud habe ich mich noch nicht so intensiv beschäftigt, es ließ sich aber auch relativ einfach in Nomad ausrollen, da es als Nomad-Pack vorliegt.  

In dem Fall wird aber der Docker Driver von Nomad verwendet. WasmCloud ist in Elixir geschrieben und verwendet deshalb die ErlangVM. Nats ist in Go geschrieben.

Nach dem Start des Jobs wird die wasmCloud Weboberfläche verfügbar:

Als nächstes, sollte man mit dem "Getting Started" loslegen können.