Attention : Amazon Linux 2 がリリースされており、この記事は古くなっています。


皆さん、AWSというものをご存じでしょうか。
Amazonがやっている、クラウド基盤提供サービスです。
クラウドとは何かというともう幅が広すぎて説明できませんが、Amazonはそのクラウドで全方位的に幅広くサービスを提供しています。
ECサイトよりAWSの方が儲かっているらしいです。

この記事は、すでに立ち上がりつつあるサービスの貧弱なインフラをAWSに切り替えるまでの足跡です。
AWSのインスタンスを立ち上げ、Elasticseachやその他ミドルウェアをインストール/設定していきます。

Elasticsearchとは

公式サイトによると、

Elasticsearchは、様々なユースケースを解決する、分散型RESTful検索/分析エンジンです。予期した結果や、そうでないものまで検索できるようにデータを格納するElastic Stackの中核です。

というものだということですが、我々が構築しようとしているWebサービスでは検索エンジンとして利用しています。
従来のRDBという種類のデータベースとは異なり、全文検索などの利用シーンで非常に高速に動作します。

既存環境

ざっと以下のような構成です。
OS:CentOS 7
Elasticsearch 5.5
nginx 1.10.2
php-fpm
MariaDb 10.2.6

最大のボトルネックはメモリが1GBしかないということです。

そのためElasticsearchのメモリ設定を512MBに抑えていますが仮想メモリを3GBも使うという、SWAPが忙しすぎます。
遅いだけならまだしも、ElasticsearchのbulkAPIを使った、ドキュメントを登録するためのJavaバッチでElasticsearchが落ちてしまいます。
これは話になりません。

Elasticsearchを動かすだけでも話にならない容量なのに、そこにMariaDbも動かしてしまっています。
こちらも仮想メモリを1.6GB使っていて、よくOSが落ちないものです。

今のところほとんどアクセスがないので、nginxについては特に問題がありません。
php-fpmについては起動プロセスを最小限に抑えて、爪の先に明かりを灯すかのようにメモリを節約しています。
全然足りませんが。

また今回、ストレージもHDDなので、SSDに変更してパフォーマンス向上を狙っています。

Elasticsearchのインストール

まずサービスに必要なElasticsearchをインストールしました。
また、今回はkuromojiもインストールしています。

以下の公式ブログページの記事を参考にしました。

Amazon EC2 を使用して Elasticsearch クラスタをセットアップする

そのままのタイトルです。
ありがたい。

インスタンスを立ち上げるまでの操作は様々なドキュメントや記事などがありますので割愛します。

ダウンロードとインストール

Javaの確認

まず、Javaが入っていないと話になりません。

$ java -version
java version "1.7.0_151"
OpenJDK Runtime Environment (amzn-2.6.11.0.74.amzn1-x86_64 u151-b00)
OpenJDK 64-Bit Server VM (build 24.151-b00, mixed mode)

ちゃんと入っています。
入っていますが、1.7ではダメなことが後で発覚します。

ElasticsearchのパッケージURLの確認

Elasticsearchのダウンロードサイトで最新のインストールパッケージを確認します。

私の既存環境では5.5を使っていますが、現在の最新版は5.6です。
ドキュメントについては移行しないので、バージョンアップのリスクはないものと思います。
ただ、5.5のライブラリでプログラミングしているJavaバッチが実行できるかどうか、というリスクはあります。
マイナーバージョンの違いなので、さほど心配はしていませんが。

Elasticsearchのインストール

最新版rpmファイルのURLを確認したらインストール

$ sudo rpm -i https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.3.rpm
warning: /var/tmp/rpm-tmp.1IAGhB: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Creating elasticsearch group... OK
Creating elasticsearch user... OK
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using chkconfig
 sudo chkconfig --add elasticsearch
### You can start elasticsearch service by executing
 sudo service elasticsearch start

しかし、何かワーニングが出ています。
普段rpmを使わないので意味が分かりませんでしたが、調べてみたところrpmパッケージに署名がありませんよ、ということのようです。
無視することにします。

Elasticsearchが自動起動するように設定します。
systemctlかと思いきや、chkconfig

$ sudo chkconfig --add elasticsearch

kuromojiのインストール

引き続いて、kuromojiをインストールします。
先の記事ではbin/plugin installを使うように記載がありますが、binの中にはpluginというファイルはなく、elasticsearch-pluginというシェルスクリプトがあるので、こちらを使うのでしょう。

$ cd /usr/share/elasticsearch/
$ sudo bin/elasticsearch-plugin install analysis-kuromoji
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/elasticsearch/plugins/PluginCli : Unsupported major.minor version 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:803)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:442)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:64)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:354)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:348)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:347)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:312)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

Javaらしく派手に怒られました。
どうやらJava8ではないとダメなようです。

Javaのバージョンアップ

一旦、インストール済みのJava7をアンインストールし、Java8を入れます。

$ yum list installed | grep java
java-1.7.0-openjdk.x86_64            1:1.7.0.151-2.6.11.0.74.amzn1 installed    
javapackages-tools.noarch            0.9.1-1.5.amzn1               installed    
tzdata-java.noarch                   2017b-1.69.amzn1              installed 
$ sudo yum -y remove java-1.7.0-openjdk.x86_64
Loaded plugins: priorities, update-motd, upgrade-helper
Resolving Dependencies
--> Running transaction check
---> Package java-1.7.0-openjdk.x86_64 1:1.7.0.151-2.6.11.0.74.amzn1 will be erased

中略

Dependency Removed:
  aws-apitools-as.noarch 0:1.0.61.6-1.0.amzn1                                             
  aws-apitools-common.noarch 0:1.1.0-1.9.amzn1                                            
  aws-apitools-ec2.noarch 0:1.7.3.0-1.0.amzn1                                             
  aws-apitools-elb.noarch 0:1.0.35.0-1.0.amzn1                                            
  aws-apitools-mon.noarch 0:1.0.20.0-1.0.amzn1                                            

Complete!

依存関係にaws-apitoolsなどと出てきましたが、やってはいけないことをやってしまったんでしょうか・・・
今のところこのインスタンスからAWSのAPIを叩くつもりはないので、無視することにします。

Java8をインストールします。

$ sudo yum -y install java-1.8.0-openjdk.x86_64
Loaded plugins: priorities, update-motd, upgrade-helper
Resolving Dependencies
--> Running transaction check
---> Package java-1.8.0-openjdk.x86_64 1:1.8.0.141-1.b16.32.amzn1 will be installed

中略

Dependency Installed:
  copy-jdk-configs.noarch 0:1.2-1.2.amzn1                                                 
  java-1.8.0-openjdk-headless.x86_64 1:1.8.0.141-1.b16.32.amzn1                           
  lksctp-tools.x86_64 0:1.0.10-7.7.amzn1                                                  

Complete!
$ java -version
openjdk version "1.8.0_141"
OpenJDK Runtime Environment (build 1.8.0_141-b16)
OpenJDK 64-Bit Server VM (build 25.141-b16, mixed mode)

Elasticsearchを起動します。

$ sudo service elasticsearch start
Starting elasticsearch:                                    [  OK  ]
$ curl -XGET http://localhost:9200/
{
  "name" : "DwsjPqq",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "48W2XBvGTKaWeQ1Y4CGNlA",
  "version" : {
    "number" : "5.6.3",
    "build_hash" : "1a2f265",
    "build_date" : "2017-10-06T20:33:39.012Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.1"
  },
  "tagline" : "You Know, for Search"
}

kuromojiのインストール リトライ

さて、先ほど失敗したkuromojiをインストールします。

$ sudo bin/elasticsearch-plugin install analysis-kuromoji
-> Downloading analysis-kuromoji from elastic
[=================================================] 100%   
-> Installed analysis-kuromoji
$ sudo service elasticsearch restart
Stopping elasticsearch:                                    [  OK  ]
Starting elasticsearch:                                    [  OK  ]
curl localhost:9200/_cat/plugins?v
name    component         version
DwsjPqq analysis-kuromoji 5.6.3

インストールが完了しました。

関連記事AWSにnginxをインストール