构建Lambda Layer

记录下如何为Python3.8环境的Lambda构建Lambda layer,安装对应的package,并在Lambda函数中使用该Layer。

  1. 编辑'requirements.txt,写下自己所需的package,例如
flask
pandas
scikit-learn
  1. 执行下列命令,这条命令会在python3.8环境的aws docker中安装package,并保存在本地的./python/文件夹
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -i https://pypi.douban.com/simple/ -t python/lib/python3.8/site-packages/; exit"
  1. 把python文件夹打包成zip
zip -r my-layer.zip python
  1. 推到AWS Layer中
aws lambda publish-layer-version     --layer-name "my-layer"     --description "Test Layer" --zip-file "fileb://my-layer.zip"     --compatible-runtimes "python3.8"

脚本调用

为了方便使用,可以使用下面的脚本来调用,一键部署Lambda Layer

  1. requirements.txt文件里面写下需要安装的python库
  2. 执行./create_lambda_layer.sh -v python版本 -n layer名字 -d 描述
    例如:./create_lambda_layer.sh -v "python3.8" -n "test-layer" -d "Test layer"

create_lambda_layer.sh

#!/usr/bin/env bash

# 使用方法 ./create_lambda_layer.sh -v python版本 -n layer名字 -d 描述
# 编辑requirements.txt,写下所需的库
# ./create_lambda_layer.sh -v "python3.8" -n "twilio-layer" -d "Twilio 6.40.0 Layer"

while [[ "$#" -gt 0 ]]; do case $1 in
  -v|--version) pythonEnvs+=("$2"); shift;;
  -n|--layer-name) layerName="$2"; shift;;
  -d|--desc) layerDescription="$2"; shift;;
  *) echo "Unknown parameter passed: $1"; exit 1;;
esac; shift; done


# Create and install requirements to directory.
for penv in ${pythonEnvs[@]}; do
    mkdir -pv python/lib/${penv}/site-packages
    docker run -v "$PWD":/var/task "lambci/lambda:build-${penv}" /bin/sh -c "pip install -i https://pypi.douban.com/simple/ -r requirements.txt -t python/lib/${penv}/site-packages/; exit"
done


# Create zip file of environments.
zip -r ${layerName}.zip python


# Publish Layer to Lambda.
aws lambda publish-layer-version \
    --layer-name "${layerName}" \
    --description "${layerDescription}" \
    --zip-file "fileb://${layerName}.zip" \
    --compatible-runtimes ${pythonEnvs[@]}

构建lambda函数,并添加之前push上去的层

假设运行的代码在当前app目录中,那么首先把代码打包并上传到s3上。接着创建Lambda函数。

创建函数的时候,需要指定下面内容:

  • handler: 要执行的文件和函数,例如执行app.pyhandler()那么handler就是app.handler
  • role:执行Lambda的Role
  • timeout:超时秒数
  • memory-size:模型大小
  • code 代码所在的S3 Bucket和关键字
  • runtime:运行环境
  • layer:需要添加的层
#!/bin/bash

# copy app 文件到 s3
cd app/
zip -gr ../functions.zip .
cd ../
aws s3 cp functions.zip s3://bucket-name/lambda-prefix/

# 如果已经有改名字的Lambda了,可以先删除原有的Lambda
# aws lambda delete-function --function-name lambda_name

# 创建Lambda函数
aws lambda create-function --function-name lambda_name \
        --handler app.handler \
        --role arn:aws-cn:iam::xxx:role/xxx \
        --timeout 600 \
        --memory-size 512 \
        --code S3Bucket=bucket-name,S3Key=lambda-prefix/functions.zip \
        --runtime python3.8 \
        --layers \
        "arn:aws-cn:lambda:cn-northwest-1:4xxx:layer:my-xxx:2"
最后修改:2021 年 06 月 01 日 02 : 39 PM
如果觉得我的文章对你有用,请随意赞赏