簡體   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