MeilisearchをGoogle Compute Engineにデプロイして独自ドメインを設定する

公開日:2022/09/09 更新日:2022/09/09
MeilisearchをGoogle Compute Engineにデプロイして独自ドメインを設定するのサムネイル
Image credit meilisearch.com

はじめに

Firebaseで全文検索を実装するために調査していたところ、Meilisearchというオープンソースを見つけました。調べてみるとこのMeilisearchが良さそうだったため、Google Compute Engine上にデプロイし、独自ドメインを設定して動作確認してみました。その手順をメモします。 ちなみに、Meilisearchのリポジトリを見てみると、2022年9月時点でスター数も29kほどありかなりの人気でアップデートも頻繁で開発が活発に行われている印象です。JavascriptやPython、Ruby、さらにFlutter用のパッケージも公式で用意されています。

github.com

A lightning-fast search engine that fits effortlessly into your apps, websites, and workflow.

前提と環境

  • 課金が有効になっているGoogleアカウントを持っていること
  • ドメインを持っていること

以下の公式ドキュメントに従って作業します。

docs.meilisearch.com

Using our GCP custom image, Meilisearch can be deployed on GCP in just a few minutes.

作業の流れ

作業の流れは以下のようになります。 Meilisearchが公式のGoogle Compute Engine用イメージを用意しているため、それを使用します。

Google Cloud Platformでの作業

  • Meilisearch用のイメージをインポートする
  • Meilisearchのインスタンスを作成する

ドメインプロバイダでの作業(独自ドメインを使用する場合のみ)

ドメインプロバイダで作成したインスタンスのIPと独自ドメインのレコードを登録しておきます。独自ドメインを使用しない場合はこの作業は不要です。

  • Aレコードを設定する

Meilisearchインスタンス上での作業

Google Compute Engineで作成したMeilisearchインスタンスにSSH接続して、以下の作業をおこないます。

  • Meilisearchの初期設定を行う

Google Cloud Platformでの作業

Meilisearch用のイメージをインポートする

Google Compute Engine用のMeilisearch公式イメージが用意されているためそれをインポートして使えるようにします。 以下のように、Compute Engineの左側のサイドメニュー内の「イメージ」をクリックし、表示されたページ内の「イメージを作成」をクリックします。 gce-create-image.png

以下のようにイメージのインポート機能について「付与」をクリックします。 grant-permission-for-cloud-build.png

上記の「付与」をクリックして以下のように赤背景のメッセージが表示された場合は、メッセージの指示通りにCloud Buildを有効にしてから再度「付与」を実行します。(Cloud Buildの有効化方法は本記事の最後に補足として載せています。) alert-cloud-build.png

最終的には、以下の状態で「作成」をクリックします。以下の「仮想ディスクファイル」の部分に指定するファイル名(画像内のmeilisearch-image/meilisearch-v0.28.0-debian-10.vmdk)は、本記事の「前提と環境」の中で記載したMeilisearchの公式ドキュメント内に記載されているものをコピー&ペーストして指定してください。 create-meilisearch-image.png

「作成」をクリックすると、以下の画面に遷移して、作成中状態になります。作成完了までおおよそ5、6分ほどかかりました。もしステータス欄のローディングアイコンが時間経過しても消えない場合は、一旦ブラウザのリロードでページ再読み込みしてみた方がいいかもしれません。 creating-image.png

以下のように緑のアイコンでてれば作成完了です。 created-image.png

以上でMeilisearch用のイメージのインポートが完了です。

Meilisearchのインスタンスを作成する

インポートしたMeilisearchのイメージを使ってGoogle Compute Engineのインスタンスを作成します。 以下のように、Google Compute Engineのサイドメニューの「イメージ」のページを再度開いて、インポートしたMeilisearchのイメージをクリックします。私の場合はインポートしたイメージ名をmeilisearch-image-1としたので、これをクリックします。 click-imported-meilisearch-image.png

以下のような画面が表示されるので、「インスタンスを作成」をクリックします。 create-instance-for-meilisearch.png

「インスタンスを作成」をクリックすると、以下のように作成するインスタンスの設定画面に遷移します。ここでは各自の状況に合わせて項目を設定します。 私は以下のようにしました。メモリが大きいほど検索に対する応答速度も速くなるようです。 configure-meilisearch-instance.png

次に同じページで以下のように「ブートディスク」という項目があるので、ここの「変更」をクリックします。 change-boot-disk.png

「変更」をクリックすると以下のようにブートディスクの設定パネルが展開するので、ここで 「カスタムイメージ」タブで「イメージ」部分に前節でインポートしたMeilisearchのイメージが指定されていることを確認して「選択」をクリックします。 setup-boot-disk-mod.png

「選択」をクリックするとパネルが閉じるので、最後に「ファイアウォール」部分の2つにチェックを入れて、「作成」をクリックします。 check-http-option-and-create.png

以下のように作成中になるので、少し待機します。 creating-instance.png

以下のように緑色のチェックがつけば作成完了です。 created-meilisearch-instance.png

これでMeilisearch用のインスタンス作成が完了です。

なお、Meilisearch用のインスタンスが正常に作成できているかは自分のPCでcurlコマンドを実行して確認できます。your_ip部分は、作成したインスタンスの外部IPに置き換えてください。外部IPは、上記画像内のインスタンス名の並びに表示されていると思います。

$ curl http://your_ip/health
{"status":"available"}

上記のように{"status":"available"}と表示されれば無事にMeilisearch用のインスタンス作成が完了し、稼働しています。

ドメインプロバイダでの作業(独自ドメインを使用する場合のみ)

Aレコードを設定する

続いて作成したMeilisearch用のインスタンスに独自ドメインを割り当てます。 私は今回Google Domainsで取得したnanolog.appというドメインを使うため、以下のようにGoogle Domainsの管理画面からAレコードを追加しました。以下のAレコードを設定することで、search.nanolog.appを使って今回作成したMeilisearchのインスタンスにアクセスできるようになります。34.100.200.300は作成したMeilisearch用の外部IPに置き換えてください。 setup-domain-for-meilisearch.png

ドメインが反映されるまで少し時間がかかるかもしれませんが、自分のPCなどで以下のdigコマンドを実行して反映されたかを確認できます。

$ dig A nanolog.app

もしくは以下のようにcurlコマンドでドメイン設定の完了を確認できます。

$ curl -v http://search.nanolog.app/health

以下のようにレスポンスが帰ってくればOKです。

curl -v http://search.nanolog.app/health
*   Trying 34.100.200.300:80...
* Connected to search.nanolog.app (34.100.200.300) port 80 (#0)
> GET /health HTTP/1.1
> Host: search.nanolog.app
> User-Agent: curl/7.77.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx/1.14.2
< Date: Thu, 01 Sep 2022 23:47:30 GMT
< Content-Type: application/json
< Content-Length: 22
< Connection: keep-alive
< vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
< access-control-allow-origin: *
<
* Connection #0 to host search.nanolog.app left intact
{"status":"available"}%

以上でドメインの設定が完了です。

Meilisearch用インスタンス上での作業

Meilisearchの初期設定を行う

作成したMeiliserachインスタンスにSSH接続すると、以下のように表示されます。 (Google Compute EngineのインスタンスへのSSH接続方法はこちら
このインスタンスをproduction環境(本番環境)で使うか確認されるので、yと入力してEnterを押します。

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.


Thank you for using Meilisearch.


This script will help you to set up some basic configuration.

Do you wish to use Meilisearch in a PRODUCTION environment [y/n]?y

すると以下のように表示されて次にMEILI_MASTER_KEY(マスターキー)を自身で設定するかを確認されます。ここでは、nにして自動生成します。

Do you wish to use Meilisearch in a PRODUCTION environment [y/n]?  y
  Meilisearch will be run in a PRODUCTION environment
  MEILI_MASTER_KEY must be set for PRODUCTION
  Front-end integrated dashboard will be disabled for PRODUCTION
Do you wish to specify your MEILI_MASTER_KEY (otherwise it will be generated) [y/n]?n

nでEnterを押下すると以下のようにマスターキーが自動生成されます(以下のKSjeon19dn3Ls93nFNl349FNS93nkljasIk39fnsaがマスターキー)。このマスターキーを使って、外部からのアクセス用のAPIキーを作成したり、削除したりするために使用します。マスターキーはどこにも公開しないよう慎重に扱う必要があります。

Do you wish to specify your MEILI_MASTER_KEY (otherwise it will be generated) [y/n]? n
Your MEILI_MASTER_KEY is KSjeon19dn3Ls93nFNl349FNS93nkljasIk39fnsa
You should keep it somewhere safe.

続いてドメインを設定するか確認されるので、ここではyとして設定を進めます。

Do you wish to setup a domain name [y/n]? y

What is your domain name?の後に設定したい自身の独自ドメインを入力し、Enterを押下します。

What is your domain name? search.nanolog.app

続いてSSLの設定をするか確認されるのでyでEnterを押下してSSLの設定を進めます。

Do you wish to setup ssl with certbot (free and automated HTTPS) [y/n]?y

以下のようにcertbotによるSSL設定が開始されて完了します。

Do you wish to setup ssl with certbot (free and automated HTTPS) [y/n]? y
     --- OK, now we will set up Meilisearch for you! ---

---------------------

  Your MASTER KEY is set to KSjeon19dn3Ls93nFNl349FNS93nkljasIk39fnsa
  Keep it somewhere SAFE!

---------------------

Ok! Cool we'll setup SSL with Certbot
  Configuration is over. Thanks

-----------------------------------------------------------------

 If you want to run this script again, run the following command:

 meilisearch-setup

----------------------------------------------------------------

完了後に自分のPCから以下のようにcurlを実行して以下のように表示されれば完了です。

curl -v https://search.nanolog.app/health

*   Trying 34.100.200.300:443...
* Connected to search.nanolog.app (34.100.200.300) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/cert.pem
*  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-CHACHA20-POLY1305
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: CN=search.nanolog.app
*  start date: Sep  1 23:18:02 2022 GMT
*  expire date: Nov 30 23:18:01 2022 GMT
*  subjectAltName: host "search.nanolog.app" matched cert's "search.nanolog.app"
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
> GET /health HTTP/1.1
> Host: search.nanolog.app
> User-Agent: curl/7.77.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx/1.14.2
< Date: Fri, 02 Sep 2022 00:19:03 GMT
< Content-Type: application/json
< Content-Length: 22
< Connection: keep-alive
< vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
< access-control-allow-origin: *
<
* Connection #0 to host search.nanolog.app left intact
{"status":"available"}%

以上でMeiliserach用のインスタンスに独自ドメインの割り当てとSSL設定が完了し、Meilisearchを使えるようになりました。 後は実際にWebサイトやスマートフォンアプリから作成したMeilisearchへリクエストを投げて使います。

なお、Meilisearchは初期状態では保護されておらず、誰からでもアクセスを受け付ける状態になっています。実際のサービスでは認証ユーザのみに使用許可したい場合が多いと思います。この場合は、別途APIキーを作成、設定する必要があります。 これについては以下に別途まとめました。

virment.com

認証ユーザにのみMeilisearchの使用を許可して保護するためには、Meilisearchのマスターキーの設定とAPIキーの作成が必要になります。この手順をまとめます。

補足

Cloud Build を有効にする手順

Google Cloud Platformのサイドメニューの中にある「APIとサービス」→「ライブラリ」をクリックします。 go-api-library.png

以下のように「cloud build」と検索し、表示された「Cloud Build API」をクリックします。 search-cloud-build-api.png

以下のページが表示されるので、「有効にする」をクリックします。 enable-cloud-build-api.png

以上でCloud Buildの有効化が完了です。もしCloud Build以外にも有効化が必要なサービスがあれば、同じ手順で有効化できると思います。

まとめ

全文検索のためにMeilisearchをGoogle Compute Engineにデプロイする手順をまとめました。Google Compute Engine以外にも、Digital OceanやAWS、Azureでのデプロイ手順も公式ドキュメントに記載されています。

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。