3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

Elasticsearchを運用するうえでElastic Cloudのようなマネジメントサービスの利用を検討することがありますがめちゃくちゃ高いのでそれだけで敷居が高いという問題があります。お金がかかるということは個人開発ではシンプルに金がかかって辛いという問題と企業では検討やらなんやらして調整が必要(会社によっては稟議とかしんどい系の作業)になってくると思います。費用面はクリアしてあとは同期の仕組みやElasticsearchの知見を増やす時間に集中できるのではと思いこの記事を書きました

前提

ubuntuに1からElasticsearchを構築する方法です。ちょうどVPSの無料が出たことで話題になったので一応無料でもそれなりに構築できるよって感じです。この程度の無料枠であれば月1000円も出せば使えるのでお金払っても良いと思います(Amazon Lightsailだけは絶対オススメしない)

構築イメージ

クライアントがHTTPS経由でBasic認証付きのElasticsearchにアクセスする感じです。VPC内であれはhttpsや認証は不要かと思います。

構築

パッケージインストール

sudo apt install -y ca-certificates curl gnupg lsb-release

Docker の GPG 鍵追加

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Docker リポジトリ追加

echo \
  "deb [arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Dockerインストール

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Docker動作確認

sudo docker run hello-world

「Hello from Docker!」が表示されたらOK

sudoなしでdocker使う

sudo usermod -aG docker $USER

コンテナ起動

docker-compose.yml
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:9.0.1
    container_name: elasticsearch9
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - network.host=0.0.0.0
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata9:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
    networks:
      - esnet

volumes:
  esdata9:

networks:
  esnet:
docker compose up -d

再起動してもコンテナ立ち上げる

docker ps
// NAMESから再起動するコンテナ名を指定
docker update --restart=always elasticsearch9

ElasticSearch動いてるか確認

curl http://localhost:9200

こうなってればOK

{
  "name" : "elasticsearch9",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "...",
  "version" : {
    "number" : "9.0.1",
    ...
  }
}

サブドメインのDNSレコード登録

項目 入力内容
種別(タイプ) A
名前(サブドメイン) es(なんでもよい)
値(IPアドレス) グローバルIP

Nginx+Certbot のインストール

sudo apt install nginx certbot python3-certbot-nginx -y

Nginx設定

vim /etc/nginx/sites-available/es.example.com
/etc/nginx/sites-available/es.example.com
server {
    listen 80;
    server_name es.example.com;

    location / {
        proxy_pass http://localhost:9200;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

有効化

sudo ln -s /etc/nginx/sites-available/es.example.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

ポート80解放

sudo ufw allow 80
sudo ufw reload
sudo ufw status

これで繋げなかったら契約してるVPSのポートも解放する

サブドメインでアクセスできるか確認

curl http://es.example.com

Certbot で HTTPS 化(Let's Encrypt)

sudo certbot --nginx -d es.example.com

ポート443解放

sudo ufw allow 443
sudo ufw reload
sudo ufw status

これで繋げなかったら契約してるVPSのポートも解放する

HTTPSでアクセスできるか確認

curl https://es.example.com

自動更新が有効か確認する方法

systemctl list-timers | grep certbot

こうなってたらOK

certbot.timer  Mon 2025-07-15 03:00:00 JST  ...  certbot.service

SSL証明書の更新テスト

sudo certbot renew --dry-run

ポート80は開けておく
これで繋げなかったら契約してるVPSのポートも解放する

nginx 自動リロード(証明書更新時)

sudo vim /etc/letsencrypt/renewal-hooks/deploy/nginx-reload.sh
nginx-reload.sh
#!/bin/bash
systemctl reload nginx
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/nginx-reload.sh

Nginx に Basic 認証を追加

軽く認証入れたいだけなので今回はNginxにします。メリデメは以下の通り

方法 メリット デメリット
Nginx側Basic認証 - 設定が簡単
- 追加モジュール不要
- 軽い
- ESの細かい権限管理はできない
Elasticsearch側X-Pack - ユーザー/ロール/インデックス単位で制御可能 - 有効化が面倒
- TLS設定が必要

認証ファイルを作成

sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd elasticadmin #elasticadminはユーザー名

Nginx の設定を修正

location / {
    auth_basic "Restricted Elasticsearch";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

再読み込み

sudo nginx -t && sudo systemctl reload nginx

設定したユーザーとパスワードで200が返ってきたらOK

curl 'https://es.example.com/' \
  -u 'ユーザー:パスワード'

まとめ

ここまで30分あれば構築できるのでとりあえず動かしたい、テスト環境で動かしたいレベルであれば十分に活用できるとではと思います。Elasticsearchは開発・保守コストが掛かるのでメリットを感じにくいなどの懸念が挙げられますが、従来のRDBのパフォーマンスチューニングを駆使して泥沼にハマるならElasticsearch入れちゃった方が絶対に効率良いかなと思ってます(実体験)。Elastic Cloudのようなマネジメントサービスに縛られなければコスト面は解消できるのでぜひ国産VPSを始めとしたクラウドが活用されるとよいなと思ってます。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?