[英]AWS Lambda "no module named 'grpc'" despite including it in the function zip file
我正在尝试让一个(现在)简单的 gRPC 客户端 function 在 AWS Lambda 中工作。我已经阅读了构建一个 function ZIP 文件,其中包含使用 python virtualenv 的依赖项,并且在我的构建环境中,激活了 venv, function 作品。 但是,当我将 .zip 上传到 AWS Lambda 时,function 运行时出现“No module named 'grpc'”。
我正在使用以下 DockerFile 在 Docker 中构建 zip 文件:
FROM amazonlinux:latest as lambda-build
RUN \
yum install -y python3 python3-pip curl zip \
&& yum clean all
RUN python3 -m pip install virtualenv
COPY index.py /opt/lambda-function/
COPY gRPC /opt/lambda-function/gRPC/
RUN \
cd /opt/lambda-function \
&& pip3 install --upgrade pip \
&& python3 -m virtualenv . \
&& source ./bin/activate \
&& python3 -m pip install --upgrade pip \
&& python3 -m pip install cygrpc grpcio google-api-python-client watchtower \
&& deactivate
RUN \
cd /opt/lambda-function \
&& cd lib/python*/site-packages \
&& zip -r /opt/lambda-function_lambda.zip . \
&& cd /opt/lambda-function/ \
&& zip -g -r /opt/lambda-function_lambda.zip *.py gRPC/*.py
index.py
看起来像这样(简化):
import logging
import grpc
import gRPC.bookingsapi_pb2 as bookingsapi_pb2
import gRPC.bookingsapi_pb2_grpc as bookingsapi_pb2_grpc
def getGRPCStatus():
# gRPC stuff here
def lambda_handler(event, context):
# Entrypoint when running as AWS lambda
getGRPCStatus()
if __name__ == '__main__':
getGRPCStatus()
然后我将 resulting.zip 上传到 AWS Lambda 并点击 TEST 这给了我
{
"errorMessage": "Unable to import module 'index': No module named 'grpc'",
"errorType": "Runtime.ImportModuleError",
"stackTrace": []
}
我不明白为什么它在构建环境 venv 中有效,但在 AWS 中无效。
我让它工作了。 我假设lib64
只是lib
的符号链接,并且两者是相同的,因此我只是压缩lib
。 事实上,在这个 venv 中,它不是一个符号链接,gRPC 模块被安装在lib64
中。 我将lib64
放入我的 zip(并遗漏了lib
,我不需要里面的任何东西,所以管理了一个较小的 zip)并且在上传到 Lambda 时它起作用了。
当我意识到我可以找到在工作环境中加载 grpc 模块的位置时,我得到了这个灵光一现的时刻
import grpc
print(grpc)
这将我带到lib64
目录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.