问题描述
我目前正在编写要在 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 上传它,我可以清楚地看到有.zip 中的 google-cloud-firestore 文件夹,所以我不确定发生了什么。任何帮助表示赞赏!
解决方法
问题在于 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/
-- 蟒蛇/
---- 库/
------ 蟒蛇X.Y/
-------- 站点包/
---------- firebase-admin
---------- ...
*其中 X.Y 是您要定位的 Python 版本
然后,在 AWS 控制台或 CI/CD 中,您可以在函数的配置中添加该 LambdaLayer,这样您就可以导入其中的所有库。
,从外观上看,您已正确捆绑代码并成功部署。发生该错误是因为 Firestore 依赖于基于 C 的 GRPC 实现。默认情况下,这不适用于 AWS Lambda。我目前正在创建一个变通方法,并将用我的结果更新这篇文章。
,运行这个
pip install --target . firebase-admin
进入你的根文件夹而不是子文件夹,它会工作。