Deploy Rust to real AWS in 5 minutes.
Push an Axum / Actix-web / Rocket app to Lander. Cargo build, distroless container, per-customer Fargate, sub-100ms cold start. Same flow whether you're shipping an Axum API or a Yew SPA.[walkthrough · 5 minutes]
01
cargo-chef caches dependency compilation between builds. First deploy ~6min, subsequent deploys ~90s.Multi-stage Dockerfile with cargo-chef
# Dockerfile FROM rust:1.81 AS chef RUN cargo install cargo-chef WORKDIR /app FROM chef AS planner COPY . . RUN cargo chef prepare --recipe-path recipe.json FROM chef AS builder COPY --from=planner /app/recipe.json recipe.json RUN cargo chef cook --release --recipe-path recipe.json COPY . . RUN cargo build --release FROM gcr.io/distroless/cc-debian12 COPY --from=builder /app/target/release/server /server EXPOSE 80 ENV PORT=80 CMD ["/server"]
02
Axum example — read PORT from env, fall back to 80.Bind to $PORT in your handler setup
let port = std::env::var("PORT").unwrap_or("80".into());
let listener = tokio::net::TcpListener::bind(format!("0.0.0.0:{port}")).await?;
axum::serve(listener, app).await?;03
lander.host/onboard, install GitHub App, point at your repo. The first build takes longer because cargo-chef has to compile all your deps. Subsequent builds reuse the cargo-chef cache.Push and deploy
[why · lander vs vercel · railway · render]
- →Distroless Rust binary on per-customer Fargate = no JVM/Node overhead. Tight memory profile.
- →AWS Graviton2 arm64 native — Rust ARM perf is excellent.
- →WAF protects every endpoint at the ALB even before your handler sees a request.
[gotchas]
- ·Distroless `static` doesn't have a dynamic linker. If your binary links libssl, use `cc-debian12` instead.
- ·RUSTFLAGS='-C target-cpu=native' will make your binary not portable — Fargate runs on Graviton (arm64) by default. Don't set it.
- ·Long compile times: enable `incremental = false` in Cargo.toml for release builds — incremental builds slow CI.
[other stacks · same flow]