Skip to main content

Mu

nox pypi

AWS Lambda support for Python projects.

Project Setup

To use mu, a project needs a pyproject.toml and either

  1. a mu.toml in the same directory (takes precedence); or
  2. tools.mu sections in the pyproject.toml

It also needs

  • Dockerfile
  • compose.yaml (or docker-compose.yaml if you insist)
  • An entry point in the app for the lambda events

An example application with these required elements can be found at: mu_hello

Usage: Local

Let's demonstrate usage with mu_hello. Assuming you have copied that source locally and are in the directory:

$ mu build
$ docker compose up mu-hello

# Watch current shell for log output and, in a new shell, run:
$ mu invoke --local

That command should have output like:

{'context': {'aws_request_id': '83fd7a58-5f6d-45e1-8092-b509c4f60898',
             'function_name': 'test_function',
             'function_version': '$LATEST',
             'invoked_function_arn': 'arn:aws:lambda:us-east-1:012345678912:function:test_function',
             'log_group_name': '/aws/lambda/Functions',
             'log_stream_name': '$LATEST',
             'memory_limit_in_mb': '3008',
             'remaining_time': 299967},
 'error': None,
 'event': {'action-args': [], 'do-action': 'diagnostics'}}

And the first shell should have output like:

11 Jun 2024 19:28:28,809 [INFO] (rapid) INIT START(type: on-demand, phase: init)
...
11 Jun 2024 19:28:28,843 [INFO] (rapid) INVOKE RTDONE(status: success, produced bytes: 0, duration: 0.724000ms)

Now invoke the hello command:

$ mu invoke --local hello
'Hello World from mu_hello'

# with arguments
$ mu invoke --local hello 'Capt. Picard'
'Hello Capt. Picard from mu_Hello'

# call a Click command
$ mu invoke --local cli
47

# And you should see the following in the docker shell
'Hello Alpha Quadrant from mu_Hello'

Usage: AWS

This is assuming you are (still) in the mu_hello directory and have AWS auth setup. aws sts get-caller-identity should be working.

Verify AWS auth:
$ mu auth-check
Account: 429812345678
Region: us-east-2
Organization owner: you@example.com

Note that mu has the concept of an "environment" which is used when naming objects to support provision and deployment for beta, prod, etc. There is a default environment that is part of the mu config and defaults to you.your-host.

# Ensure IAM and ECR infra. is in place for the enterprise environment
$ mu provision enterprise
    info  Role created: starfleet-mu-hello-lambda-enterprise
    info  Policy created: starfleet-mu-hello-lambda-enterprise-logs
    info  Policy created: starfleet-mu-hello-lambda-enterprise-ecr-repo
    info  Repository created: starfleet-mu-hello-enterprise
    info  Waiting 0.1s for role to be ready
    info  Waiting 0.25s for role to be ready
    ...[snip]...
    info  Provision finished for env: enterprise

# Build and push image, setup aws lambda
$ mu deploy --build enterprise
    info  docker compose build --pull
[+] Building 0.3s (10/10)
...[snip docker output]...
    info  Tagged, pushing...
    info  Tagged and pushed: 429829037495.dkr.ecr.us-east-2.amazonaws.com/starfleet-mu-hello-enterprise mu-hello-2024-06-11T21.31.09
    info  Deploying: 429829037495.dkr.ecr.us-east-2.amazonaws.com/starfleet-mu-hello-enterprise:mu-hello-2024-06-11T21.31.09
    info  Lambda function created: starfleet-mu-hello-handler-enterprise
    info  Function arn: arn:aws:lambda:us-east-2:429829037495:function:starfleet-mu-hello-handler-enterprise
    info  Waiting for lambda to be updated: starfleet-mu-hello-handler-enterprise


$ mu invoke --env enterprise
{'context': {'aws_request_id': 'cc44e34f-b7f1-4f2a-a314-e4dd2513b229'
...[snip]...

Usage: Async Tasks

Async task workers without a broker/queue:

from flask import Flask
import mu

app = Flask(__name__)


@mu.task
def ping_task(a, *, b):
    print('ping_task()', a, b)


@app.route('/ping')
def ping():
    # ping_task() will be called through async lambda invokation
    ping_task.invoke(1, b=2)
    return 'ok'


@mu.task(lambda_func='this-app-bigger-lambda')
def crunch_big_numbers(a, b, c):
    """ You can change the lambda name but it still needs to be this app.  """
    print('crunch_big_numbers()', a, b, c)

Be mindeful of:

Dev

Copier Template

Project structure and tooling mostly derives from the Coppy, see its documentation for context and additional instructions.

This project can be updated from the upstream repo, see Updating a Project.

Project Setup

From zero to hero (passing tests that is):

  1. Ensure host dependencies are installed

  2. Sync project virtualenv w/ lock file:

    uv sync

  3. Configure pre-commit:

    pre-commit install

  4. Run tests w/ nox or pytest but see notes just below first.

Testing

Credentials

This project has a lot of integration tests that use live AWS. You SHOULD have a dedicated AWS account for mu testing.

An env-config config is present which will use aws-vault and a "mu-test" profile to load AWS creds. But, you can use any method you prefer to setup credentials for boto3.

Running tests

  • Setup AWS credentials (see notes above)
  • Add mise.local.toml to override MU_TEST_ACCT_ID
  • nox or pytest
  • Some integration tests are marked as such (other integration tests should get marked)
    • pytest -m 'not integration' ...` will skip integration tests
    • pytest -m 'integration' ...` will target integration tests

Versions

Versions are date based. A bump action exists to help manage versions:

  # Show current version
  mise bump --show

  # Bump version based on date, tag, and push:
  mise bump

  # See other options
  mise bump -- --help

Metadata

Release files for aws-mu 0.20260617.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aws-mu 0.20260617.2
File Size Uploaded
aws_mu-0.20260617.2.tar.gz 112.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for aws-mu 0.20260617.2
File Interpreter ABI Platform
aws_mu-0.20260617.2-py3-none-any.whl Python 3 none any Details

Total release size: 154.5 kB

Release files / aws_mu-0.20260617.2.tar.gz

Download URL aws_mu-0.20260617.2.tar.gz
Size 112.8 kB
Tags Source
SHA-256 checksum
How to use checksums
5084b37730661c2278b065360e1b9b70273f17d43c5232bded37dbfda8fd1ffe
BLAKE2b-256 checksum
How to use checksums
ab444a26170c53c46e457bca990b294c366dad3d6ba76a46d1b3dfe144043b96
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 17, 2026.

Transparency log

Release files / aws_mu-0.20260617.2-py3-none-any.whl

Download URL aws_mu-0.20260617.2-py3-none-any.whl
Size 41.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0d7184f932d3637081c050e56b79dcc402022b5c94fa4c96eeaea68ddec83041
BLAKE2b-256 checksum
How to use checksums
7d22e71a7e8f5beb55ed8bc3701a735f50fb3c6ee4e0e1165d4a682adb1d7c69
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 17, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.20260617.2 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page