iOSアプリからMongoDBへ直接アクセスしようと試行錯誤して得たもの

はじめに

SwiftからMongoDBへなんとなく接続できそうな気がして、iOSアプリからMongoDBへ何とか直接アクセスしようと試行錯誤しておりました。

結果:諦めました

Authentication failed: The SCRAM_SHA_256 authentication mechanism requires libmongoc built with ENABLE_SSL

どうしてもこのエラーを解消することができませんでした。

エラーメッセージを額面通りに受け取ると、MongoDBサーバではSCRAM_SHA_256 authentication mechanismというものを採用していて、そのメカニズムで稼働しているDBにアクセスするためにはlibmongoc built with ENABLE_SSLが必要とのこと。

少ないですが尽した手の数々。

  • libmongoc built with ENABLE_SSLを用意するべくソースコードからビルド
  • cocoapodsでMongoSwiftやlibmongoc(mongo-c-driver)を入れ直してみた
  • OpenSSLを入れ直してみた

MongoDBを改めてセッティングするという手やSSL(仮サーバなのでオレオレ証明書)接続できるようにするなど、今から思えば策はまだ有った。でも2日ほど悩んでいた私は疲れ果ててしまい、酒を呑んで寝ることにしたのでした。

アプリケーションから直接DBサーバにアクセスする事に関する考察

前提

ここでいうアプリケーションはiOSアプリに限らずやAndroid上で動くアプリやWindowsアプリケーションも含みます。DBサーバはMongoDBに限らず、MariaDBやOracleなどのDBも含みます。
ただし、SQLiteやAccessなど、アプリ内に居るファイルベースのものやローカル内で稼働するものは除きます。

記載の社名や商品名などは、各社の商標です。念為。
当方が書いたからといって、当方が使用をおすすめするもの等ではありません。念為。

私はアプローチを間違えていたのかもしれない

DB専門家では決してないので、間違っているかもしれません。話半分に聞き流して貰えれば幸い。

そもそもの話になりますが、アプリケーションから直接DBにアクセスすることってあまり聞かないような気がします。データベースのメンテナンスでSQL*Plusなどを使うことはありますが、あれはあくまでもメンテナンスです。不特定多数が利用するアプリケーションで1つのDBサーバにアクセスさせるのはリスクが大きいのではないか。

「リスクが大きい」といっても何がリスクなのか理解できているか自分でもわからないですが、そんなことをうつらうつらとしながら考えたのでありました。

アプリケーションとDBサーバを直接アクセスさせるメリットとデメリット

アプリケーションとDBサーバへ直接アクセスさせるのは、ある意味で開発が簡単です。RDBならSQLを直接投げてデータを返してもらうだけです。サーバをちまっと準備するだけなので機材の準備も簡単です。

一方で、アプリケーションの利用者が多くなった場合はどうか?
1つのDBサーバで運用していた場合、どんどん増強する必要があります。また、何かしら不具合が生じると一気に使えなくなります。認証の問題もあります。

アプリケーションサーバを間に立たせるほうがいいのでは?

機材の準備が手間ですが、アプリケーションとDBサーバの間にアプリケーションサーバ(Webサーバ)を立てるほうがいいのではないかと思うのです。アプリケーションからアプリケーションサーバのAPIを叩きデータを取得する。DBサーバには直接アクセスせずアプリケーションサーバとの間でやり取りをさせる。

アプリケーションとアプリケーションサーバ間とアプリケーションサーバとDBサーバ間の両方で開発が必要になるので、その分労がかかります。機材の準備も手間がかかります。

その代わり、アプリケーションの利用者が多くなった場合でもサーバの管理運用が比較的容易です。アプリケーションの利用者からはDBサーバがアプリケーションサーバの裏に隠れているので、バックアップDBサーバが居ようが、それに切り替わろう、そもそも複数のDBサーバで負荷分散をしていようが意識せずに使えます。

もちろん、それなりに知識を持ち、手慣れていないとできないことだとは思います。私はせよと言われてもすぐにはできないと思います。

まとめ

アプリケーションから直接MongoDBに接続する案はこれ以上は難しいように思われるので、アプローチを変えてみようと思います。DBサーバを立てるのは済んでいるので、今度はアプリケーションサーバを作ってみるプランで行きます。

アプリケーションからアプリケーションサーバのAPIを介してDBサーバからデータを取得する。初めての分野であり初めての挑戦でもありますが、せっかくの機会です。やってみようと思います。