繁体   English   中英

AWS Lambda“没有名为‘grpc’的模块”,尽管它包含在 function zip 文件中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM