Serverless AWS Lambda Layer
Introduction to AWS Lambda Layers
Info
AWS Lambda layers provide a convenient way to package libraries, custom runtimes, or other function dependencies separately from your function code. Layers promote code sharing and separation of concerns so that you can iterate on your function code more quickly.
Ref: AWS Lambda Layers
Benefits
- Code Reusability: Share common dependencies across multiple Lambda functions
- Smaller Deployment Packages: Function code packages are smaller without bundled dependencies
- Faster Deployments: Only update layers when dependencies change
- Version Management: Layer versions are immutable and can be referenced by multiple functions
Creating Lambda Layers with Serverless Framework
Manual Package Creation
To create a Lambda layer manually, follow these steps:
# Set environment variables
export PYTHON_VERSION=3.11
export PYTHON_PACKAGE='pandas'
# Create layer structure
mkdir -p "layer/python/lib/python${PYTHON_VERSION}/site-packages"
pip3 install $PYTHON_PACKAGE -t "layer/python/lib/python${PYTHON_VERSION}/site-packages/"
# Package layer
cd layer/
zip -r ${PYTHON_PACKAGE}.zip *
Automated Package Generation
Use the provided script to generate multiple package layers:
File generate-packages.sh
#!/bin/bash
set -e
main() {
arr_packages=( "mysql-connector-python" "numpy" "pandas" "PyMySQL" "requests" "SQLAlchemy" "marshmallow" "pytz")
arr_python_versions=( "3.11" )
# prepare-directory-for-storing-layer-zip-file
mkdir -p layers
for version in "${arr_python_versions[@]}"; do
layer_path="python/lib/python${version}/site-packages"
for package in "${arr_packages[@]}"; do
# cleanup-for-fetch-installation
rm -rf ./python && mkdir -p $layer_path
pip3 install $package -t $layer_path
python3 -c "import shutil;shutil.make_archive('${version}-${package}','zip',root_dir='.', base_dir='python')"
# copy-layer-zip-file-layer-folder
mv ${version}-${package}.zip layers/
done # # end-for-arr_packages
done # end-for-arr_python_versions
}
main "$@"
This script creates layers for the following Python packages (or any packages you specify):
- mysql-connector-python
- numpy
- pandas
- PyMySQL
- requests
- SQLAlchemy
- marshmallow
- pytz
Serverless Configuration
Layer Definition
Here's how to define Lambda layers in your serverless.yml:
service: create-lambda-layers
provider:
name: aws
region: ap-southeast-1
deploymentBucket:
name: btin-serverless-aps1-share-bucket
serverSideEncryption: AES256
package:
individually: true
layers:
btin-python311-utils:
path: layers/utils
package:
artifact: layers/utils/utils.zip
compatibleRuntimes:
- python3.11
compatibleArchitectures:
- x86_64
licenseInfo: GPLv3
description: "btin-utils"
btin-python311-mysql-connector-python:
package:
artifact: 3.11-mysql-connector-python.zip
compatibleRuntimes:
- python3.11
description: "btin-mysql-connector-python"
btin-python311-requests:
package:
artifact: 3.11-requests.zip
compatibleRuntimes:
- python3.11
description: "btin-requests"
btin-python311-PyMySQL:
package:
artifact: 3.11-PyMySQL.zip
compatibleRuntimes:
- python3.11
description: "btin-pymysql"
btin-python311-SQLAlchemy:
package:
artifact: 3.11-SQLAlchemy.zip
compatibleRuntimes:
- python3.11
description: "btin-sqlalchemy"
btin-python311-numpy:
package:
artifact: 3.11-numpy.zip
compatibleRuntimes:
- python3.11
description: "btin-numpy"
btin-python311-pandas:
package:
artifact: 3.11-pandas.zip
compatibleRuntimes:
- python3.11
description: "btin-pandas"
btin-python311-marshmallow:
package:
artifact: 3.11-marshmallow.zip
compatibleRuntimes:
- python3.11
description: "btin-marshmallow"
btin-python311-pytz:
package:
artifact: 3.11-pytz.zip
compatibleRuntimes:
- python3.11
description: "btin-pytz"
plugins:
- serverless-deployment-bucket
- serverless-prune-plugin
custom:
prune:
automatic: true
number: 3
deploymentBucket:
versioning: false
accelerate: true
blockPublicAccess: true
Using Layers in Functions
Reference layers in your Lambda functions:
functions:
monitoring:
handler: handler.monitoring_handler
layers:
- "${cf:create-lambda-layers-ops.BtinDashpython311DashutilsLambdaLayerQualifiedArn}"
- "${cf:create-lambda-layers-ops.BtinDashpython311DashpandasLambdaLayerQualifiedArn}"
timeout: 60
description: "CloudWatch monitoring function"
events:
- sns:
arn: !Ref CloudWatchAlarmTopic
Layer Naming Convention
Standard Format
Our Lambda layers follow this naming convention:

btin-python311-<package-name>
Examples:
btin-python311-pandasbtin-python311-requestsbtin-python311-utils
Package Files
ZIP files are named using:
<python-version>-<package-name>.zip
Examples:
3.11-pandas.zip3.11-requests.ziputils.zip
Utility Layer Components
CloudWatch Alerting Functions
The utility layer includes functions for CloudWatch alarm processing:
# Parse SNS messages from CloudWatch alarms
def parse_sns_message(event):
sns_message = json.loads(event['Records'][0]['Sns']['Message'])
# Process alarm data...
# Send alerts to Microsoft Teams
def alert_chat(message):
# Send webhook notification...
# Send email alerts via AWS SES
def alert_email(content_html, message, type):
# Send email notification...
Usage in Lambda Functions

import json
import requests
from utils import parse_sns_message, alert_chat, alert_email
def lambda_handler(event, context):
# Parse CloudWatch alarm from SNS
message = parse_sns_message(event)
if message:
# Send chat notification
alert_chat(message)
# Send email alert
content_html = generate_email_html(message, 'cloudwatch')
alert_email(content_html, message, 'cloudwatch')
return {'statusCode': 200}
Deployment and Management
Deploy Layers
Deploy all layers to AWS:
serverless deploy --stage <your-stage>
AWS Configuration
- Region: ap-southeast-1
- Deployment Bucket: btin-serverless-aps1-share-bucket
- Runtime: Python 3.11
- Architecture: x86_64
- License: GPLv3
Layer Versioning
Layer versions are immutable. When you update a layer, AWS creates a new version. Update your function configurations to reference the new layer version.
Best Practices
Layer Organization
- Keep layers focused on specific functionality
- Separate third-party packages from custom utilities
- Use consistent naming conventions
- Document layer contents and versions
Performance Considerations
- Lambda cold starts increase with layer size
- Optimize layer contents to include only necessary files
- Consider layer loading order for dependencies
Reference
For more details, visit the AWS Lambda Layers Documentation.