构建Lambda Layer
记录下如何为Python3.8环境的Lambda构建Lambda layer,安装对应的package,并在Lambda函数中使用该Layer。
- 编辑'
requirements.txt
,写下自己所需的package,例如
flask
pandas
scikit-learn
- 执行下列命令,这条命令会在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"
- 把python文件夹打包成zip
zip -r my-layer.zip python
- 推到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
- 在
requirements.txt
文件里面写下需要安装的python库 - 执行
./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.py
中handler()
那么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"