如何在本地调试AWS Python Lambda镜像
我正在尝试在Python中开发一个自定义的运行时环境,以便进行流式响应。为此,我参考了这篇
博客。
这是我的dockerfile:
FROM public.ecr.aws/lambda/provided:al2-x86_64
# Install SSL Li
WORKDIR /tmp
RUN yum install -y perl-core zlib-devel gzip wget tar make gcc
RUN wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz
RUN ls
RUN tar -xvf openssl-1.1.1l.tar.gz
RUN cd openssl-1.1.1l \
&& ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib \
&& make \
&& make install
ENV PATH="/usr/local/ssl/bin:${PATH}"
ENV LD_LIBRARY_PATH="/usr/local/ssl/lib:${LD_LIBRARY_PATH}"
# Update YUM
RUN yum update -y
# Download and extract Python
RUN wget https://www.python.org/ftp/python/3.11.1/Python-3.11.1.tgz
RUN tar xvf Python-3.11.1.tgz
# Configure and compile Python
RUN cd Python-3.11.1 && \
./configure --enable-optimizations --with-openssl=/usr/local/ssl && \
make altinstall
# Verify Python and SSL module
RUN python3.11 --version
RUN python3.11 -m ssl
# Copy custom runtime bootstrap
COPY bootstrap ${LAMBDA_RUNTIME_DIR}
RUN chmod +x ${LAMBDA_RUNTIME_DIR}/bootstrap
# requirements.txt
COPY requirements.txt ${LAMBDA_TASK_ROOT}/requirements.txt
RUN python3.11 -m pip install -r ${LAMBDA_TASK_ROOT}/requirements.txt -t ${LAMBDA_TASK_ROOT}/
# Copy function code
COPY lambda_function.py ${LAMBDA_TASK_ROOT}/lambda_function.py
RUN python3.11 -m pip install requests
# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "lambda_function.handler" ]
这是我的lambda_function.py:
#! /usr/bin/env python
import json, boto3
client = boto3.client("bedrock-runtime")
def handler(event, context):
print("handler triggereed")
return {
"statusCode":200,
"body":"Hello World"
}
我使用这个作为参考,构建并调用了容器镜像:
docker build --platform linux/amd64 -t docker-image:test .
安装了运行时接口客户端。
然后运行这个镜像。
docker run --platform linux/amd64 -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
--entrypoint /aws-lambda/aws-lambda-rie \
docker-image:test \
/usr/local/bin/python -m awslambdaric lambda_function.handler
接着调用了容器。
curl "http://localhost:9000/2018-06-01/runtime/invocations/next" -d '{}'
结果返回:
404, 页面未找到
我找不到具体是哪里出错了。
我查看了日志,但没有显示任何错误日志,只有一条:
<日期时间> [INFO] {rapid} 执行 '/usr/file/local/python' (cwd=/tmp, handler=lambda_function.handler)
在构建命令中,入口点设置为aws-lambda-rie。所以我打算在aws-lambda-rie里面插入调试语句。当我进入目录后运行:
cat /aws-lambda-rie
结果显示了一堆乱码,我意识到这是一个二进制文件,所以我无法调试它,也无法确定为什么会失败。
而且,当我发送请求时,lambda函数中的调试语句没有被打印,这表明请求在触发处理程序之前就已经失败了。
请给我一些方向,告诉我该往哪里查找。谢谢!
1 个回答
我发现我之前做错了什么:
我在安装运行时接口模拟器,但因为这个镜像是AWS的操作系统专用基础镜像,所以运行时接口模拟器已经安装好了,不需要再装。而且,设置入口点为 /aws-lambda/aws-lambda-rie
也是多余的。另外,调用的URL也不正确,具体可以参考这里
为了构建和调用,我按照以下步骤操作,成功了:
docker build --platform linux/amd64 -t docker-image:test .
然后运行这个容器:
docker run --platform linux/amd64 -p 9000:8080 docker-image:test
接着用正确的URL调用这个容器(在另一个终端中):
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'