我目前正在编写一个部署在AWS Lambda上的Python服务器。我想使用firebase-admin包发送通知与FCM和从云firestore读取数据。但是,当我尝试使用.zip文件归档将函数部署到AWS Lambda时,我在执行时得到以下错误:
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': Failed to import the Cloud Firestore library for Python. Make sure to install the "google-cloud-firestore" module.
我用这个安装了模块:pip install --target . firebase-admin
到一个文件夹中,添加了我的代码文件(按照指示到根目录),递归地压缩它,并用aws-cli上传它,我可以清楚地看到,有一个google-cloud-firestore文件夹在。zip中,所以我不知道发生了什么。任何帮助都是感激的!
问题是firebase-admin包使用的一些库在不同的操作系统上编译不同,所以你需要创建一个docker映像并安装所有内容,将其压缩并作为一个层上传。下面是一个docker文件示例:
FROM amazonlinux:2.0.20210126.0
RUN yum -y groupinstall "Development Tools" &&
yum -y install openssl-devel bzip2-devel libffi-devel &&
yum -y install wget &&
wget https://www.python.org/ftp/python/3.8.7/Python-3.8.7.tgz &&
yum install -y tar &&
yum install -y gzip &&
tar xvf Python-3.8.7.tgz &&
cd Python-3.8*/ &&
./configure --enable-optimizations &&
make altinstall &&
yum install -y zip &&
yum clean all
RUN python3.8 -m pip install --upgrade pip &&
python3.8 -m pip install virtualenv
RUN python3.8 -m venv myvenv
RUN source myvenv/bin/activate
RUN pip install firebase-admin -t ./python
RUN deactivate
RUN zip -r python.zip ./python/
然后复制zip文件:
docker cp container_name:python.zip ./Desktop/
你要找的是一个LambdaLayer。
网上有很多资源,但本质上你想制作一个格式为*:
的Zip文件myLayer.zip python//
——
- lib/
------ pythonX。Y/
-------- 网站/
----------firebase-admin
---------- ...
<一口>*,X。Y一口>
然后,无论是在AWS控制台还是在您的CI/CD中,您都可以将LambdaLayer添加到Function的配置中,从而允许您导入其中的所有库。
看起来您已经正确地绑定了代码并成功地部署了。发生此错误是因为Firestore依赖于基于c的GRPC实现。默认情况下,这在AWS Lambda上不起作用。我目前正在创建一个解决方案,并将更新这篇文章与我的结果。
如果有人能解释如何运行docker文件,将对下一个人有用。
我不是专家,所以我所做的是根据提到的映像创建一个docker实例,然后我在CLI中单独执行每个命令,最后,由于我无法将文件从容器压缩并复制到桌面,我不得不通过Linux虚拟环境中的windows资源管理器找到文件夹,以便我可以压缩并带来。
它确实有效,但是,如果有人能通过让每个人都知道如何构建和执行docker文件来补充最佳答案,将会非常有帮助。
最好!