[Firestore] 云函数(触发器)+ AWS Elasticsearch 的困扰总结

通过整理,总结了在使用[Firebase]云函数(触发器) + AWS Elasticsearch时遇到的问题。

Firestore/RealtimeDatabase与CloudFunction(触发器)= AWS Elasticsearch。

由于创建了上述的结构,因此总结了构建过程中的发现和困惑。

首先

我认为,由于Firebase没有提供全文搜索功能,所以根据官方文档的建议,我们可能需要引入Algolia。

然而,我认为在金融和基础设施方面,有时候可能会考虑引入AWS Elasticsearch(以下简称AWS ES)作为全文检索的解决方案。

构成

当对Firestore/RealtimeDatabase进行数据添加、修改或删除时,触发CloudFunction来执行,并将数据流式传输到Elasticsaerch。

Firebase计划的更改

必须将Firebase计划从Spark更改为Blaze。

只有免费套餐的 Spark 允许在Google服务内进行封闭通信。如果需要从 CloudFunction 通过网络与 AWS ES 进行通信,需要切换到按使用量计费的 Blaze 套餐。

不仅在生产环境,也需要在开发/暂存环境中提升相同的计划。

CloudFunction 触发时连接到 AWS ES 的凭据和部署。

当CloudFunction连接到AWS ES时,CloudFunction的AWS SDK会读取env中的credentials。但是这不是CloudFunction提供的默认配置方法,因此可能需要一些hack的方法。

首先,在这次的架构中,我们会使用 Firebase 的实时数据库/云端存储作为触发 Cloud Function 的变动操作。

在这种情况下,使用名为aws-sdk的软件包进行身份验证并连接到AWS ES是一种连接到CloudFunction并连接到AWS ES的方法,因为需要进行身份验证,所以需要凭证(id/key)。

这些凭据可以通过几种方式进行加载,但是在不支持文件部署的 CloudFunction 中无法使用 JSON / credentials 文件进行加载,因此实际上需要使用环境变量。

    Node.js での認証情報の設定 – AWS SDK for JavaScript

然而,在这里部署的命令与其相容性成为问题。

由于凭据的信息需要设置在环境变量中,因此在部署时需要指定 CloudFunction 环境设置。但是,由于 Firebase 部署命令 firebase deploy 不支持传递环境变量,所以必须通过以下方法之一来硬编码地进行部署。

    Firebase: Cloud Function の Trigger にて config ではなく process.env の環境変数を設定する – Qiita

使用Cloud Functions来进行 AWS ES 的认证和连接。

基本上,连接是通过按照官方方法使用 aws-sdk 进行的。

我本来打算使用axios或fetch等HTTP客户端来建立连接,但由于连接与认证紧密耦合,所以基本上不可行。

(虽然我可以自己构建通信层,但因为非常困难,所以我放弃了。)

在AWS ES中,无法安装除了内置插件之外的其他插件。

在AWS ElasticSearch中,除了内置的插件之外,无法安装其他插件。

在AWS ES上,默认安装了一些常用的插件,包括kuromoji、ICU等。

    Amazon AWS Elasticsearch installing plugins and files – Stack Overflow

相反地,无法自行安装其他插件。

虽然如此,我认为通常情况下,只需要添加CharFilter/Tokenier/TokenFilter来处理这两个就足够了。

在中国人的母语中,以下是对上述句子的一种表达方式:

对于Elasticsearch和AWS ES,最好将它们视为不同的东西。

在开发/演示/生产环境中,最好使用AWS ES而不是使用Docker等来使用Elasticsearch的容器等进行验证。

由于这是我在ES上的第一个开发项目,所以我在本地搭建了一个Docker的ES环境,然后在这里进行了各种运行确认,然后再进行了AWS ES的搭建,但是这个流程并不是很理想。

因为Elasticsearch和AWS ES的可行性略有差异,具体如下所示。

    • AWS ES では Tokenizer などのプラグインは自動で入ってる。なので、設定すればすぐに使える。逆に追加はできない。

 

    AWS ES では一部の API や変更できる設定値が少ない。具体的には、*でインデックスを DELETE できないように設定するべき -XPUT /_cluster/settings -d “persistent”: {“action.destructive_requires_name”: true } ができない。など。

所以,在使用AWS ES进行开发时,最好直接操作AWS ES而不是操作Elasticsearch。

无法通过 SSH 连接到 AWS ES。

不行。

    Amazon Elasticsearch Service トラブルシューティング – Amazon Elasticsearch Service

引用

    • Amazon Elasticsearch Service の認証・認可に関する面倒くさい仕様をなるべくわかりやすく説明する – 無印吉澤

 

    [小ネタ]Amazon Elasticsearch Service/Kibana にユーザ認証でアクセスしてみる | Developers.IO
bannerAds