AWS EC2上でElasticSearch + Kibana環境を構築する

前置き

以前、Windows上で構築したElasticSearch+Kibana環境を、AWS EC2(Amazon Linux2)上に構築する。

本来、AWSには「Amazon OpenSearch」という、まさにこの2つのサーバ環境を備えたサービスが存在するのだけど、少し触った感じだと、構築した後にインスタンスの停止・再起動といったことができないようで、維持するのになかなの課金がかかるみたい。

近日、会社でIoTがらみの研修を開くことになったので、復習もかねて構築にトライすることにした。

今回の構築で分かったこと

安定的に動かすならば、EC2ファミリでは「t3.large」(メモリ8GB)以上がよい。

ElasticSearchサービスは、デフォルトで2GBのメモリを使用するらしく「t2.micro」(メモリ1GB)で起動すると、起動に失敗したり、途中からコマンドを受け付けなくなる。

ググると、jvmの設定変更を駆使して256MBで動かしている人もいたけど、あくまで検証作業なので、そこまでシビアに絞らんでもよいと判断しました。

事前準備

VPN / Subnet / EC2 作成

独立したVPN一つと、publicサブネットを一つ作成し、上にEC2を構築する。

種別 名前 IPアドレス
VPC biweb-dev-vpc 10.0.0.0/16
サブネット biweb-dev-pub-subnet1 10.0.32.0/20
EC2 biweb-dev-web 10.0.20.240/20
  • EC2を作成する前に、サブネットの「自動割当IP設定」を有効化する。
  • EC2作成時、セキュリティグループには、SSHアクセスだけを許可とする。Sourceは「マイIP」をクリックして自宅のIPからの要求だけ許可とする
  • EC2作成後、アクセス用のキーペアをダウンロードして保存しておく。
  • EC2作成後、パブリックIPv4アドレスが割当されていることを確認する。

自PCからのSSHアクセス

  • VPCメニューから、インターネットゲートウェイを作成(biweb-dev-igw)して、サブネット(biweb-dev-pub-subnet1)にアタッチする。
  • VPCメニューから、サブネットを選択し、作成したサブネットのルートテーブルに以下を加える。

    送信先 ターゲット
    0.0.0.0/0 (作成したIGW)
  • ローカルPCで「Tera Term」を起動して、「Host」に作成したEC2のパブリックIPv4アドレスを指定する。

    f:id:camelrush:20211020212657p:plain

  • OK押下後の認証画面で、以下の内容を設定してOKをクリック。

    • 「User name」に「ec2-user」(これは固定値)
    • 「Use RSA/~(略)~ key to log in [Private key file:]」に、ダウンロードしたキーを選択

    f:id:camelrush:20211020212903p:plain

  • 以下のとおり、ログインが成功すれば、準備OK。

    f:id:camelrush:20211020213315p:plain

必要ソフトのインストール

yumリポジトリ更新

$ sudo yum update -y

java8 OpenJDK

$ sudo yum install java-1.8.0-openjdk.x86_64

Elastic Searchインストール

以下を参照しつつ、RPMからのインストールを行う。

www.elastic.co

GPG-KEYをローカルリポジトリにインポートする

$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

※【補足】GPGの説明はこちらを参照

ElasticSearch RPMのrepoを所定フォルダに生成する

エディタはなんでもいいですが、今回は nano を使いました。

$ sudo nano /etc/yum.repos.d/elasticsearch.repo

elasticsearch.repo への記載内容は以下の通り。

[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

インストールコマンドを実行する

$ sudo yum install --enablerepo=elasticsearch elasticsearch
:
:
Installed:
  elasticsearch.x86_64 0:7.15.1-1

Complete!

外部アドレスからのアクセスを可能にする

以下のコマンドで設定ファイル「elasticsearch.yml」を開く。

$ sudo nano /etc/elasticsearch/elasticsearch.yml

以下の箇所に追記を行って、ファイルを保存。

# By default Elasticsearch is only accessible on localhost. Set a different
# address here to expose this node on the network:
#
#network.host: 192.168.0.1
network.host: 0.0.0.0   # ←ここを追記
discovery.type: single-node # ←ここを追記

また、同じファイルに対して最後の行に次の内容を設定しておく。

xpack.security.enabled: false

意図としては「セキュリティ機能を使用しない」というもの。本来はtrueとし、パスワード等を設定するのだが、今回はあえて使用しない。この設定を明示的にしないと、Kibana操作時に画面でやいのやいの言われる。

↓ やいのやいの の例

f:id:camelrush:20211104225632p:plain

システム起動時にElasticSearchを起動するようにする(systemd)

$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable elasticsearch.service

$ # (ちなみに、システムを 起動をやめさせたい場合は次のとおり)
$ sudo /bin/systemctl disable elasticsearch.service

動作確認

PCを再起動。

$ sudo shutdown -r now

再起動後、起動状態をチェックする

$ sudo systemctl | grep elastic
elasticsearch.service         loaded active running   Elasticsearch

以下のコマンドでサービス自体の起動を確認(デフォルトポートは 9200)

$ sudo curl http://localhost:9200
{
  "name" : "ip-10-0-23-98.ap-northeast-1.compute.internal",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "9RtovLuBTuyvlNjuMLLekg",
  "version" : {
    "number" : "7.15.1",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "83c34f456ae29d60e94d886e455e6a3409bba9ed",
    "build_date" : "2021-10-07T21:56:19.031608185Z",
    "build_snapshot" : false,
    "lucene_version" : "8.9.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

同様に外部からのアクセスを確認。ブラウザで「http://[ip address]:9200/」にアクセスし、上と同じ表示がされればOK。

Kibanaインストール

以下を参照しつつ、RPMからのインストールを行う。

www.elastic.co

GPG-KEYをローカルリポジトリにインポートする

$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

↑ ここはElasticSearchと同じレポジトリなので実施不要

Kibana RPMのrepoを所定フォルダに生成する

$ sudo nano /etc/yum.repos.d/kibana.repo

kibana.repo への記載内容は以下の通り。

[kibana-7.x]
name=Kibana repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

インストールコマンドを実行する

$ sudo yum install kibana 
:
:
Installed:
  kibana.x86_64 0:7.15.1-1

Complete!

外部アドレスからのアクセスを可能にする

以下のコマンドで設定ファイル「kibana.yml」を開く。

$ sudo nano /etc/kibana/kibana.yml

以下の箇所に追記を行って、ファイルを保存。

# To allow connections from remote users, set this parameter to a non-loopback $
# server.host: "localhost"
server.host: "0.0.0.0"   # ← ここを追記

システム起動時にKibanaを起動するようにする(systemd)

$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable kibana.service

動作確認

PCを再起動。

$ sudo shutdown -r now

再起動後、起動状態をチェックする

$ sudo systemctl | grep kibana
kibana.service         loaded active running   Kibana

以下のコマンドでサービス自体の起動を確認(デフォルトポートは 5601)

$ sudo curl http://localhost:5601

↑ 特にエラーなど、何もでなければ、おそらく(笑) 問題なし。 ブラウザで「http://[ip address]:5601/」にアクセスし、下の画面が表示がされればOK。

f:id:camelrush:20211027000040p:plain

あとがき

なんとか構築にはこぎつけました。所要、14時間程度。冒頭で書いたメモリ不足に気づくまで、4~5時間かかってしまったが、まずまずの進捗。次回は、Raspberry PiからのMQTTデータを流し込んで、Kibanaでのグラフ表示を実現します。