Repository files navigation

Python Package Builder for AWS Lambda

Build AWS Lambda deployment packages and layers for multiple Python versions (3.10+) and architectures (x86_64/arm64).

CodeQLDependabotBuild and ReleaseGithub Pages

Inspired by LambdaZipper

Features

  • 🐍 Multiple Python versions: Support for Python 3.10, 3.11, 3.12, 3.13, and 3.14 (default)
  • 🏗️ Multi-architecture: Build for both x86_64 (amd64) and arm64 (aarch64) by default
  • 📦 Bulk packaging: Uses requirements.txt by default to package multiple dependencies
  • 🔄 Two output formats: Single combined archive (default) or individual archives per package
  • Fast builds: Based on Amazon Linux 2023 for compatibility with Lambda runtime
  • 🚀 Zero-config: Run without arguments for sensible defaults

Quick Start

Default Usage (Recommended)

Simply run the build script with no arguments:

./build-multiarch.sh

Default behavior:

  • Uses Python 3.14 (latest)
  • Reads from requirements.txt in the current directory
  • Builds for both x86_64 and arm64 architectures
  • Creates single combined archive per architecture
  • Automatically uses the correct Amazon Linux version for Lambda compatibility

Result: combined-python3.14-x86_64.zip and combined-python3.14-aarch64.zip in ./output/

Note: This tool uses Amazon Linux 2 for Python 3.10-3.11 and Amazon Linux 2023 for Python 3.12+ to ensure compatibility with AWS Lambda Python runtimes.

Customizing the Build

# Use a specific Python version
./build-multiarch.sh --python 3.13
# Build only for x86_64
./build-multiarch.sh --skip-arm64
# Create individual archives per package
./build-multiarch.sh --individual
# Build a single package instead of requirements.txt
./build-multiarch.sh --package numpy
# Combine options
./build-multiarch.sh --python 3.12 --skip-arm64 --individual

Command Reference

build-multiarch.sh Options

OptionDescriptionDefault
--python VERSIONPython version (3.10-3.14)3.14
-r, --requirements FILEPath to requirements.txtrequirements.txt
--package NAMESingle package name (overrides requirements.txt)-
--skip-x86, --skip-amd64Skip x86_64 architecture buildBuild both
--skip-arm64Skip arm64 architecture buildBuild both
--individualCreate individual archives per packageSingle combined
--image NAMECustom Docker image namelambda-zipper
--helpShow help message-

Usage Examples

# Default: Python 3.14, requirements.txt, multi-arch, combined archive
./build-multiarch.sh
# Use different Python version
./build-multiarch.sh --python 3.13
# Build only for x86_64 architecture
./build-multiarch.sh --skip-arm64
# Create individual archives for each package
./build-multiarch.sh --individual
# Use custom requirements file
./build-multiarch.sh -r ./my-requirements.txt
# Build a single package (ignores requirements.txt)
./build-multiarch.sh --package numpy
# Combine multiple options
./build-multiarch.sh --python 3.12 --skip-arm64 --individual -r prod-requirements.txt

Advanced Usage

Manual Docker Build (Lower-Level)

For direct Docker control, you can build and run containers manually:

Single Package Mode

Build a Docker image:

docker build --build-arg PYTHON_VERSION=3.14 -t lambda-zipper .

Package a single library:

docker run --rm -v $(pwd)/output:/package lambda-zipper numpy

Requirements.txt with Individual Archives

docker run --rm \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper

Requirements.txt with Combined Archive

docker run --rm \
-e SINGLE_FILE=true \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper

Supported Python Versions

This project automatically uses the appropriate Amazon Linux version based on AWS Lambda Python runtime requirements:

Python VersionBase OSInstallation MethodLambda Runtime Compatibility
3.10Amazon Linux 2Built from source✅ python3.10 runtime
3.11Amazon Linux 2Built from source✅ python3.11 runtime
3.12Amazon Linux 2023dnf package✅ python3.12 runtime
3.13Amazon Linux 2023dnf package✅ python3.13 runtime
3.14Amazon Linux 2023Built from source⚙️ Future runtime (Default)

Key Points:

  • Python 3.10 & 3.11: Use Amazon Linux 2 (matches Lambda runtime environment)
  • Python 3.12 & 3.13: Use Amazon Linux 2023 (matches Lambda runtime environment)
  • Python 3.14: Uses Amazon Linux 2023, compiled from source for latest features
  • All versions are built with development headers for compiling binary packages

Output Formats

Lambda Layer Format

python/
lib/
pythonX.Y/
site-packages/
[your packages here]

Upload as a Lambda Layer in the AWS Console.

Flat Deployment Format

[your packages at root level]

Extract into your Lambda deployment package alongside your code.

Architecture Support

  • x86_64 (amd64): Standard Lambda runtime
  • arm64 (aarch64): AWS Graviton2 Lambda runtime (cost-effective)

Choose the architecture that matches your Lambda function configuration.

Real-World Examples

Data Science Stack

Create requirements.txt:

numpy==1.26.4
pandas==2.1.4
scipy==1.11.4
scikit-learn==1.3.2

Build with defaults (Python 3.14, multi-arch, combined archive):

./build-multiarch.sh

Result: combined-python3.14-x86_64.zip and combined-python3.14-aarch64.zip ready for Lambda Layer

Web Scraping Stack

Create requirements.txt:

requests==2.31.0
beautifulsoup4==4.12.2
lxml==4.9.3

Build for Python 3.13, x86_64 only:

./build-multiarch.sh --python 3.13 --skip-arm64

Computer Vision with OpenCV

Create requirements.txt:

Pillow==10.2.0
opencv-python-headless==4.9.0.80
numpy==1.26.4

Build individual archives for selective deployment:

./build-multiarch.sh --individual

Result: Separate archives for each package, allowing you to pick and choose

AWS SDK Only (Single Package)

Build only boto3 for both architectures:

./build-multiarch.sh --package boto3

Result: boto3-python3.14-x86_64.zip and boto3-python3.14-aarch64.zip

Legacy Python Version Support

Build for Python 3.10 with specific requirements:

./build-multiarch.sh --python 3.10 -r legacy-requirements.txt

Project Structure

.
├── Dockerfile.al2 # Amazon Linux 2 image (Python 3.10-3.11)
├── Dockerfile.al2023 # Amazon Linux 2023 image (Python 3.12-3.14)
├── Dockerfile # Default (points to AL2023)
├── package.sh # Packaging script with requirements.txt support
├── build-multiarch.sh # Helper script for multi-arch builds
├── requirements.example.txt
└── readme.md

How It Works

  1. Base Image Selection: Automatically chooses Amazon Linux 2 (for Python 3.10-3.11) or Amazon Linux 2023 (for Python 3.12+) to match AWS Lambda runtime environments
  2. Python Installation: Installs specified Python version (3.10-3.14) with development headers
  3. Package Installation: Uses pip with --target flag to install packages with proper dependencies
  4. Packaging: Creates zip archives with proper Lambda Layer structure (python/lib/pythonX.Y/site-packages/)
  5. Multi-arch: Leverages Docker buildx for platform-specific builds (x86_64 and arm64)
  6. Runtime Compatibility: Ensures binary compatibility with AWS Lambda execution environments

Troubleshooting

Docker buildx not available

Enable buildx in Docker Desktop settings or install manually:

docker buildx version

Requirements file not found

By default, the script looks for requirements.txt in the current directory. Specify a different file:

./build-multiarch.sh -r path/to/my-requirements.txt

Package has binary dependencies

The build includes gcc, g++, and cmake for compiling binary extensions. Most packages should work, but some may require additional system libraries. Modify the Dockerfile to add specific dependencies.

Lambda Layer size limits

Lambda has a 250MB (unzipped) limit for layers. For large packages:

  • Use --individual flag to split packages into separate archives
  • Deploy multiple smaller layers
  • Use Lambda deployment package directly
  • Consider AWS Lambda Extensions or Container Images

Build takes too long

Python 3.14 is compiled from source and takes longer. For faster builds:

  • Use Python 3.13 or earlier: ./build-multiarch.sh --python 3.13
  • Build only one architecture: ./build-multiarch.sh --skip-arm64
  • Docker caches layers, so subsequent builds are faster

Advanced Docker Usage

Custom Dockerfile Modifications

Add system dependencies:

# Add after the base install in DockerfileRUN dnf -y install postgresql-devel libxml2-devel

Building Without the Helper Script

# Build for specific platform
docker buildx build \
--platform linux/amd64 \
--build-arg PYTHON_VERSION=3.14 \
-t lambda-zipper:custom \
--load .# Run with requirements (combined archive)
docker run --rm \
-e SINGLE_FILE=true \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper:custom
# Run with single package
docker run --rm \
-v $(pwd)/output:/package \
lambda-zipper:custom numpy

Output File Naming

Archives are named with the following pattern:

Combined archives (default):

  • combined-python{VERSION}-{ARCH}.zip
  • Example: combined-python3.14-x86_64.zip, combined-python3.14-aarch64.zip

Individual package archives (with --individual):

  • {PACKAGE}-python{VERSION}-{ARCH}.zip
  • Example: numpy-python3.14-x86_64.zip, requests-python3.13-aarch64.zip

Contributing

Feel free to submit issues and enhancement requests!

License

This project is open source and available for use and modification.

About

Easily create AWS Lambda Layers of Python packages

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Python Package Builder for AWS Lambda

Build AWS Lambda deployment packages and layers for multiple Python versions (3.10+) and architectures (x86_64/arm64).

CodeQLDependabotBuild and ReleaseGithub Pages

Inspired by LambdaZipper

Features

  • 🐍 Multiple Python versions: Support for Python 3.10, 3.11, 3.12, 3.13, and 3.14 (default)
  • 🏗️ Multi-architecture: Build for both x86_64 (amd64) and arm64 (aarch64) by default
  • 📦 Bulk packaging: Uses requirements.txt by default to package multiple dependencies
  • 🔄 Two output formats: Single combined archive (default) or individual archives per package
  • Fast builds: Based on Amazon Linux 2023 for compatibility with Lambda runtime
  • 🚀 Zero-config: Run without arguments for sensible defaults

Quick Start

Default Usage (Recommended)

Simply run the build script with no arguments:

./build-multiarch.sh

Default behavior:

  • Uses Python 3.14 (latest)
  • Reads from requirements.txt in the current directory
  • Builds for both x86_64 and arm64 architectures
  • Creates single combined archive per architecture
  • Automatically uses the correct Amazon Linux version for Lambda compatibility

Result: combined-python3.14-x86_64.zip and combined-python3.14-aarch64.zip in ./output/

Note: This tool uses Amazon Linux 2 for Python 3.10-3.11 and Amazon Linux 2023 for Python 3.12+ to ensure compatibility with AWS Lambda Python runtimes.

Customizing the Build

# Use a specific Python version
./build-multiarch.sh --python 3.13
# Build only for x86_64
./build-multiarch.sh --skip-arm64
# Create individual archives per package
./build-multiarch.sh --individual
# Build a single package instead of requirements.txt
./build-multiarch.sh --package numpy
# Combine options
./build-multiarch.sh --python 3.12 --skip-arm64 --individual

Command Reference

build-multiarch.sh Options

OptionDescriptionDefault
--python VERSIONPython version (3.10-3.14)3.14
-r, --requirements FILEPath to requirements.txtrequirements.txt
--package NAMESingle package name (overrides requirements.txt)-
--skip-x86, --skip-amd64Skip x86_64 architecture buildBuild both
--skip-arm64Skip arm64 architecture buildBuild both
--individualCreate individual archives per packageSingle combined
--image NAMECustom Docker image namelambda-zipper
--helpShow help message-

Usage Examples

# Default: Python 3.14, requirements.txt, multi-arch, combined archive
./build-multiarch.sh
# Use different Python version
./build-multiarch.sh --python 3.13
# Build only for x86_64 architecture
./build-multiarch.sh --skip-arm64
# Create individual archives for each package
./build-multiarch.sh --individual
# Use custom requirements file
./build-multiarch.sh -r ./my-requirements.txt
# Build a single package (ignores requirements.txt)
./build-multiarch.sh --package numpy
# Combine multiple options
./build-multiarch.sh --python 3.12 --skip-arm64 --individual -r prod-requirements.txt

Advanced Usage

Manual Docker Build (Lower-Level)

For direct Docker control, you can build and run containers manually:

Single Package Mode

Build a Docker image:

docker build --build-arg PYTHON_VERSION=3.14 -t lambda-zipper .

Package a single library:

docker run --rm -v $(pwd)/output:/package lambda-zipper numpy

Requirements.txt with Individual Archives

docker run --rm \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper

Requirements.txt with Combined Archive

docker run --rm \
-e SINGLE_FILE=true \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper

Supported Python Versions

This project automatically uses the appropriate Amazon Linux version based on AWS Lambda Python runtime requirements:

Python VersionBase OSInstallation MethodLambda Runtime Compatibility
3.10Amazon Linux 2Built from source✅ python3.10 runtime
3.11Amazon Linux 2Built from source✅ python3.11 runtime
3.12Amazon Linux 2023dnf package✅ python3.12 runtime
3.13Amazon Linux 2023dnf package✅ python3.13 runtime
3.14Amazon Linux 2023Built from source⚙️ Future runtime (Default)

Key Points:

  • Python 3.10 & 3.11: Use Amazon Linux 2 (matches Lambda runtime environment)
  • Python 3.12 & 3.13: Use Amazon Linux 2023 (matches Lambda runtime environment)
  • Python 3.14: Uses Amazon Linux 2023, compiled from source for latest features
  • All versions are built with development headers for compiling binary packages

Output Formats

Lambda Layer Format

python/
lib/
pythonX.Y/
site-packages/
[your packages here]

Upload as a Lambda Layer in the AWS Console.

Flat Deployment Format

[your packages at root level]

Extract into your Lambda deployment package alongside your code.

Architecture Support

  • x86_64 (amd64): Standard Lambda runtime
  • arm64 (aarch64): AWS Graviton2 Lambda runtime (cost-effective)

Choose the architecture that matches your Lambda function configuration.

Real-World Examples

Data Science Stack

Create requirements.txt:

numpy==1.26.4
pandas==2.1.4
scipy==1.11.4
scikit-learn==1.3.2

Build with defaults (Python 3.14, multi-arch, combined archive):

./build-multiarch.sh

Result: combined-python3.14-x86_64.zip and combined-python3.14-aarch64.zip ready for Lambda Layer

Web Scraping Stack

Create requirements.txt:

requests==2.31.0
beautifulsoup4==4.12.2
lxml==4.9.3

Build for Python 3.13, x86_64 only:

./build-multiarch.sh --python 3.13 --skip-arm64

Computer Vision with OpenCV

Create requirements.txt:

Pillow==10.2.0
opencv-python-headless==4.9.0.80
numpy==1.26.4

Build individual archives for selective deployment:

./build-multiarch.sh --individual

Result: Separate archives for each package, allowing you to pick and choose

AWS SDK Only (Single Package)

Build only boto3 for both architectures:

./build-multiarch.sh --package boto3

Result: boto3-python3.14-x86_64.zip and boto3-python3.14-aarch64.zip

Legacy Python Version Support

Build for Python 3.10 with specific requirements:

./build-multiarch.sh --python 3.10 -r legacy-requirements.txt

Project Structure

.
├── Dockerfile.al2 # Amazon Linux 2 image (Python 3.10-3.11)
├── Dockerfile.al2023 # Amazon Linux 2023 image (Python 3.12-3.14)
├── Dockerfile # Default (points to AL2023)
├── package.sh # Packaging script with requirements.txt support
├── build-multiarch.sh # Helper script for multi-arch builds
├── requirements.example.txt
└── readme.md

How It Works

  1. Base Image Selection: Automatically chooses Amazon Linux 2 (for Python 3.10-3.11) or Amazon Linux 2023 (for Python 3.12+) to match AWS Lambda runtime environments
  2. Python Installation: Installs specified Python version (3.10-3.14) with development headers
  3. Package Installation: Uses pip with --target flag to install packages with proper dependencies
  4. Packaging: Creates zip archives with proper Lambda Layer structure (python/lib/pythonX.Y/site-packages/)
  5. Multi-arch: Leverages Docker buildx for platform-specific builds (x86_64 and arm64)
  6. Runtime Compatibility: Ensures binary compatibility with AWS Lambda execution environments

Troubleshooting

Docker buildx not available

Enable buildx in Docker Desktop settings or install manually:

docker buildx version

Requirements file not found

By default, the script looks for requirements.txt in the current directory. Specify a different file:

./build-multiarch.sh -r path/to/my-requirements.txt

Package has binary dependencies

The build includes gcc, g++, and cmake for compiling binary extensions. Most packages should work, but some may require additional system libraries. Modify the Dockerfile to add specific dependencies.

Lambda Layer size limits

Lambda has a 250MB (unzipped) limit for layers. For large packages:

  • Use --individual flag to split packages into separate archives
  • Deploy multiple smaller layers
  • Use Lambda deployment package directly
  • Consider AWS Lambda Extensions or Container Images

Build takes too long

Python 3.14 is compiled from source and takes longer. For faster builds:

  • Use Python 3.13 or earlier: ./build-multiarch.sh --python 3.13
  • Build only one architecture: ./build-multiarch.sh --skip-arm64
  • Docker caches layers, so subsequent builds are faster

Advanced Docker Usage

Custom Dockerfile Modifications

Add system dependencies:

# Add after the base install in DockerfileRUN dnf -y install postgresql-devel libxml2-devel

Building Without the Helper Script

# Build for specific platform
docker buildx build \
--platform linux/amd64 \
--build-arg PYTHON_VERSION=3.14 \
-t lambda-zipper:custom \
--load .# Run with requirements (combined archive)
docker run --rm \
-e SINGLE_FILE=true \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper:custom
# Run with single package
docker run --rm \
-v $(pwd)/output:/package \
lambda-zipper:custom numpy

Output File Naming

Archives are named with the following pattern:

Combined archives (default):

  • combined-python{VERSION}-{ARCH}.zip
  • Example: combined-python3.14-x86_64.zip, combined-python3.14-aarch64.zip

Individual package archives (with --individual):

  • {PACKAGE}-python{VERSION}-{ARCH}.zip
  • Example: numpy-python3.14-x86_64.zip, requests-python3.13-aarch64.zip

Contributing

Feel free to submit issues and enhancement requests!

License

This project is open source and available for use and modification.

About

Easily create AWS Lambda Layers of Python packages

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Python Package Builder for AWS Lambda

Build AWS Lambda deployment packages and layers for multiple Python versions (3.10+) and architectures (x86_64/arm64).

CodeQLDependabotBuild and ReleaseGithub Pages

Inspired by LambdaZipper

Features

  • 🐍 Multiple Python versions: Support for Python 3.10, 3.11, 3.12, 3.13, and 3.14 (default)
  • 🏗️ Multi-architecture: Build for both x86_64 (amd64) and arm64 (aarch64) by default
  • 📦 Bulk packaging: Uses requirements.txt by default to package multiple dependencies
  • 🔄 Two output formats: Single combined archive (default) or individual archives per package
  • Fast builds: Based on Amazon Linux 2023 for compatibility with Lambda runtime
  • 🚀 Zero-config: Run without arguments for sensible defaults

Quick Start

Default Usage (Recommended)

Simply run the build script with no arguments:

./build-multiarch.sh

Default behavior:

  • Uses Python 3.14 (latest)
  • Reads from requirements.txt in the current directory
  • Builds for both x86_64 and arm64 architectures
  • Creates single combined archive per architecture
  • Automatically uses the correct Amazon Linux version for Lambda compatibility

Result: combined-python3.14-x86_64.zip and combined-python3.14-aarch64.zip in ./output/

Note: This tool uses Amazon Linux 2 for Python 3.10-3.11 and Amazon Linux 2023 for Python 3.12+ to ensure compatibility with AWS Lambda Python runtimes.

Customizing the Build

# Use a specific Python version
./build-multiarch.sh --python 3.13
# Build only for x86_64
./build-multiarch.sh --skip-arm64
# Create individual archives per package
./build-multiarch.sh --individual
# Build a single package instead of requirements.txt
./build-multiarch.sh --package numpy
# Combine options
./build-multiarch.sh --python 3.12 --skip-arm64 --individual

Command Reference

build-multiarch.sh Options

OptionDescriptionDefault
--python VERSIONPython version (3.10-3.14)3.14
-r, --requirements FILEPath to requirements.txtrequirements.txt
--package NAMESingle package name (overrides requirements.txt)-
--skip-x86, --skip-amd64Skip x86_64 architecture buildBuild both
--skip-arm64Skip arm64 architecture buildBuild both
--individualCreate individual archives per packageSingle combined
--image NAMECustom Docker image namelambda-zipper
--helpShow help message-

Usage Examples

# Default: Python 3.14, requirements.txt, multi-arch, combined archive
./build-multiarch.sh
# Use different Python version
./build-multiarch.sh --python 3.13
# Build only for x86_64 architecture
./build-multiarch.sh --skip-arm64
# Create individual archives for each package
./build-multiarch.sh --individual
# Use custom requirements file
./build-multiarch.sh -r ./my-requirements.txt
# Build a single package (ignores requirements.txt)
./build-multiarch.sh --package numpy
# Combine multiple options
./build-multiarch.sh --python 3.12 --skip-arm64 --individual -r prod-requirements.txt

Advanced Usage

Manual Docker Build (Lower-Level)

For direct Docker control, you can build and run containers manually:

Single Package Mode

Build a Docker image:

docker build --build-arg PYTHON_VERSION=3.14 -t lambda-zipper .

Package a single library:

docker run --rm -v $(pwd)/output:/package lambda-zipper numpy

Requirements.txt with Individual Archives

docker run --rm \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper

Requirements.txt with Combined Archive

docker run --rm \
-e SINGLE_FILE=true \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper

Supported Python Versions

This project automatically uses the appropriate Amazon Linux version based on AWS Lambda Python runtime requirements:

Python VersionBase OSInstallation MethodLambda Runtime Compatibility
3.10Amazon Linux 2Built from source✅ python3.10 runtime
3.11Amazon Linux 2Built from source✅ python3.11 runtime
3.12Amazon Linux 2023dnf package✅ python3.12 runtime
3.13Amazon Linux 2023dnf package✅ python3.13 runtime
3.14Amazon Linux 2023Built from source⚙️ Future runtime (Default)

Key Points:

  • Python 3.10 & 3.11: Use Amazon Linux 2 (matches Lambda runtime environment)
  • Python 3.12 & 3.13: Use Amazon Linux 2023 (matches Lambda runtime environment)
  • Python 3.14: Uses Amazon Linux 2023, compiled from source for latest features
  • All versions are built with development headers for compiling binary packages

Output Formats

Lambda Layer Format

python/
lib/
pythonX.Y/
site-packages/
[your packages here]

Upload as a Lambda Layer in the AWS Console.

Flat Deployment Format

[your packages at root level]

Extract into your Lambda deployment package alongside your code.

Architecture Support

  • x86_64 (amd64): Standard Lambda runtime
  • arm64 (aarch64): AWS Graviton2 Lambda runtime (cost-effective)

Choose the architecture that matches your Lambda function configuration.

Real-World Examples

Data Science Stack

Create requirements.txt:

numpy==1.26.4
pandas==2.1.4
scipy==1.11.4
scikit-learn==1.3.2

Build with defaults (Python 3.14, multi-arch, combined archive):

./build-multiarch.sh

Result: combined-python3.14-x86_64.zip and combined-python3.14-aarch64.zip ready for Lambda Layer

Web Scraping Stack

Create requirements.txt:

requests==2.31.0
beautifulsoup4==4.12.2
lxml==4.9.3

Build for Python 3.13, x86_64 only:

./build-multiarch.sh --python 3.13 --skip-arm64

Computer Vision with OpenCV

Create requirements.txt:

Pillow==10.2.0
opencv-python-headless==4.9.0.80
numpy==1.26.4

Build individual archives for selective deployment:

./build-multiarch.sh --individual

Result: Separate archives for each package, allowing you to pick and choose

AWS SDK Only (Single Package)

Build only boto3 for both architectures:

./build-multiarch.sh --package boto3

Result: boto3-python3.14-x86_64.zip and boto3-python3.14-aarch64.zip

Legacy Python Version Support

Build for Python 3.10 with specific requirements:

./build-multiarch.sh --python 3.10 -r legacy-requirements.txt

Project Structure

.
├── Dockerfile.al2 # Amazon Linux 2 image (Python 3.10-3.11)
├── Dockerfile.al2023 # Amazon Linux 2023 image (Python 3.12-3.14)
├── Dockerfile # Default (points to AL2023)
├── package.sh # Packaging script with requirements.txt support
├── build-multiarch.sh # Helper script for multi-arch builds
├── requirements.example.txt
└── readme.md

How It Works

  1. Base Image Selection: Automatically chooses Amazon Linux 2 (for Python 3.10-3.11) or Amazon Linux 2023 (for Python 3.12+) to match AWS Lambda runtime environments
  2. Python Installation: Installs specified Python version (3.10-3.14) with development headers
  3. Package Installation: Uses pip with --target flag to install packages with proper dependencies
  4. Packaging: Creates zip archives with proper Lambda Layer structure (python/lib/pythonX.Y/site-packages/)
  5. Multi-arch: Leverages Docker buildx for platform-specific builds (x86_64 and arm64)
  6. Runtime Compatibility: Ensures binary compatibility with AWS Lambda execution environments

Troubleshooting

Docker buildx not available

Enable buildx in Docker Desktop settings or install manually:

docker buildx version

Requirements file not found

By default, the script looks for requirements.txt in the current directory. Specify a different file:

./build-multiarch.sh -r path/to/my-requirements.txt

Package has binary dependencies

The build includes gcc, g++, and cmake for compiling binary extensions. Most packages should work, but some may require additional system libraries. Modify the Dockerfile to add specific dependencies.

Lambda Layer size limits

Lambda has a 250MB (unzipped) limit for layers. For large packages:

  • Use --individual flag to split packages into separate archives
  • Deploy multiple smaller layers
  • Use Lambda deployment package directly
  • Consider AWS Lambda Extensions or Container Images

Build takes too long

Python 3.14 is compiled from source and takes longer. For faster builds:

  • Use Python 3.13 or earlier: ./build-multiarch.sh --python 3.13
  • Build only one architecture: ./build-multiarch.sh --skip-arm64
  • Docker caches layers, so subsequent builds are faster

Advanced Docker Usage

Custom Dockerfile Modifications

Add system dependencies:

# Add after the base install in DockerfileRUN dnf -y install postgresql-devel libxml2-devel

Building Without the Helper Script

# Build for specific platform
docker buildx build \
--platform linux/amd64 \
--build-arg PYTHON_VERSION=3.14 \
-t lambda-zipper:custom \
--load .# Run with requirements (combined archive)
docker run --rm \
-e SINGLE_FILE=true \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper:custom
# Run with single package
docker run --rm \
-v $(pwd)/output:/package \
lambda-zipper:custom numpy

Output File Naming

Archives are named with the following pattern:

Combined archives (default):

  • combined-python{VERSION}-{ARCH}.zip
  • Example: combined-python3.14-x86_64.zip, combined-python3.14-aarch64.zip

Individual package archives (with --individual):

  • {PACKAGE}-python{VERSION}-{ARCH}.zip
  • Example: numpy-python3.14-x86_64.zip, requests-python3.13-aarch64.zip

Contributing

Feel free to submit issues and enhancement requests!

License

This project is open source and available for use and modification.

About

Easily create AWS Lambda Layers of Python packages

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Python Package Builder for AWS Lambda

Build AWS Lambda deployment packages and layers for multiple Python versions (3.10+) and architectures (x86_64/arm64).

CodeQLDependabotBuild and ReleaseGithub Pages

Inspired by LambdaZipper

Features

  • 🐍 Multiple Python versions: Support for Python 3.10, 3.11, 3.12, 3.13, and 3.14 (default)
  • 🏗️ Multi-architecture: Build for both x86_64 (amd64) and arm64 (aarch64) by default
  • 📦 Bulk packaging: Uses requirements.txt by default to package multiple dependencies
  • 🔄 Two output formats: Single combined archive (default) or individual archives per package
  • Fast builds: Based on Amazon Linux 2023 for compatibility with Lambda runtime
  • 🚀 Zero-config: Run without arguments for sensible defaults

Quick Start

Default Usage (Recommended)

Simply run the build script with no arguments:

./build-multiarch.sh

Default behavior:

  • Uses Python 3.14 (latest)
  • Reads from requirements.txt in the current directory
  • Builds for both x86_64 and arm64 architectures
  • Creates single combined archive per architecture
  • Automatically uses the correct Amazon Linux version for Lambda compatibility

Result: combined-python3.14-x86_64.zip and combined-python3.14-aarch64.zip in ./output/

Note: This tool uses Amazon Linux 2 for Python 3.10-3.11 and Amazon Linux 2023 for Python 3.12+ to ensure compatibility with AWS Lambda Python runtimes.

Customizing the Build

# Use a specific Python version
./build-multiarch.sh --python 3.13
# Build only for x86_64
./build-multiarch.sh --skip-arm64
# Create individual archives per package
./build-multiarch.sh --individual
# Build a single package instead of requirements.txt
./build-multiarch.sh --package numpy
# Combine options
./build-multiarch.sh --python 3.12 --skip-arm64 --individual

Command Reference

build-multiarch.sh Options

OptionDescriptionDefault
--python VERSIONPython version (3.10-3.14)3.14
-r, --requirements FILEPath to requirements.txtrequirements.txt
--package NAMESingle package name (overrides requirements.txt)-
--skip-x86, --skip-amd64Skip x86_64 architecture buildBuild both
--skip-arm64Skip arm64 architecture buildBuild both
--individualCreate individual archives per packageSingle combined
--image NAMECustom Docker image namelambda-zipper
--helpShow help message-

Usage Examples

# Default: Python 3.14, requirements.txt, multi-arch, combined archive
./build-multiarch.sh
# Use different Python version
./build-multiarch.sh --python 3.13
# Build only for x86_64 architecture
./build-multiarch.sh --skip-arm64
# Create individual archives for each package
./build-multiarch.sh --individual
# Use custom requirements file
./build-multiarch.sh -r ./my-requirements.txt
# Build a single package (ignores requirements.txt)
./build-multiarch.sh --package numpy
# Combine multiple options
./build-multiarch.sh --python 3.12 --skip-arm64 --individual -r prod-requirements.txt

Advanced Usage

Manual Docker Build (Lower-Level)

For direct Docker control, you can build and run containers manually:

Single Package Mode

Build a Docker image:

docker build --build-arg PYTHON_VERSION=3.14 -t lambda-zipper .

Package a single library:

docker run --rm -v $(pwd)/output:/package lambda-zipper numpy

Requirements.txt with Individual Archives

docker run --rm \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper

Requirements.txt with Combined Archive

docker run --rm \
-e SINGLE_FILE=true \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper

Supported Python Versions

This project automatically uses the appropriate Amazon Linux version based on AWS Lambda Python runtime requirements:

Python VersionBase OSInstallation MethodLambda Runtime Compatibility
3.10Amazon Linux 2Built from source✅ python3.10 runtime
3.11Amazon Linux 2Built from source✅ python3.11 runtime
3.12Amazon Linux 2023dnf package✅ python3.12 runtime
3.13Amazon Linux 2023dnf package✅ python3.13 runtime
3.14Amazon Linux 2023Built from source⚙️ Future runtime (Default)

Key Points:

  • Python 3.10 & 3.11: Use Amazon Linux 2 (matches Lambda runtime environment)
  • Python 3.12 & 3.13: Use Amazon Linux 2023 (matches Lambda runtime environment)
  • Python 3.14: Uses Amazon Linux 2023, compiled from source for latest features
  • All versions are built with development headers for compiling binary packages

Output Formats

Lambda Layer Format

python/
lib/
pythonX.Y/
site-packages/
[your packages here]

Upload as a Lambda Layer in the AWS Console.

Flat Deployment Format

[your packages at root level]

Extract into your Lambda deployment package alongside your code.

Architecture Support

  • x86_64 (amd64): Standard Lambda runtime
  • arm64 (aarch64): AWS Graviton2 Lambda runtime (cost-effective)

Choose the architecture that matches your Lambda function configuration.

Real-World Examples

Data Science Stack

Create requirements.txt:

numpy==1.26.4
pandas==2.1.4
scipy==1.11.4
scikit-learn==1.3.2

Build with defaults (Python 3.14, multi-arch, combined archive):

./build-multiarch.sh

Result: combined-python3.14-x86_64.zip and combined-python3.14-aarch64.zip ready for Lambda Layer

Web Scraping Stack

Create requirements.txt:

requests==2.31.0
beautifulsoup4==4.12.2
lxml==4.9.3

Build for Python 3.13, x86_64 only:

./build-multiarch.sh --python 3.13 --skip-arm64

Computer Vision with OpenCV

Create requirements.txt:

Pillow==10.2.0
opencv-python-headless==4.9.0.80
numpy==1.26.4

Build individual archives for selective deployment:

./build-multiarch.sh --individual

Result: Separate archives for each package, allowing you to pick and choose

AWS SDK Only (Single Package)

Build only boto3 for both architectures:

./build-multiarch.sh --package boto3

Result: boto3-python3.14-x86_64.zip and boto3-python3.14-aarch64.zip

Legacy Python Version Support

Build for Python 3.10 with specific requirements:

./build-multiarch.sh --python 3.10 -r legacy-requirements.txt

Project Structure

.
├── Dockerfile.al2 # Amazon Linux 2 image (Python 3.10-3.11)
├── Dockerfile.al2023 # Amazon Linux 2023 image (Python 3.12-3.14)
├── Dockerfile # Default (points to AL2023)
├── package.sh # Packaging script with requirements.txt support
├── build-multiarch.sh # Helper script for multi-arch builds
├── requirements.example.txt
└── readme.md

How It Works

  1. Base Image Selection: Automatically chooses Amazon Linux 2 (for Python 3.10-3.11) or Amazon Linux 2023 (for Python 3.12+) to match AWS Lambda runtime environments
  2. Python Installation: Installs specified Python version (3.10-3.14) with development headers
  3. Package Installation: Uses pip with --target flag to install packages with proper dependencies
  4. Packaging: Creates zip archives with proper Lambda Layer structure (python/lib/pythonX.Y/site-packages/)
  5. Multi-arch: Leverages Docker buildx for platform-specific builds (x86_64 and arm64)
  6. Runtime Compatibility: Ensures binary compatibility with AWS Lambda execution environments

Troubleshooting

Docker buildx not available

Enable buildx in Docker Desktop settings or install manually:

docker buildx version

Requirements file not found

By default, the script looks for requirements.txt in the current directory. Specify a different file:

./build-multiarch.sh -r path/to/my-requirements.txt

Package has binary dependencies

The build includes gcc, g++, and cmake for compiling binary extensions. Most packages should work, but some may require additional system libraries. Modify the Dockerfile to add specific dependencies.

Lambda Layer size limits

Lambda has a 250MB (unzipped) limit for layers. For large packages:

  • Use --individual flag to split packages into separate archives
  • Deploy multiple smaller layers
  • Use Lambda deployment package directly
  • Consider AWS Lambda Extensions or Container Images

Build takes too long

Python 3.14 is compiled from source and takes longer. For faster builds:

  • Use Python 3.13 or earlier: ./build-multiarch.sh --python 3.13
  • Build only one architecture: ./build-multiarch.sh --skip-arm64
  • Docker caches layers, so subsequent builds are faster

Advanced Docker Usage

Custom Dockerfile Modifications

Add system dependencies:

# Add after the base install in DockerfileRUN dnf -y install postgresql-devel libxml2-devel

Building Without the Helper Script

# Build for specific platform
docker buildx build \
--platform linux/amd64 \
--build-arg PYTHON_VERSION=3.14 \
-t lambda-zipper:custom \
--load .# Run with requirements (combined archive)
docker run --rm \
-e SINGLE_FILE=true \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper:custom
# Run with single package
docker run --rm \
-v $(pwd)/output:/package \
lambda-zipper:custom numpy

Output File Naming

Archives are named with the following pattern:

Combined archives (default):

  • combined-python{VERSION}-{ARCH}.zip
  • Example: combined-python3.14-x86_64.zip, combined-python3.14-aarch64.zip

Individual package archives (with --individual):

  • {PACKAGE}-python{VERSION}-{ARCH}.zip
  • Example: numpy-python3.14-x86_64.zip, requests-python3.13-aarch64.zip

Contributing

Feel free to submit issues and enhancement requests!

License

This project is open source and available for use and modification.

About

Easily create AWS Lambda Layers of Python packages

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Python Package Builder for AWS Lambda

Build AWS Lambda deployment packages and layers for multiple Python versions (3.10+) and architectures (x86_64/arm64).

CodeQLDependabotBuild and ReleaseGithub Pages

Inspired by LambdaZipper

Features

  • 🐍 Multiple Python versions: Support for Python 3.10, 3.11, 3.12, 3.13, and 3.14 (default)
  • 🏗️ Multi-architecture: Build for both x86_64 (amd64) and arm64 (aarch64) by default
  • 📦 Bulk packaging: Uses requirements.txt by default to package multiple dependencies
  • 🔄 Two output formats: Single combined archive (default) or individual archives per package
  • Fast builds: Based on Amazon Linux 2023 for compatibility with Lambda runtime
  • 🚀 Zero-config: Run without arguments for sensible defaults

Quick Start

Default Usage (Recommended)

Simply run the build script with no arguments:

./build-multiarch.sh

Default behavior:

  • Uses Python 3.14 (latest)
  • Reads from requirements.txt in the current directory
  • Builds for both x86_64 and arm64 architectures
  • Creates single combined archive per architecture
  • Automatically uses the correct Amazon Linux version for Lambda compatibility

Result: combined-python3.14-x86_64.zip and combined-python3.14-aarch64.zip in ./output/

Note: This tool uses Amazon Linux 2 for Python 3.10-3.11 and Amazon Linux 2023 for Python 3.12+ to ensure compatibility with AWS Lambda Python runtimes.

Customizing the Build

# Use a specific Python version
./build-multiarch.sh --python 3.13
# Build only for x86_64
./build-multiarch.sh --skip-arm64
# Create individual archives per package
./build-multiarch.sh --individual
# Build a single package instead of requirements.txt
./build-multiarch.sh --package numpy
# Combine options
./build-multiarch.sh --python 3.12 --skip-arm64 --individual

Command Reference

build-multiarch.sh Options

OptionDescriptionDefault
--python VERSIONPython version (3.10-3.14)3.14
-r, --requirements FILEPath to requirements.txtrequirements.txt
--package NAMESingle package name (overrides requirements.txt)-
--skip-x86, --skip-amd64Skip x86_64 architecture buildBuild both
--skip-arm64Skip arm64 architecture buildBuild both
--individualCreate individual archives per packageSingle combined
--image NAMECustom Docker image namelambda-zipper
--helpShow help message-

Usage Examples

# Default: Python 3.14, requirements.txt, multi-arch, combined archive
./build-multiarch.sh
# Use different Python version
./build-multiarch.sh --python 3.13
# Build only for x86_64 architecture
./build-multiarch.sh --skip-arm64
# Create individual archives for each package
./build-multiarch.sh --individual
# Use custom requirements file
./build-multiarch.sh -r ./my-requirements.txt
# Build a single package (ignores requirements.txt)
./build-multiarch.sh --package numpy
# Combine multiple options
./build-multiarch.sh --python 3.12 --skip-arm64 --individual -r prod-requirements.txt

Advanced Usage

Manual Docker Build (Lower-Level)

For direct Docker control, you can build and run containers manually:

Single Package Mode

Build a Docker image:

docker build --build-arg PYTHON_VERSION=3.14 -t lambda-zipper .

Package a single library:

docker run --rm -v $(pwd)/output:/package lambda-zipper numpy

Requirements.txt with Individual Archives

docker run --rm \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper

Requirements.txt with Combined Archive

docker run --rm \
-e SINGLE_FILE=true \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper

Supported Python Versions

This project automatically uses the appropriate Amazon Linux version based on AWS Lambda Python runtime requirements:

Python VersionBase OSInstallation MethodLambda Runtime Compatibility
3.10Amazon Linux 2Built from source✅ python3.10 runtime
3.11Amazon Linux 2Built from source✅ python3.11 runtime
3.12Amazon Linux 2023dnf package✅ python3.12 runtime
3.13Amazon Linux 2023dnf package✅ python3.13 runtime
3.14Amazon Linux 2023Built from source⚙️ Future runtime (Default)

Key Points:

  • Python 3.10 & 3.11: Use Amazon Linux 2 (matches Lambda runtime environment)
  • Python 3.12 & 3.13: Use Amazon Linux 2023 (matches Lambda runtime environment)
  • Python 3.14: Uses Amazon Linux 2023, compiled from source for latest features
  • All versions are built with development headers for compiling binary packages

Output Formats

Lambda Layer Format

python/
lib/
pythonX.Y/
site-packages/
[your packages here]

Upload as a Lambda Layer in the AWS Console.

Flat Deployment Format

[your packages at root level]

Extract into your Lambda deployment package alongside your code.

Architecture Support

  • x86_64 (amd64): Standard Lambda runtime
  • arm64 (aarch64): AWS Graviton2 Lambda runtime (cost-effective)

Choose the architecture that matches your Lambda function configuration.

Real-World Examples

Data Science Stack

Create requirements.txt:

numpy==1.26.4
pandas==2.1.4
scipy==1.11.4
scikit-learn==1.3.2

Build with defaults (Python 3.14, multi-arch, combined archive):

./build-multiarch.sh

Result: combined-python3.14-x86_64.zip and combined-python3.14-aarch64.zip ready for Lambda Layer

Web Scraping Stack

Create requirements.txt:

requests==2.31.0
beautifulsoup4==4.12.2
lxml==4.9.3

Build for Python 3.13, x86_64 only:

./build-multiarch.sh --python 3.13 --skip-arm64

Computer Vision with OpenCV

Create requirements.txt:

Pillow==10.2.0
opencv-python-headless==4.9.0.80
numpy==1.26.4

Build individual archives for selective deployment:

./build-multiarch.sh --individual

Result: Separate archives for each package, allowing you to pick and choose

AWS SDK Only (Single Package)

Build only boto3 for both architectures:

./build-multiarch.sh --package boto3

Result: boto3-python3.14-x86_64.zip and boto3-python3.14-aarch64.zip

Legacy Python Version Support

Build for Python 3.10 with specific requirements:

./build-multiarch.sh --python 3.10 -r legacy-requirements.txt

Project Structure

.
├── Dockerfile.al2 # Amazon Linux 2 image (Python 3.10-3.11)
├── Dockerfile.al2023 # Amazon Linux 2023 image (Python 3.12-3.14)
├── Dockerfile # Default (points to AL2023)
├── package.sh # Packaging script with requirements.txt support
├── build-multiarch.sh # Helper script for multi-arch builds
├── requirements.example.txt
└── readme.md

How It Works

  1. Base Image Selection: Automatically chooses Amazon Linux 2 (for Python 3.10-3.11) or Amazon Linux 2023 (for Python 3.12+) to match AWS Lambda runtime environments
  2. Python Installation: Installs specified Python version (3.10-3.14) with development headers
  3. Package Installation: Uses pip with --target flag to install packages with proper dependencies
  4. Packaging: Creates zip archives with proper Lambda Layer structure (python/lib/pythonX.Y/site-packages/)
  5. Multi-arch: Leverages Docker buildx for platform-specific builds (x86_64 and arm64)
  6. Runtime Compatibility: Ensures binary compatibility with AWS Lambda execution environments

Troubleshooting

Docker buildx not available

Enable buildx in Docker Desktop settings or install manually:

docker buildx version

Requirements file not found

By default, the script looks for requirements.txt in the current directory. Specify a different file:

./build-multiarch.sh -r path/to/my-requirements.txt

Package has binary dependencies

The build includes gcc, g++, and cmake for compiling binary extensions. Most packages should work, but some may require additional system libraries. Modify the Dockerfile to add specific dependencies.

Lambda Layer size limits

Lambda has a 250MB (unzipped) limit for layers. For large packages:

  • Use --individual flag to split packages into separate archives
  • Deploy multiple smaller layers
  • Use Lambda deployment package directly
  • Consider AWS Lambda Extensions or Container Images

Build takes too long

Python 3.14 is compiled from source and takes longer. For faster builds:

  • Use Python 3.13 or earlier: ./build-multiarch.sh --python 3.13
  • Build only one architecture: ./build-multiarch.sh --skip-arm64
  • Docker caches layers, so subsequent builds are faster

Advanced Docker Usage

Custom Dockerfile Modifications

Add system dependencies:

# Add after the base install in DockerfileRUN dnf -y install postgresql-devel libxml2-devel

Building Without the Helper Script

# Build for specific platform
docker buildx build \
--platform linux/amd64 \
--build-arg PYTHON_VERSION=3.14 \
-t lambda-zipper:custom \
--load .# Run with requirements (combined archive)
docker run --rm \
-e SINGLE_FILE=true \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper:custom
# Run with single package
docker run --rm \
-v $(pwd)/output:/package \
lambda-zipper:custom numpy

Output File Naming

Archives are named with the following pattern:

Combined archives (default):

  • combined-python{VERSION}-{ARCH}.zip
  • Example: combined-python3.14-x86_64.zip, combined-python3.14-aarch64.zip

Individual package archives (with --individual):

  • {PACKAGE}-python{VERSION}-{ARCH}.zip
  • Example: numpy-python3.14-x86_64.zip, requests-python3.13-aarch64.zip

Contributing

Feel free to submit issues and enhancement requests!

License

This project is open source and available for use and modification.

About

Easily create AWS Lambda Layers of Python packages

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Python Package Builder for AWS Lambda

Build AWS Lambda deployment packages and layers for multiple Python versions (3.10+) and architectures (x86_64/arm64).

CodeQLDependabotBuild and ReleaseGithub Pages

Inspired by LambdaZipper

Features

  • 🐍 Multiple Python versions: Support for Python 3.10, 3.11, 3.12, 3.13, and 3.14 (default)
  • 🏗️ Multi-architecture: Build for both x86_64 (amd64) and arm64 (aarch64) by default
  • 📦 Bulk packaging: Uses requirements.txt by default to package multiple dependencies
  • 🔄 Two output formats: Single combined archive (default) or individual archives per package
  • Fast builds: Based on Amazon Linux 2023 for compatibility with Lambda runtime
  • 🚀 Zero-config: Run without arguments for sensible defaults

Quick Start

Default Usage (Recommended)

Simply run the build script with no arguments:

./build-multiarch.sh

Default behavior:

  • Uses Python 3.14 (latest)
  • Reads from requirements.txt in the current directory
  • Builds for both x86_64 and arm64 architectures
  • Creates single combined archive per architecture
  • Automatically uses the correct Amazon Linux version for Lambda compatibility

Result: combined-python3.14-x86_64.zip and combined-python3.14-aarch64.zip in ./output/

Note: This tool uses Amazon Linux 2 for Python 3.10-3.11 and Amazon Linux 2023 for Python 3.12+ to ensure compatibility with AWS Lambda Python runtimes.

Customizing the Build

# Use a specific Python version
./build-multiarch.sh --python 3.13
# Build only for x86_64
./build-multiarch.sh --skip-arm64
# Create individual archives per package
./build-multiarch.sh --individual
# Build a single package instead of requirements.txt
./build-multiarch.sh --package numpy
# Combine options
./build-multiarch.sh --python 3.12 --skip-arm64 --individual

Command Reference

build-multiarch.sh Options

OptionDescriptionDefault
--python VERSIONPython version (3.10-3.14)3.14
-r, --requirements FILEPath to requirements.txtrequirements.txt
--package NAMESingle package name (overrides requirements.txt)-
--skip-x86, --skip-amd64Skip x86_64 architecture buildBuild both
--skip-arm64Skip arm64 architecture buildBuild both
--individualCreate individual archives per packageSingle combined
--image NAMECustom Docker image namelambda-zipper
--helpShow help message-

Usage Examples

# Default: Python 3.14, requirements.txt, multi-arch, combined archive
./build-multiarch.sh
# Use different Python version
./build-multiarch.sh --python 3.13
# Build only for x86_64 architecture
./build-multiarch.sh --skip-arm64
# Create individual archives for each package
./build-multiarch.sh --individual
# Use custom requirements file
./build-multiarch.sh -r ./my-requirements.txt
# Build a single package (ignores requirements.txt)
./build-multiarch.sh --package numpy
# Combine multiple options
./build-multiarch.sh --python 3.12 --skip-arm64 --individual -r prod-requirements.txt

Advanced Usage

Manual Docker Build (Lower-Level)

For direct Docker control, you can build and run containers manually:

Single Package Mode

Build a Docker image:

docker build --build-arg PYTHON_VERSION=3.14 -t lambda-zipper .

Package a single library:

docker run --rm -v $(pwd)/output:/package lambda-zipper numpy

Requirements.txt with Individual Archives

docker run --rm \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper

Requirements.txt with Combined Archive

docker run --rm \
-e SINGLE_FILE=true \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper

Supported Python Versions

This project automatically uses the appropriate Amazon Linux version based on AWS Lambda Python runtime requirements:

Python VersionBase OSInstallation MethodLambda Runtime Compatibility
3.10Amazon Linux 2Built from source✅ python3.10 runtime
3.11Amazon Linux 2Built from source✅ python3.11 runtime
3.12Amazon Linux 2023dnf package✅ python3.12 runtime
3.13Amazon Linux 2023dnf package✅ python3.13 runtime
3.14Amazon Linux 2023Built from source⚙️ Future runtime (Default)

Key Points:

  • Python 3.10 & 3.11: Use Amazon Linux 2 (matches Lambda runtime environment)
  • Python 3.12 & 3.13: Use Amazon Linux 2023 (matches Lambda runtime environment)
  • Python 3.14: Uses Amazon Linux 2023, compiled from source for latest features
  • All versions are built with development headers for compiling binary packages

Output Formats

Lambda Layer Format

python/
lib/
pythonX.Y/
site-packages/
[your packages here]

Upload as a Lambda Layer in the AWS Console.

Flat Deployment Format

[your packages at root level]

Extract into your Lambda deployment package alongside your code.

Architecture Support

  • x86_64 (amd64): Standard Lambda runtime
  • arm64 (aarch64): AWS Graviton2 Lambda runtime (cost-effective)

Choose the architecture that matches your Lambda function configuration.

Real-World Examples

Data Science Stack

Create requirements.txt:

numpy==1.26.4
pandas==2.1.4
scipy==1.11.4
scikit-learn==1.3.2

Build with defaults (Python 3.14, multi-arch, combined archive):

./build-multiarch.sh

Result: combined-python3.14-x86_64.zip and combined-python3.14-aarch64.zip ready for Lambda Layer

Web Scraping Stack

Create requirements.txt:

requests==2.31.0
beautifulsoup4==4.12.2
lxml==4.9.3

Build for Python 3.13, x86_64 only:

./build-multiarch.sh --python 3.13 --skip-arm64

Computer Vision with OpenCV

Create requirements.txt:

Pillow==10.2.0
opencv-python-headless==4.9.0.80
numpy==1.26.4

Build individual archives for selective deployment:

./build-multiarch.sh --individual

Result: Separate archives for each package, allowing you to pick and choose

AWS SDK Only (Single Package)

Build only boto3 for both architectures:

./build-multiarch.sh --package boto3

Result: boto3-python3.14-x86_64.zip and boto3-python3.14-aarch64.zip

Legacy Python Version Support

Build for Python 3.10 with specific requirements:

./build-multiarch.sh --python 3.10 -r legacy-requirements.txt

Project Structure

.
├── Dockerfile.al2 # Amazon Linux 2 image (Python 3.10-3.11)
├── Dockerfile.al2023 # Amazon Linux 2023 image (Python 3.12-3.14)
├── Dockerfile # Default (points to AL2023)
├── package.sh # Packaging script with requirements.txt support
├── build-multiarch.sh # Helper script for multi-arch builds
├── requirements.example.txt
└── readme.md

How It Works

  1. Base Image Selection: Automatically chooses Amazon Linux 2 (for Python 3.10-3.11) or Amazon Linux 2023 (for Python 3.12+) to match AWS Lambda runtime environments
  2. Python Installation: Installs specified Python version (3.10-3.14) with development headers
  3. Package Installation: Uses pip with --target flag to install packages with proper dependencies
  4. Packaging: Creates zip archives with proper Lambda Layer structure (python/lib/pythonX.Y/site-packages/)
  5. Multi-arch: Leverages Docker buildx for platform-specific builds (x86_64 and arm64)
  6. Runtime Compatibility: Ensures binary compatibility with AWS Lambda execution environments

Troubleshooting

Docker buildx not available

Enable buildx in Docker Desktop settings or install manually:

docker buildx version

Requirements file not found

By default, the script looks for requirements.txt in the current directory. Specify a different file:

./build-multiarch.sh -r path/to/my-requirements.txt

Package has binary dependencies

The build includes gcc, g++, and cmake for compiling binary extensions. Most packages should work, but some may require additional system libraries. Modify the Dockerfile to add specific dependencies.

Lambda Layer size limits

Lambda has a 250MB (unzipped) limit for layers. For large packages:

  • Use --individual flag to split packages into separate archives
  • Deploy multiple smaller layers
  • Use Lambda deployment package directly
  • Consider AWS Lambda Extensions or Container Images

Build takes too long

Python 3.14 is compiled from source and takes longer. For faster builds:

  • Use Python 3.13 or earlier: ./build-multiarch.sh --python 3.13
  • Build only one architecture: ./build-multiarch.sh --skip-arm64
  • Docker caches layers, so subsequent builds are faster

Advanced Docker Usage

Custom Dockerfile Modifications

Add system dependencies:

# Add after the base install in DockerfileRUN dnf -y install postgresql-devel libxml2-devel

Building Without the Helper Script

# Build for specific platform
docker buildx build \
--platform linux/amd64 \
--build-arg PYTHON_VERSION=3.14 \
-t lambda-zipper:custom \
--load .# Run with requirements (combined archive)
docker run --rm \
-e SINGLE_FILE=true \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper:custom
# Run with single package
docker run --rm \
-v $(pwd)/output:/package \
lambda-zipper:custom numpy

Output File Naming

Archives are named with the following pattern:

Combined archives (default):

  • combined-python{VERSION}-{ARCH}.zip
  • Example: combined-python3.14-x86_64.zip, combined-python3.14-aarch64.zip

Individual package archives (with --individual):

  • {PACKAGE}-python{VERSION}-{ARCH}.zip
  • Example: numpy-python3.14-x86_64.zip, requests-python3.13-aarch64.zip

Contributing

Feel free to submit issues and enhancement requests!

License

This project is open source and available for use and modification.

About

Easily create AWS Lambda Layers of Python packages

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Python Package Builder for AWS Lambda

Build AWS Lambda deployment packages and layers for multiple Python versions (3.10+) and architectures (x86_64/arm64).

CodeQLDependabotBuild and ReleaseGithub Pages

Inspired by LambdaZipper

Features

  • 🐍 Multiple Python versions: Support for Python 3.10, 3.11, 3.12, 3.13, and 3.14 (default)
  • 🏗️ Multi-architecture: Build for both x86_64 (amd64) and arm64 (aarch64) by default
  • 📦 Bulk packaging: Uses requirements.txt by default to package multiple dependencies
  • 🔄 Two output formats: Single combined archive (default) or individual archives per package
  • Fast builds: Based on Amazon Linux 2023 for compatibility with Lambda runtime
  • 🚀 Zero-config: Run without arguments for sensible defaults

Quick Start

Default Usage (Recommended)

Simply run the build script with no arguments:

./build-multiarch.sh

Default behavior:

  • Uses Python 3.14 (latest)
  • Reads from requirements.txt in the current directory
  • Builds for both x86_64 and arm64 architectures
  • Creates single combined archive per architecture
  • Automatically uses the correct Amazon Linux version for Lambda compatibility

Result: combined-python3.14-x86_64.zip and combined-python3.14-aarch64.zip in ./output/

Note: This tool uses Amazon Linux 2 for Python 3.10-3.11 and Amazon Linux 2023 for Python 3.12+ to ensure compatibility with AWS Lambda Python runtimes.

Customizing the Build

# Use a specific Python version
./build-multiarch.sh --python 3.13
# Build only for x86_64
./build-multiarch.sh --skip-arm64
# Create individual archives per package
./build-multiarch.sh --individual
# Build a single package instead of requirements.txt
./build-multiarch.sh --package numpy
# Combine options
./build-multiarch.sh --python 3.12 --skip-arm64 --individual

Command Reference

build-multiarch.sh Options

OptionDescriptionDefault
--python VERSIONPython version (3.10-3.14)3.14
-r, --requirements FILEPath to requirements.txtrequirements.txt
--package NAMESingle package name (overrides requirements.txt)-
--skip-x86, --skip-amd64Skip x86_64 architecture buildBuild both
--skip-arm64Skip arm64 architecture buildBuild both
--individualCreate individual archives per packageSingle combined
--image NAMECustom Docker image namelambda-zipper
--helpShow help message-

Usage Examples

# Default: Python 3.14, requirements.txt, multi-arch, combined archive
./build-multiarch.sh
# Use different Python version
./build-multiarch.sh --python 3.13
# Build only for x86_64 architecture
./build-multiarch.sh --skip-arm64
# Create individual archives for each package
./build-multiarch.sh --individual
# Use custom requirements file
./build-multiarch.sh -r ./my-requirements.txt
# Build a single package (ignores requirements.txt)
./build-multiarch.sh --package numpy
# Combine multiple options
./build-multiarch.sh --python 3.12 --skip-arm64 --individual -r prod-requirements.txt

Advanced Usage

Manual Docker Build (Lower-Level)

For direct Docker control, you can build and run containers manually:

Single Package Mode

Build a Docker image:

docker build --build-arg PYTHON_VERSION=3.14 -t lambda-zipper .

Package a single library:

docker run --rm -v $(pwd)/output:/package lambda-zipper numpy

Requirements.txt with Individual Archives

docker run --rm \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper

Requirements.txt with Combined Archive

docker run --rm \
-e SINGLE_FILE=true \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper

Supported Python Versions

This project automatically uses the appropriate Amazon Linux version based on AWS Lambda Python runtime requirements:

Python VersionBase OSInstallation MethodLambda Runtime Compatibility
3.10Amazon Linux 2Built from source✅ python3.10 runtime
3.11Amazon Linux 2Built from source✅ python3.11 runtime
3.12Amazon Linux 2023dnf package✅ python3.12 runtime
3.13Amazon Linux 2023dnf package✅ python3.13 runtime
3.14Amazon Linux 2023Built from source⚙️ Future runtime (Default)

Key Points:

  • Python 3.10 & 3.11: Use Amazon Linux 2 (matches Lambda runtime environment)
  • Python 3.12 & 3.13: Use Amazon Linux 2023 (matches Lambda runtime environment)
  • Python 3.14: Uses Amazon Linux 2023, compiled from source for latest features
  • All versions are built with development headers for compiling binary packages

Output Formats

Lambda Layer Format

python/
lib/
pythonX.Y/
site-packages/
[your packages here]

Upload as a Lambda Layer in the AWS Console.

Flat Deployment Format

[your packages at root level]

Extract into your Lambda deployment package alongside your code.

Architecture Support

  • x86_64 (amd64): Standard Lambda runtime
  • arm64 (aarch64): AWS Graviton2 Lambda runtime (cost-effective)

Choose the architecture that matches your Lambda function configuration.

Real-World Examples

Data Science Stack

Create requirements.txt:

numpy==1.26.4
pandas==2.1.4
scipy==1.11.4
scikit-learn==1.3.2

Build with defaults (Python 3.14, multi-arch, combined archive):

./build-multiarch.sh

Result: combined-python3.14-x86_64.zip and combined-python3.14-aarch64.zip ready for Lambda Layer

Web Scraping Stack

Create requirements.txt:

requests==2.31.0
beautifulsoup4==4.12.2
lxml==4.9.3

Build for Python 3.13, x86_64 only:

./build-multiarch.sh --python 3.13 --skip-arm64

Computer Vision with OpenCV

Create requirements.txt:

Pillow==10.2.0
opencv-python-headless==4.9.0.80
numpy==1.26.4

Build individual archives for selective deployment:

./build-multiarch.sh --individual

Result: Separate archives for each package, allowing you to pick and choose

AWS SDK Only (Single Package)

Build only boto3 for both architectures:

./build-multiarch.sh --package boto3

Result: boto3-python3.14-x86_64.zip and boto3-python3.14-aarch64.zip

Legacy Python Version Support

Build for Python 3.10 with specific requirements:

./build-multiarch.sh --python 3.10 -r legacy-requirements.txt

Project Structure

.
├── Dockerfile.al2 # Amazon Linux 2 image (Python 3.10-3.11)
├── Dockerfile.al2023 # Amazon Linux 2023 image (Python 3.12-3.14)
├── Dockerfile # Default (points to AL2023)
├── package.sh # Packaging script with requirements.txt support
├── build-multiarch.sh # Helper script for multi-arch builds
├── requirements.example.txt
└── readme.md

How It Works

  1. Base Image Selection: Automatically chooses Amazon Linux 2 (for Python 3.10-3.11) or Amazon Linux 2023 (for Python 3.12+) to match AWS Lambda runtime environments
  2. Python Installation: Installs specified Python version (3.10-3.14) with development headers
  3. Package Installation: Uses pip with --target flag to install packages with proper dependencies
  4. Packaging: Creates zip archives with proper Lambda Layer structure (python/lib/pythonX.Y/site-packages/)
  5. Multi-arch: Leverages Docker buildx for platform-specific builds (x86_64 and arm64)
  6. Runtime Compatibility: Ensures binary compatibility with AWS Lambda execution environments

Troubleshooting

Docker buildx not available

Enable buildx in Docker Desktop settings or install manually:

docker buildx version

Requirements file not found

By default, the script looks for requirements.txt in the current directory. Specify a different file:

./build-multiarch.sh -r path/to/my-requirements.txt

Package has binary dependencies

The build includes gcc, g++, and cmake for compiling binary extensions. Most packages should work, but some may require additional system libraries. Modify the Dockerfile to add specific dependencies.

Lambda Layer size limits

Lambda has a 250MB (unzipped) limit for layers. For large packages:

  • Use --individual flag to split packages into separate archives
  • Deploy multiple smaller layers
  • Use Lambda deployment package directly
  • Consider AWS Lambda Extensions or Container Images

Build takes too long

Python 3.14 is compiled from source and takes longer. For faster builds:

  • Use Python 3.13 or earlier: ./build-multiarch.sh --python 3.13
  • Build only one architecture: ./build-multiarch.sh --skip-arm64
  • Docker caches layers, so subsequent builds are faster

Advanced Docker Usage

Custom Dockerfile Modifications

Add system dependencies:

# Add after the base install in DockerfileRUN dnf -y install postgresql-devel libxml2-devel

Building Without the Helper Script

# Build for specific platform
docker buildx build \
--platform linux/amd64 \
--build-arg PYTHON_VERSION=3.14 \
-t lambda-zipper:custom \
--load .# Run with requirements (combined archive)
docker run --rm \
-e SINGLE_FILE=true \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper:custom
# Run with single package
docker run --rm \
-v $(pwd)/output:/package \
lambda-zipper:custom numpy

Output File Naming

Archives are named with the following pattern:

Combined archives (default):

  • combined-python{VERSION}-{ARCH}.zip
  • Example: combined-python3.14-x86_64.zip, combined-python3.14-aarch64.zip

Individual package archives (with --individual):

  • {PACKAGE}-python{VERSION}-{ARCH}.zip
  • Example: numpy-python3.14-x86_64.zip, requests-python3.13-aarch64.zip

Contributing

Feel free to submit issues and enhancement requests!

License

This project is open source and available for use and modification.

About

Easily create AWS Lambda Layers of Python packages

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Python Package Builder for AWS Lambda

Build AWS Lambda deployment packages and layers for multiple Python versions (3.10+) and architectures (x86_64/arm64).

CodeQLDependabotBuild and ReleaseGithub Pages

Inspired by LambdaZipper

Features

  • 🐍 Multiple Python versions: Support for Python 3.10, 3.11, 3.12, 3.13, and 3.14 (default)
  • 🏗️ Multi-architecture: Build for both x86_64 (amd64) and arm64 (aarch64) by default
  • 📦 Bulk packaging: Uses requirements.txt by default to package multiple dependencies
  • 🔄 Two output formats: Single combined archive (default) or individual archives per package
  • Fast builds: Based on Amazon Linux 2023 for compatibility with Lambda runtime
  • 🚀 Zero-config: Run without arguments for sensible defaults

Quick Start

Default Usage (Recommended)

Simply run the build script with no arguments:

./build-multiarch.sh

Default behavior:

  • Uses Python 3.14 (latest)
  • Reads from requirements.txt in the current directory
  • Builds for both x86_64 and arm64 architectures
  • Creates single combined archive per architecture
  • Automatically uses the correct Amazon Linux version for Lambda compatibility

Result: combined-python3.14-x86_64.zip and combined-python3.14-aarch64.zip in ./output/

Note: This tool uses Amazon Linux 2 for Python 3.10-3.11 and Amazon Linux 2023 for Python 3.12+ to ensure compatibility with AWS Lambda Python runtimes.

Customizing the Build

# Use a specific Python version
./build-multiarch.sh --python 3.13
# Build only for x86_64
./build-multiarch.sh --skip-arm64
# Create individual archives per package
./build-multiarch.sh --individual
# Build a single package instead of requirements.txt
./build-multiarch.sh --package numpy
# Combine options
./build-multiarch.sh --python 3.12 --skip-arm64 --individual

Command Reference

build-multiarch.sh Options

OptionDescriptionDefault
--python VERSIONPython version (3.10-3.14)3.14
-r, --requirements FILEPath to requirements.txtrequirements.txt
--package NAMESingle package name (overrides requirements.txt)-
--skip-x86, --skip-amd64Skip x86_64 architecture buildBuild both
--skip-arm64Skip arm64 architecture buildBuild both
--individualCreate individual archives per packageSingle combined
--image NAMECustom Docker image namelambda-zipper
--helpShow help message-

Usage Examples

# Default: Python 3.14, requirements.txt, multi-arch, combined archive
./build-multiarch.sh
# Use different Python version
./build-multiarch.sh --python 3.13
# Build only for x86_64 architecture
./build-multiarch.sh --skip-arm64
# Create individual archives for each package
./build-multiarch.sh --individual
# Use custom requirements file
./build-multiarch.sh -r ./my-requirements.txt
# Build a single package (ignores requirements.txt)
./build-multiarch.sh --package numpy
# Combine multiple options
./build-multiarch.sh --python 3.12 --skip-arm64 --individual -r prod-requirements.txt

Advanced Usage

Manual Docker Build (Lower-Level)

For direct Docker control, you can build and run containers manually:

Single Package Mode

Build a Docker image:

docker build --build-arg PYTHON_VERSION=3.14 -t lambda-zipper .

Package a single library:

docker run --rm -v $(pwd)/output:/package lambda-zipper numpy

Requirements.txt with Individual Archives

docker run --rm \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper

Requirements.txt with Combined Archive

docker run --rm \
-e SINGLE_FILE=true \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper

Supported Python Versions

This project automatically uses the appropriate Amazon Linux version based on AWS Lambda Python runtime requirements:

Python VersionBase OSInstallation MethodLambda Runtime Compatibility
3.10Amazon Linux 2Built from source✅ python3.10 runtime
3.11Amazon Linux 2Built from source✅ python3.11 runtime
3.12Amazon Linux 2023dnf package✅ python3.12 runtime
3.13Amazon Linux 2023dnf package✅ python3.13 runtime
3.14Amazon Linux 2023Built from source⚙️ Future runtime (Default)

Key Points:

  • Python 3.10 & 3.11: Use Amazon Linux 2 (matches Lambda runtime environment)
  • Python 3.12 & 3.13: Use Amazon Linux 2023 (matches Lambda runtime environment)
  • Python 3.14: Uses Amazon Linux 2023, compiled from source for latest features
  • All versions are built with development headers for compiling binary packages

Output Formats

Lambda Layer Format

python/
lib/
pythonX.Y/
site-packages/
[your packages here]

Upload as a Lambda Layer in the AWS Console.

Flat Deployment Format

[your packages at root level]

Extract into your Lambda deployment package alongside your code.

Architecture Support

  • x86_64 (amd64): Standard Lambda runtime
  • arm64 (aarch64): AWS Graviton2 Lambda runtime (cost-effective)

Choose the architecture that matches your Lambda function configuration.

Real-World Examples

Data Science Stack

Create requirements.txt:

numpy==1.26.4
pandas==2.1.4
scipy==1.11.4
scikit-learn==1.3.2

Build with defaults (Python 3.14, multi-arch, combined archive):

./build-multiarch.sh

Result: combined-python3.14-x86_64.zip and combined-python3.14-aarch64.zip ready for Lambda Layer

Web Scraping Stack

Create requirements.txt:

requests==2.31.0
beautifulsoup4==4.12.2
lxml==4.9.3

Build for Python 3.13, x86_64 only:

./build-multiarch.sh --python 3.13 --skip-arm64

Computer Vision with OpenCV

Create requirements.txt:

Pillow==10.2.0
opencv-python-headless==4.9.0.80
numpy==1.26.4

Build individual archives for selective deployment:

./build-multiarch.sh --individual

Result: Separate archives for each package, allowing you to pick and choose

AWS SDK Only (Single Package)

Build only boto3 for both architectures:

./build-multiarch.sh --package boto3

Result: boto3-python3.14-x86_64.zip and boto3-python3.14-aarch64.zip

Legacy Python Version Support

Build for Python 3.10 with specific requirements:

./build-multiarch.sh --python 3.10 -r legacy-requirements.txt

Project Structure

.
├── Dockerfile.al2 # Amazon Linux 2 image (Python 3.10-3.11)
├── Dockerfile.al2023 # Amazon Linux 2023 image (Python 3.12-3.14)
├── Dockerfile # Default (points to AL2023)
├── package.sh # Packaging script with requirements.txt support
├── build-multiarch.sh # Helper script for multi-arch builds
├── requirements.example.txt
└── readme.md

How It Works

  1. Base Image Selection: Automatically chooses Amazon Linux 2 (for Python 3.10-3.11) or Amazon Linux 2023 (for Python 3.12+) to match AWS Lambda runtime environments
  2. Python Installation: Installs specified Python version (3.10-3.14) with development headers
  3. Package Installation: Uses pip with --target flag to install packages with proper dependencies
  4. Packaging: Creates zip archives with proper Lambda Layer structure (python/lib/pythonX.Y/site-packages/)
  5. Multi-arch: Leverages Docker buildx for platform-specific builds (x86_64 and arm64)
  6. Runtime Compatibility: Ensures binary compatibility with AWS Lambda execution environments

Troubleshooting

Docker buildx not available

Enable buildx in Docker Desktop settings or install manually:

docker buildx version

Requirements file not found

By default, the script looks for requirements.txt in the current directory. Specify a different file:

./build-multiarch.sh -r path/to/my-requirements.txt

Package has binary dependencies

The build includes gcc, g++, and cmake for compiling binary extensions. Most packages should work, but some may require additional system libraries. Modify the Dockerfile to add specific dependencies.

Lambda Layer size limits

Lambda has a 250MB (unzipped) limit for layers. For large packages:

  • Use --individual flag to split packages into separate archives
  • Deploy multiple smaller layers
  • Use Lambda deployment package directly
  • Consider AWS Lambda Extensions or Container Images

Build takes too long

Python 3.14 is compiled from source and takes longer. For faster builds:

  • Use Python 3.13 or earlier: ./build-multiarch.sh --python 3.13
  • Build only one architecture: ./build-multiarch.sh --skip-arm64
  • Docker caches layers, so subsequent builds are faster

Advanced Docker Usage

Custom Dockerfile Modifications

Add system dependencies:

# Add after the base install in DockerfileRUN dnf -y install postgresql-devel libxml2-devel

Building Without the Helper Script

# Build for specific platform
docker buildx build \
--platform linux/amd64 \
--build-arg PYTHON_VERSION=3.14 \
-t lambda-zipper:custom \
--load .# Run with requirements (combined archive)
docker run --rm \
-e SINGLE_FILE=true \
-v $(pwd)/requirements.txt:/input/requirements.txt \
-v $(pwd)/output:/package \
lambda-zipper:custom
# Run with single package
docker run --rm \
-v $(pwd)/output:/package \
lambda-zipper:custom numpy

Output File Naming

Archives are named with the following pattern:

Combined archives (default):

  • combined-python{VERSION}-{ARCH}.zip
  • Example: combined-python3.14-x86_64.zip, combined-python3.14-aarch64.zip

Individual package archives (with --individual):

  • {PACKAGE}-python{VERSION}-{ARCH}.zip
  • Example: numpy-python3.14-x86_64.zip, requests-python3.13-aarch64.zip

Contributing

Feel free to submit issues and enhancement requests!

License

This project is open source and available for use and modification.

About

Easily create AWS Lambda Layers of Python packages

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages