面临问题 KeyError:“AWS_LAMBDA_RUNTIME_API”

Man*_*ake 8 python docker aws-lambda

我是 lambda 新手,其中尝试将 lambda 与 docker 图像一起使用。我需要使用我自己的 docker 镜像作为基础镜像,而不是 aws 提供的 lambda 镜像。下面是我的 docker 文件,基本映像是python:3.9.6。但是,当我尝试执行 lambda 函数时,出现以下错误。

我指的是下面的链接来执行下面的实现。AWS 文档链接

# Define function directory
ARG FUNCTION_DIR="/function/"

FROM python:3.9.6 as build-image

# Install aws-lambda-cpp build dependencies
RUN apt-get update && \
  apt-get install -y \
  g++ \
  make \
  cmake \
  unzip \
  libcurl4-openssl-dev

# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Create function directory
RUN mkdir -p ${FUNCTION_DIR}

# Copy function code
COPY app/* ${FUNCTION_DIR}

# Install the runtime interface client
RUN pip install \
        --target ${FUNCTION_DIR} \
        awslambdaric

# Multi-stage build: grab a fresh copy of the base image
FROM python:3.9.6

# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Set working directory to function root directory
WORKDIR ${FUNCTION_DIR}

# Copy in the build image dependencies
COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR}

ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]
CMD [ "lambda_function.lambda_handler" ]
Run Code Online (Sandbox Code Playgroud)

错误

raceback (most recent call last):
  File "/usr/local/lib/python3.10/runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/local/lib/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/function/awslambdaric/__main__.py", line 20, in <module>
    main(sys.argv)
  File "/function/awslambdaric/__main__.py", line 14, in main
    lambda_runtime_api_addr = os.environ["AWS_LAMBDA_RUNTIME_API"]
  File "/usr/local/lib/python3.10/os.py", line 679, in __getitem__
    raise KeyError(key) from None
KeyError: 'AWS_LAMBDA_RUNTIME_API'
Run Code Online (Sandbox Code Playgroud)

有人之前遇到过这个问题吗?我们该如何解决呢?

AsT*_*TeR 6

如果我是正确的,您正在构建一个自定义的 docker 镜像。

如果您想在本地进行测试,则需要使用运行时接口仿真器 (RIE)。

我遇到了类似的问题并通过测试图像AWS文档解决了它

您需要在构建中添加 RIE:

RUN mkdir -p ~/.aws-lambda-rie && curl -Lo ~/.aws-lambda-rie/aws-lambda-rie \
https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie \
&& chmod +x ~/.aws-lambda-rie/aws-lambda-rie  
Run Code Online (Sandbox Code Playgroud)

并更改入口点:

ENTRYPOINT [ "~/.aws-lambda-rie/aws-lambda-rie","/usr/local/bin/python", "-m", "awslambdaric" ]
Run Code Online (Sandbox Code Playgroud)

请注意,此实例无法在 lambda 中工作,而只能在文档中建议的模拟中工作。

docker 镜像构建完成后,您可以启动它:

RUN mkdir -p ~/.aws-lambda-rie && curl -Lo ~/.aws-lambda-rie/aws-lambda-rie \
https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie \
&& chmod +x ~/.aws-lambda-rie/aws-lambda-rie  
Run Code Online (Sandbox Code Playgroud)

然后您可以尝试发送测试请求:

ENTRYPOINT [ "~/.aws-lambda-rie/aws-lambda-rie","/usr/local/bin/python", "-m", "awslambdaric" ]
Run Code Online (Sandbox Code Playgroud)


小智 2

如果您真的在 AWS 文档中寻找,他们建议使用它作为创建自定义 docker 映像的框架:https ://aws.amazon.com/blogs/aws/new-for-aws-lambda-container-image-support/

您必须安装一个附加文件https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie,然后设置一个脚本entry.sh并且它可以工作