面临 KeyError: 'AWS_LAMBDA_RUNTIME_API' 问题

8

我是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" ]

错误

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'

有人之前遇到过这个问题吗?怎么解决呢?


你在环境变量AWS_LAMBDA_RUNTIME_API中设置了吗? - Devang Sanghani
我认为我们不需要设置这个环境变量,因为 Lambda 会自动处理。我尝试设置了 ENV AWS_LAMBDA_RUNTIME_API=3.9,但仍然没有起作用。 - Manoj Dhake
2个回答

6

如果我没记错的话,您正在构建自定义 Docker 镜像。

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

我遇到了类似的问题,并通过Testing Images AWS documentation 解决了这个问题。

您需要在构建中添加 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  

并修改入口点:

ENTRYPOINT [ "~/.aws-lambda-rie/aws-lambda-rie","/usr/local/bin/python", "-m", "awslambdaric" ]

请注意,根据文档建议,此实例仅适用于模拟环境而非Lambda。

在构建Docker镜像后,您可以启动它:

docker run -p 9000:8080 your-image

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

curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

谢谢。您介意解释一下最后一个URL中的“2015-03-31”吗?另外,我不得不从所有路径中删除“~”才能使其正常工作。 - Rami Alloush
@RamiAlloush 不确定接下来是什么。AWS有不同的API版本,它们通过日期进行标识。如果您在某个地方安装了AWS SDK并检查数据文件夹,就可以看到它们。AWS Lambda工具必须具有类似的版本,并且端点希望在URL中找到它。 - AsTeR

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接