Elastic Cloud も5.0対応したので試してみた

#Elastic Cloud
Elasticsearch 5.0GA がリリースされたのに伴い、Elastic Cloud も5.0対応になっているので、早速利用してみました。

Elastic Cloud は、Elastic社が提供するクラウドのマネージドサービスで、商用プラグインであるX-Packも利用することができます。
**登録後2週間は、トライアルとして、Memory:1GB／SSD:24GBのプランが無料で利用できます。**

また、これまでは、Memory:SSD＝1:16のサイズだったのですが、5.0リリースの少し前に、料金そのままで1:24のサイズに拡大されているので、お得になっています。

##クラスタ作成
ユーザ登録後、ログインすると、以下のような画面が表示されるので、「Create Cluster」ボタンを押下します。

![ElasticCloud-first.png](https://qiita-image-store.s3.amazonaws.com/0/22893/f71d15fa-b4c7-1eaa-5006-38672ecfad64.png)

クラスタ作成の画面に遷移するので、必要事項を入力して、クラスタを作成します。

![ElasticCloud-CreateCluster1.png](https://qiita-image-store.s3.amazonaws.com/0/22893/4f4c350a-7139-8093-65bd-3a7bae6023d3.png)

- **Cluster Size**
  - トライアル期間中は、Memory:1GB／SSD:24GBの最小サイズを指定して、好きなリージョンを選択します。
- **Region**
 - Elastic Cloud は、AWS上に構築されているので、データ投入したり、何らかの処理を行うインスタンスと、できるだけ同一リージョンにするのが良いでしょう。
- **High Availability**
  - 「1 data center」のタイプを選択します。信頼度に応じて、複数のデータセンターをまたぐクラスタを作成することも可能です。
- **Version**
  - 「5.0.0」になっていることを確認してください。
- **Scripting**
  - 5.0になって、Painless scriptingが利用できます。トライアル期間は「sandboxed」のタイプしか利用できないようです。
- **Plugins**
  - 利用するプラグインを選択します。
- **Name**
  - クラスタに名前を付けましょう。

他の項目は、デフォルトのままで良いと思います。
必要な項目を入力して、「Create」ボタンを押下すると、クラスタの生成が始まります。

約10秒程度でクラスタが作成され、完了すると、最初にクラスタを操作するための「elastic」ユーザのパスワードが表示されるので、それをメモしておきます。
クラスタが作成されると、以下のような画面が表示されます。

![ElasticCloud-CreateCluster2.jpg](https://qiita-image-store.s3.amazonaws.com/0/22893/7151e349-2dc6-f5db-21c0-106ab94ff85a.jpeg)


##ユーザ設定

最初に、左メニューの**Configuration**から、**Kibana**を「enable」にしておいてください。

次に、左メニューの**Security**を押下します。
「Go to Kibana to make security changes.」のリンクを押下すると、Kibanaのログイン画面が開きます。
ここでは、ユーザ名：**elastic**、パスワード：**クラスタ作成時に表示されたもの** を入力します。

そうすると、ユーザ一覧画面が表示されます。

![ElasticCloud-user.png](https://qiita-image-store.s3.amazonaws.com/0/22893/1cc668bd-d7c8-0206-c1d5-5ceabbc51f52.png)

ここで、必要なユーザを登録します。
ここで登録したユーザ情報は、ElasticsearchへのRESTのアクセスでも必要になります。


##アクセス確認
クラスタのトップページにある、「Endpoints」のリンクを押下してみます。
すると、認証ダイアログが表示されるので、そこで、登録したユーザのID／パスワードを入力します。

以下のようなJSONの内容がブラウザに表示されたら、接続成功です。

```
{
  "name" : "instance-0000000000",
  "cluster_name" : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "cluster_uuid" : "xxxxxxxxxxxxxxxxxxxxxx",
  "version" : {
    "number" : "5.0.0",
    "build_hash" : "253032b",
    "build_date" : "2016-10-26T05:11:34.737Z",
    "build_snapshot" : false,
    "lucene_version" : "6.2.0"
  },
  "tagline" : "You Know, for Search"
}
```

接続に失敗すると、以下のようなエラーの内容が返ってきます。

```json
{
    "error": {
        "root_cause": [
            {
                "type": "security_exception",
                "reason": "action [cluster:monitor/main] requires authentication",
                "header": {
                    "WWW-Authenticate": "Basic realm=\"security\" charset=\"UTF-8\""
                }
            }
        ],
        "type": "security_exception",
        "reason": "action [cluster:monitor/main] requires authentication",
        "header": {
            "WWW-Authenticate": "Basic realm=\"security\" charset=\"UTF-8\""
        }
    },
    "status": 401
}
```

##インデックスの作成・ドキュメントの登録
早速、インデックスを作成してみます。
ここでは、以下のページの shakespeare のデータを利用してみます。

https://www.elastic.co/guide/en/kibana/current/tutorial-load-dataset.html

###インデックスの作成
curlコマンドを利用して作成していきますが、セキュリティの設定がされているので、ユーザID／パスワードの指定が必要になる点に注意してください。ここでは、上記で作成したユーザを利用します。

インデックス名は **"shakespeare"** とします。

```
$ curl --user takanorig -XPUT "https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:9243/shakespeare" -d '
{
 "mappings" : {
  "_default_" : {
   "properties" : {
    "speaker" : {"type": "string", "index" : "not_analyzed" },
    "play_name" : {"type": "string", "index" : "not_analyzed" },
    "line_id" : { "type" : "integer" },
    "speech_number" : { "type" : "integer" }
   }
  }
 }
}
';
Enter host password for user 'takanorig':
```

###ドキュメント登録
上記、Elasticのページから、**shakespeare.json** をダウンロードし、Bulk APIを利用してデータをインポートします。

 - [ダウンロード：shakespeare.json](https://www.elastic.co/guide/en/kibana/3.0/snippets/shakespeare.json)

```
$ curl --user takanorig -XPOST 'https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:9243/shakespeare/_bulk?pretty' --data-binary @shakespeare.json
```

登録できたかどうか、確認してみます。

```
$ curl --user takanorig 'https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:9243/_cat/indices/shakespeare?v'

health status index       uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   shakespeare johqlsUYT4WF0BhuZup_zw   5   1     111396            0       29mb           29mb
```

**"docs.count"** が **111396** となっており、インポートに成功しているようです。


さらに、検索してみます。以下のコマンドで、一覧を取得します（結果は一部だけ返ってきます）。

```
$ curl --user takanorig -XGET 'https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:9243/shakespeare/_search'
```

```json
{
    "took": 10,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 111396,
        "max_score": 1.0,
        "hits": [
            {
                "_index": "shakespeare",
                "_type": "act",
                "_id": "0",
                "_score": 1.0,
                "_source": {
                    "line_id": 1,
                    "play_name": "Henry IV",
                    "speech_number": "",
                    "line_number": "",
                    "speaker": "",
                    "text_entry": "ACT I"
                }
            },
            {
                "_index": "shakespeare",
                "_type": "line",
                "_id": "14",
                "_score": 1.0,
                "_source": {
                    "line_id": 15,
                    "play_name": "Henry IV",
                    "speech_number": 1,
                    "line_number": "1.1.12",
                    "speaker": "KING HENRY IV",
                    "text_entry": "Did lately meet in the intestine shock"
                }
            },
            ・・・
        ]
    }
}
```

#まとめ
環境構築をする必要なく、すぐにElasticの利用を開始できるのは便利ですね。
メモリとストレージのサイズの組み合わせや、冗長化のパターンは、Elastic社が推奨する構成になっています。
Kibanaとの連携はもちろん、Shield、Watcher、Marvelなどの商用のプラグインも利用可能になっており、OSSで構築した場合やAmazon Elasticsearch Serviceには無いメリットですね。

また、試してはいないですが、サイズ／プランの変更は、画面上で設定を変更するだけで可能なようです。
スナップショットも、30分ごとに保存されているようなので、データのバックアップも安心です。