Lambda 层Layer创建方法比较(Mac M1 ARM)

80 阅读3分钟

在 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 层的步骤如下:

  1. 创建层目录并安装包
  2. 手动创建 zip 文件
  3. 使用 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 层的步骤如下:

  1. 创建层目录并安装包
  2. 编写 serverless.yml 文件
  3. 使用 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

主要区别

  1. 部署工具

    • 方法一使用 AWS CLI
    • 方法二使用 Serverless Framework
  2. 配置方式

    • 方法一通过命令行参数配置
    • 方法二通过 serverless.yml 文件配置
  3. 打包过程

    • 方法一需要手动创建 zip 文件
    • 方法二由 Serverless Framework 自动处理打包

关键要点

  1. Python 版本

    • 两种方法都使用 Python 3.8,这是通过 pyenv 安装和设置的:

      pyenv install 3.8.16
      pyenv local 3.8.16
      
  2. 平台兼容性

    • 两种方法都使用 --platform=manylinux2014_x86_64 --only-binary=:all: 参数来确保包的兼容性:

      pip3 install --platform=manylinux2014_x86_64 --only-binary=:all: --target layer/python -r requirements.txt
      
  3. 目录结构

    • 正确的目录结构至关重要。包应该安装在 layer/python 目录中:

      mkdir -p layer/python
      
  4. serverless.yml 中的路径设置

    • 在使用 Serverless Framework 时,确保在 serverless.yml 中正确设置层的路径:

      layers:
        pythonLibs:
          path: layer
      
  5. 层的引用

    • 在 Lambda 函数的 serverless.yml 中,使用 CloudFormation 输出引用层:

      layers:
        - ${cf:python-libs-layer-${opt:stage, self:provider.stage}.PythonLibsLambdaLayerQualifiedArn}
      

方法三,手工方法

手工上传 Layer 到 S3

您可以手工将 Layer 上传到 S3,然后在 AWS Lambda 中引用它。以下是步骤:

  1. 创建 Layer:创建一个包含您的代码和依赖项的 zip 文件。
  2. 上传到 S3:将 zip 文件上传到您的 S3 存储桶中。
  3. 获取 S3 对象 URL:获取 S3 对象的 URL,例如 s3://my-bucket/my-layer.zip
  4. 在 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 配置

  1. 安装 AWS CLI

    • 使用 Homebrew 安装 AWS CLI:

      brew install awscli
      
  2. 配置 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
      
  3. 配置 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
      
  4. 切换 AWS CLI 配置文件

    • 使用以下命令切换 AWS CLI 配置文件:

      aws --profile your-aws-profile sts get-caller-identity
      

Serverless Framework 角色设置

  1. 创建 Serverless Framework Users

    需要的权限如下

image.png

  1. 配置 Serverless Framework

    • 编辑 serverless.yml 文件添加以下配置:

      provider:
        name: aws
        runtime: python3.8
        stage: ${opt:stage, 'dev'}
        region: us-west-2
        profile: your-aws-profile
      
  2. 部署 Serverless Framework

    • 运行以下命令部署 Serverless Framework:

      sls deploy
      

pyenv 安装和使用

  1. 安装 pyenv

    • 使用 Homebrew 安装 pyenv:

      brew install pyenv
      
  2. 配置 pyenv

    • 编辑 ~/.bashrc~/.zshrc 文件添加以下配置:

      export PYENV_ROOT="$HOME/.pyenv"
      export PATH="$PYENV_ROOT/bin:$PATH"
      eval "$(pyenv init --path)"
      eval "$(pyenv init -)"
      
  3. 安装 Python 版本

    • 使用以下命令安装 Python 版本:

      pyenv install 3.8.16
      
  4. 切换 Python 版本

    • 使用以下命令切换 Python 版本:

      pyenv local 3.8.16
      
  5. 查看 Python 版本

    • 使用以下命令查看 Python 版本:

      python --version
      

pyenv 常用命令

  1. pyenv install:安装 Python 版本
  2. pyenv uninstall:卸载 Python 版本
  3. pyenv list:查看已安装的 Python 版本
  4. pyenv local:切换 Python 版本
  5. pyenv global:设置全局 Python 版本
  6. pyenv shell:设置 shell 中的 Python 版本

Python 常用命令

  1. python --version:查看 Python 版本
  2. python -m pip:运行 pip 命令
  3. python -m venv:创建虚拟环境
  4. python -m pip install:安装包
  5. python -m pip list:查看已安装的包

Serverless Framework 常用命令

  1. sls deploy:部署 Serverless Framework
  2. sls invoke:调用 Lambda 函数
  3. sls logs:查看 Lambda 函数日志
  4. sls info:查看 Serverless Framework 信息
  5. sls config:配置 Serverless Framework