Builds the Lambda package for a release configured with Mayfly.Release:
a lambda.zip (copied to --outdir) or, with --image, a container image
for Lambda's image package type.
mix lambda.build # native: MIX_ENV=prod mix release lambda
mix lambda.build --docker # inside Amazon Linux 2023, x86_64
mix lambda.build --docker --arch arm64
mix lambda.build --release other --env staging --outdir ./deploy
mix lambda.build --image --arch arm64 # container image my_app-lambda:latest
mix lambda.build --image --arch arm64 --push 123456789012.dkr.ecr.eu-central-1.amazonaws.com/my-appWithout --docker, the release is built on this machine. That is correct
when the release uses the Mayfly ERTS layer (mayfly: [layer: true]) or when
you are on Amazon Linux 2023 with the target architecture; otherwise use
--docker so the bundled ERTS matches Lambda.
Container images (--image)
The release is built inside the Amazon Linux 2023 build container (as with
--docker) and copied into an image based on
public.ecr.aws/lambda/provided:al2023, at /var/task, with the
function handler as the image CMD. The base image's entrypoint runs the
Runtime Interface Emulator when AWS_LAMBDA_RUNTIME_API is unset, so the
image can be invoked locally:
finch run --rm --platform linux/arm64 -p 9000:8080 my_app-lambda:latest
curl -d '{"name":"x"}' localhost:9000/2015-03-31/functions/function/invocationsReleases with bundled ERTS and releases built for the Mayfly layer both
work; in the latter case /opt/erlang from the build image is copied into
the function image. Native dependencies (NIFs) are compiled in the build
stage, so no layer and no local toolchain are needed. Put a
lambda.image.Dockerfile in your project to customise the image (system
packages, extra files); it receives the build args RELEASE_DIR (release
directory relative to the project), BUILD_IMAGE and HANDLER.
--push REPO_URI logs in to ECR with the AWS CLI, tags and pushes, and
prints the aws lambda create-function --package-type Image command with
the image digest.
Options
--release, -r Release name (default: first release in mix.exs)
--env, -e MIX_ENV for the release (default: prod)
--outdir, -o Where to copy lambda.zip (default: current directory)
--docker, -d Build inside a container from lambda.Dockerfile (docker or finch)
--arch, -a x86_64 (default) or arm64, Docker and image builds
--image Build a container image instead of a zip (implies --docker)
--tag, -t Image name:tag (default: <app>-lambda:latest)
--push ECR repository URI to push the image to
--build-image Tag of the Amazon Linux build image (default: mayfly-build-<app>)