在 AWS Lambda 项目中,使用 Lambda 层可以有效地管理和共享代码和依赖项。然而,创建 Lambda 层的方法有很多,选择合适的方法至关重要。
为什么需要 Layers?
Layers 是一种用于管理和共享代码和依赖项的机制。它们可以帮助您:
- 减少代码重复
- 简化依赖项管理
- 提高代码可重用性
- 降低 Lambda 函数大小
- 提高部署速度
Layers 的典型用例包括:
- 共享库
- 依赖项管理
- 代码模块化
- 机器学习模型
Layers 存在 AWS 的哪里?
Layers 在 AWS 中的存储位置是 AWS Lambda 的层存储库(Layer Store)。当您创建和发布一个 Layer 时,它会被存储在 Layer Store 中。
具体来说,Layers 被存储在以下位置:
- AWS Lambda 控制台 :Layers 可以在 AWS Lambda 控制台的 "Layers" 选项卡中找到。
- AWS Lambda API:Layers 可以通过 AWS Lambda API 访问,例如通过使用
GetLayerVersion
API 操作。 - AWS S3 Layers 的 zip 文件实际上被存储在 AWS S3 中,AWS Lambda 会在需要时从 S3 中检索这些文件。
Layers 可以使您的 AWS Lambda 项目更易于管理和维护。
本文将比较3种创建 Lambda 层的方法:使用 AWS CLI 和使用 Serverless Framework。
方法一:使用 AWS CLI
使用 AWS CLI 创建 Lambda 层的步骤如下:
- 创建层目录并安装包
- 手动创建 zip 文件
- 使用
aws lambda publish-layer-version
命令发布层
以下是具体的步骤:
# 创建层目录
mkdir -p python-libs-layer/python
# 安装包
pip3 install --platform=manylinux2014_x86_64 --only-binary=:all: --target python-libs-layer/python -r requirements.txt
# 手动创建 zip 文件
zip -r python-libs-layer.zip python-libs-layer
# 发布层
aws lambda publish-layer-version \
--layer-name python-libs-layer \
--description "Layer with Pillow, Boto3, and compatible urllib3" \
--zip-file fileb://python-libs-layer.zip \
--compatible-runtimes python3.8 \
--profile your-aws-profile \
--region your-aws-region
方法二:使用 Serverless Framework
使用 Serverless Framework 创建 Lambda 层的步骤如下:
- 创建层目录并安装包
- 编写
serverless.yml
文件 - 使用
sls deploy
命令发布层
以下是具体的步骤:
# 创建层目录
mkdir python-libs-layer
cd python-libs-layer
# 安装包
pip3 install --platform=manylinux2014_x86_64 --only-binary=:all: --target python -r requirements.txt
# 编写 serverless.yml 文件
service: python-libs-layer
provider:
name: aws
runtime: python3.8
stage: ${opt:stage, 'dev'}
region: us-west-2
profile: your-aws-profile
layers:
pythonLibs:
path: python
compatibleRuntimes:
- python3.8
description: Layer containing Pillow and Boto3 libraries
package:
exclude:
- '**/*.pyc'
- '**/__pycache__/**'
# 发布层
sls deploy
主要区别
-
部署工具:
- 方法一使用 AWS CLI
- 方法二使用 Serverless Framework
-
配置方式:
- 方法一通过命令行参数配置
- 方法二通过
serverless.yml
文件配置
-
打包过程:
- 方法一需要手动创建 zip 文件
- 方法二由 Serverless Framework 自动处理打包
关键要点
-
Python 版本:
-
两种方法都使用 Python 3.8,这是通过 pyenv 安装和设置的:
pyenv install 3.8.16 pyenv local 3.8.16
-
-
平台兼容性:
-
两种方法都使用
--platform=manylinux2014_x86_64 --only-binary=:all:
参数来确保包的兼容性:pip3 install --platform=manylinux2014_x86_64 --only-binary=:all: --target layer/python -r requirements.txt
-
-
目录结构:
-
正确的目录结构至关重要。包应该安装在
layer/python
目录中:mkdir -p layer/python
-
-
serverless.yml 中的路径设置:
-
在使用 Serverless Framework 时,确保在
serverless.yml
中正确设置层的路径:layers: pythonLibs: path: layer
-
-
层的引用:
-
在 Lambda 函数的
serverless.yml
中,使用 CloudFormation 输出引用层:layers: - ${cf:python-libs-layer-${opt:stage, self:provider.stage}.PythonLibsLambdaLayerQualifiedArn}
-
方法三,手工方法
手工上传 Layer 到 S3
您可以手工将 Layer 上传到 S3,然后在 AWS Lambda 中引用它。以下是步骤:
- 创建 Layer:创建一个包含您的代码和依赖项的 zip 文件。
- 上传到 S3:将 zip 文件上传到您的 S3 存储桶中。
- 获取 S3 对象 URL:获取 S3 对象的 URL,例如
s3://my-bucket/my-layer.zip
。 - 在 AWS Lambda 中引用:在 AWS Lambda 中创建一个新函数,选择 "从 S3 上载" 选项,然后输入 S3 对象的 URL。
AWS Lambda 中的 S3 对象 URL 格式
在 AWS Lambda 中,S3 对象 URL 的格式如下:
s3://<bucket-name>/<object-key>
例如:
s3://my-bucket/my-layer.zip
注意事项
- 确保您的 S3 存储桶和对象的权限设置正确,以便 AWS Lambda 可以访问它们。
- 如果您的 Layer 大小超过 50MB,您需要使用 S3 上传 Layer,然后在 AWS Lambda 中引用它。
--------------美丽的分割线-------------
附录:AWS CLI 配置、Serverless Framework 角色设置、pyenv 安装和使用
AWS CLI 配置
-
安装 AWS CLI:
-
使用 Homebrew 安装 AWS CLI:
brew install awscli
-
-
配置 AWS CLI:
-
运行以下命令配置 AWS CLI:
aws configure
-
输入您的 AWS 访问密钥 ID 和密钥:
AWS Access Key ID [None]: YOUR_AWS_ACCESS_KEY_ID AWS Secret Access Key [None]: YOUR_AWS_SECRET_ACCESS_KEY Default region name [None]: YOUR_AWS_REGION Default output format [None]: json
-
-
配置 AWS CLI 配置文件:
-
编辑
~/.aws/credentials
文件添加新的配置文件:[default] aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY [your-aws-profile] aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY
-
-
切换 AWS CLI 配置文件:
-
使用以下命令切换 AWS CLI 配置文件:
aws --profile your-aws-profile sts get-caller-identity
-
Serverless Framework 角色设置
-
创建 Serverless Framework Users:
需要的权限如下
-
配置 Serverless Framework:
-
编辑
serverless.yml
文件添加以下配置:provider: name: aws runtime: python3.8 stage: ${opt:stage, 'dev'} region: us-west-2 profile: your-aws-profile
-
-
部署 Serverless Framework:
-
运行以下命令部署 Serverless Framework:
sls deploy
-
pyenv 安装和使用
-
安装 pyenv:
-
使用 Homebrew 安装 pyenv:
brew install pyenv
-
-
配置 pyenv:
-
编辑
~/.bashrc
或~/.zshrc
文件添加以下配置:export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init --path)" eval "$(pyenv init -)"
-
-
安装 Python 版本:
-
使用以下命令安装 Python 版本:
pyenv install 3.8.16
-
-
切换 Python 版本:
-
使用以下命令切换 Python 版本:
pyenv local 3.8.16
-
-
查看 Python 版本:
-
使用以下命令查看 Python 版本:
python --version
-
pyenv 常用命令
- pyenv install:安装 Python 版本
- pyenv uninstall:卸载 Python 版本
- pyenv list:查看已安装的 Python 版本
- pyenv local:切换 Python 版本
- pyenv global:设置全局 Python 版本
- pyenv shell:设置 shell 中的 Python 版本
Python 常用命令
- python --version:查看 Python 版本
- python -m pip:运行 pip 命令
- python -m venv:创建虚拟环境
- python -m pip install:安装包
- python -m pip list:查看已安装的包
Serverless Framework 常用命令
- sls deploy:部署 Serverless Framework
- sls invoke:调用 Lambda 函数
- sls logs:查看 Lambda 函数日志
- sls info:查看 Serverless Framework 信息
- sls config:配置 Serverless Framework