微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 AWS Lambda Python 的 Firebase-Admin

如何解决使用 AWS Lambda Python 的 Firebase-Admin

我目前正在编写要在 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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?