はじめに
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
コンテナ起動
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
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
#!/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を始めとしたクラウドが活用されるとよいなと思ってます。