背景描述
对于从 Lambda Console通过 Author from scratch
创建的函数, 可以直接在浏览器中编辑代码和调试, 非常方便. 不过由于 Lambda 函数 Quota 限制 Console 编辑器最大 3MB, 包含 Layer 和自定义 Runtim 后最大 250MB, 并且此配额不支持提限, 因此当函数体量较大时就不适合了. 而 Container Image 方式最大支持 10GB (包含 Layer 和自定义 Runtime), 可以满足更高的需求.
本文将讨论如何将现有的 Lambda 函数转换成 Container Image 方式进行部署.
操作步骤
导出现有的 Lambda 函数
从 Console 创建的一个简单的 Python 3.10 函数, 入口函数名为 lambda_handler
import json
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
Console 方式
AWS CLI 方式
# Linux
aws lambda get-function --function-name pd-demo --query 'Code.Location' | xargs curl -o function.zip
# 如果 xargs 命令找不到, 需要单独安装
# sudo apt install findutils
# Windows PowerShell
Invoke-WebRequest -Uri (aws lambda get-function --function-name pd-demo --query 'Code.Location').trim('"') -OutFile function.zip
创建 Container image
官方文档
# 解压导出的 ZIP 文件
unzip function.zip -d function && cd function
# 创建依赖说明文件
vim requirements.txt
# 创建 Dockerfile
vim Dockerfile
requirements.txt
示例
pandas == 2.0.3
requests == 2.31.0
Dockerfile
示例 (Python 3.10)
FROM public.ecr.aws/lambda/python:3.10
# Copy requirements.txt
COPY requirements.txt ${LAMBDA_TASK_ROOT}
# pip 使用清华大学镜像源
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt --no-cache-dir
# Copy function code
COPY lambda_function.py ${LAMBDA_TASK_ROOT}
# 注意这里的入口命令需要和代码中的入口函数名称保持一致
CMD [ "lambda_function.lambda_handler" ]
# 构建 Image
docker build --platform linux/amd64 -t pd-demo:latest .
# 本地启动 Container 测试
docker run -p 9000:8080 --rm pd-demo:latest
# 使用 curl 测试调用
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
# 成功返回
{"statusCode": 200, "body": "\"Hello from Lambda!\""}
上传 Container image 到 ECR
首先在和 Lambda 相同 Region 的 ECR Console 创建 Repository, 或者通过 AWS CLI 创建:
aws ecr create-repository --repository-name pd-demo --region cn-northwest-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
登录并推送本地构建好的 Image 到 ECR, 相关命令可以直接从 ECR repository 的 View push commands
获取
aws ecr get-login-password --region cn-northwest-1 | docker login --username AWS --password-stdin 000000000000.dkr.ecr.cn-northwest-1.amazonaws.com.cn
docker tag pd-demo:latest 000000000000.dkr.ecr.cn-northwest-1.amazonaws.com.cn/pd-demo:latest
docker push 000000000000.dkr.ecr.cn-northwest-1.amazonaws.com.cn/pd-demo:latest
通过 Container image 创建 Lambda 函数
Lambda Console > Create function > Container image > Browse images
需要留意, 通过 Container image 创建的函数将不再能从浏览器中直接查看和编辑代码
测试正常运行