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