使用 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
进入你的根文件夹而不是子文件夹,它会起作用。
我目前正在编写 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
进入你的根文件夹而不是子文件夹,它会起作用。