🦊

RenderサーバーがMongoDBのSSLハンドシェイクに失敗するエラー原因

2024/06/24に公開

こんにちは、学生エンジニアのMasamichiです!最近惰性でも自炊ができるようになってきて1日1食くらいは作れるようになってきました🔥

さて今回はホスティングにRenderを使用した際にMongoDBでSSLハンドシェイクに失敗することがあったのでTipsとして記事にします

原因の特定

自分がこのエラーに遭遇した時の問題点はIPアドレスでした。MongoDB側のネットワークアクセスを許容するIPアドレスにRenderのStatic Outbound IPが含まれていないためです。このためネットワーク層レベルでのエラーが発生しているようです。

通常サーバーレス環境では動的IPアドレスを採用している場合が多くわざわざMongoのWhitelistにIPを追加する必要はありません。しかしRenderでは静的アウトバウンドIPという固定のIPアドレスを採用しているためWhitelistにIPアドレスを追加しないとアクセスが認可されずネットワーク層レベルではハンドシェイクが通らないということになります。
https://docs.render.com/static-outbound-ip-addresses

手順

したがってRender上でプロジェクトのIPアドレスを取得してMongoDBのネットワークWhiteListに追加しましょう。

Render

Renderで自身のプロジェクトを選択しConnectタブを開きます
Image from Gyazo

Outboundを選択すると静的アウトバウンドIPを取得できます
Image from Gyazo

MongoDB Atlas

Atlas UIでNetwork Accessタブを開きコピーしたIPアドレスをそれぞれ追加すれば終了です
Image from Gyazo

注意

ローカル環境でSSL/TLSのサーバー証明と自己証明を無視することでMongoDBとの接続を行っている場合でも、Renderにデプロイした場合関係なくSSLハンドシェイクに失敗します。Renderからのアクセスは全て静的アウトバウンドIPで行われるためネットワークレベルで失敗していることでSSL/TLS証明を無視するオプションを使用しても前段階で接続ができていないためです。

example.py
def newMongoClient() -> MongoClient:
    client = MongoClient(os.getenv("MONGO_URI"), tlsAllowInvalidCertificates=True)
    return client

補足: ローカル環境では0.0.0.0/0のワイルドカードやTLSIgnoreを使用することは有効です。またMongoDB for VSCodeを使用することで自動でローカルIPの認可が下りるのでそちらの使用も検討できます。

終わりに

今回は自分がRenderとMongoDBのSSLハンドシェイクで失敗した原因とその解決方法について解説しました。GCPやHerokuなど他のホスティングサービスではおそらく起こらないであろうエラーであったため今回は記事として取り上げてみました。
ぜひご役立て下さい!

Discussion