使用 AWS Lambda 的 Firebase 管理员 Python

Firebase-Admin with AWS Lambda Python

我目前正在编写 Python 服务器部署在 AWS Lambda 上。我想使用 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 文件夹,所以我不确定发生了什么。感谢您的帮助!

您要查找的是LambdaLayer

网上有很多资源,但基本上你想制作这种格式的 Zip 文件*:

myLayer.zip/
-- python/
---- lib/
------ pythonX.Y/
-------- site-packages/
---------- firebase-admin
---------- ...

*其中 X.Y 是您要定位的 python 版本

然后,在 AWS 控制台或您的 CI/CD 中,您可以将 LambdaLayer 添加到函数的配置中,这样您就可以导入其中的所有库。

从外观上看,您已正确捆绑代码并成功部署。发生该错误是因为 Firestore 依赖于基于 C 的 GRPC 实现。默认情况下,这不适用于 AWS Lambda。我目前正在创建一个解决方法,并将用我的结果更新此 post。

问题是 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/ 

运行这个

pip install --target . firebase-admin

进入你的根文件夹而不是子文件夹,它会起作用。