Elasticsearch クラスターの構築とセキュリティ認証を含む ELK スタックの統合手順

Elasticsearch の基本概念

Elasticsearch を効率的に運用するために、まず以下のコア概念を理解する必要があります。

  • ノード (Node): Elasticsearch が動作している単一のサーバーインスタンスです。
  • クラスター (Cluster): 同じ cluster.name 設定を共有し、データを共同で管理するノードの集合体です。
  • インデックス (Index): ドキュメントを保存する論理的な名前空間であり、1つ以上のシャードで構成されます。
  • シャード (Shard): データを分散保持するための最小単位です。プライマリシャードとレプリカシャードが存在し、インデックス作成時にプライマリ数を決定します。
// インデックス作成時のシャード設定例
PUT /system-logs
{
  "settings": {
    "index.number_of_shards": 3,
    "index.number_of_replicas": 1
  }
}

// 実行中のインデックスに対するレプリカ数の変更
PUT /system-logs/_settings
{
  "index.number_of_replicas": 2
}

クラスターの健康状態確認

クラスターの状態を把握するための基本的な API です。

GET /_cluster/health
// 応答例
{
  "cluster_name": "data-cluster",
  "status": "green", // green: 全て正常, yellow: 全レプリカが未割り当て, red: 一部のプライマリが未割り当て
  "number_of_nodes": 3,
  "active_primary_shards": 50,
  "active_shards_percent_as_number": 100.0
}

Elasticsearch クラスターの構築設定

各ノードの elasticsearch.yml を設定します。ここではマスターノードとデータノードの構成例を示します。

マスターノード設定例

cluster.name: elastic-prod-cluster
node.name: node-master-01
node.master: true
node.data: true
path.data: /var/lib/elasticsearch/data
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["10.0.0.1:9300", "10.0.0.2:9300", "10.0.0.3:9300"]
cluster.initial_master_nodes: ["node-master-01"]
gateway.recover_after_nodes: 2
http.cors.enabled: true
http.cors.allow-origin: "*"

JVM メモリの最適化

jvm.options でヒープサイズを設定します。物理メモリの 50% かつ 32GB 未満(Compressed Oops を有効にするため)に設定するのが一般的です。

-Xms8g
-Xmx8g

セキュリティ認証(X-Pack)の有効化

トランスポート層の暗号化とユーザー認証を有効にします。

1. 証明書の生成

CA 証明書とノード用証明書を作成し、全てのノードの config ディレクトリに配布します。

# CA の作成
./bin/elasticsearch-certutil ca
# 証明書の作成
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

2. elasticsearch.yml への追記

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

3. パスワードの設定

クラスター起動後、組み込みユーザーのパスワードを対話形式で設定します。

./bin/elasticsearch-setup-passwords interactive

Kibana の連携設定

kibana.yml を編集して Elasticsearch への接続と認証情報を設定します。

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
elasticsearch.username: "kibana_system"
# パスワードはキーストアに保存することを推奨
i18n.locale: "ja-JP"

Logstash によるログ収集構成

Logstash で受信したデータを Elasticsearch へ転送するための logstash.conf 設定例です。

input {
  tcp {
    port => 5044
    codec => json_lines
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    user => "elastic"
    password => "your_password"
    index => "app-logs-%{+YYYY.MM.dd}"
    ssl => true
    cacert => "/etc/logstash/config/certs/ca.crt"
  }
}

Spring Boot (Logback) との統合

Java アプリケーションから Logstash へログを直接送信するための設定です。

<!-- pom.xml 依存関係 -->
<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.0</version>
</dependency>

<!-- logback-spring.xml 設定 -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>127.0.0.1:5044</destination>
    <encoder class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>

トラブルシューティングのポイント

  • ファイル記述子不足: /etc/security/limits.confnofile を 65536 以上に設定。
  • 仮想メモリ制限: sysctl -w vm.max_map_count=262144 を実行して設定値を永続化。
  • UUID ミスマッチ: クラスターの再構築時、ノードの data ディレクトリをクリアしてから再起動。

タグ: Elasticsearch Logstash Kibana ELK-Stack X-Pack

5月14日 07:00 投稿