如何在本地调试AWS Python Lambda镜像

1 投票
1 回答
69 浏览
提问于 2025-04-14 15:36

我正在尝试在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 个回答

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 '{}'

撰写回答