[JAWS-UG CLI] Elasticsearch Service:#2 インデックスの作成、データ登録、検索

curlコマンドを利用して、Elasticsearch Serviceドメインにデータを投入してみます。


前提条件
========


Elasticsearch Serviceへの権限
-----------------------------

Elastic Searchに対して読み取り権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.10.19

```bash:コマンド:
aws --version
```

```text:結果(例):
aws-cli/1.10.19 Python/2.7.10 Darwin/15.4.0 botocore/1.4.10
```


0. 準備
=======


0.1. リージョンの決定
---------------------

利用するリージョンを決めます。 (カレントユーザが利用するカレントリージ
ョンも切り変わります。)

```bash:変数の設定(東京リージョンの場合):
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. プロファイルの確認
-----------------------

プロファイルが想定のものになっていることを確認します。

```bash:コマンド:
aws configure list
```

```text:結果(例):

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         es-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION
```

AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。 それ以外のときにprofileが '<not set>' と表示される場合は、以下を実行してください。

```bash:変数の設定:
export AWS_DEFAULT_PROFILE=<IAMユーザ名>
```


0.3. ドメイン名の指定
---------------------

対象となるドメインの名前を指定します。

```bash:変数の設定:
ES_DOMAIN_NAME="handson-esdomain-$(date +%Y%m%d)" \
  && echo ${ES_DOMAIN_NAME}
```

```text:結果(例):
handson-esdomain-20160411
```


0.4. エンドポイントの取得
-------------------------

```bash:変数の設定:
ES_DOMAIN_ENDPOINT=$( \
  aws es describe-elasticsearch-domains \
  --domain-name ${ES_DOMAIN_NAME} \
  --query "DomainStatusList[?ARN == \`${ES_DOMAIN_ARN}\`].Endpoint" \
  --output text \
) \
  && echo ${ES_DOMAIN_ENDPOINT}
```

```text:結果(例):
search-handson-esdomain-20160411-xxxxxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com
```


1. 事前作業
===========


変数の確認
----------

```bash:変数の確認:
cat << ETX

  ES_DOMAIN_NAME:     ${ES_DOMAIN_NAME}
  ES_DOMAIN_ENDPOINT: ${ES_DOMAIN_ENDPOINT}

ETX
```


2. インデックスの作成
=====================

インデックス名を指定します。

```bash:変数の設定:
ES_INDEX_NAME=${ES_DOMAIN_NAME}
```

```bash:変数の確認:
cat << ETX

  ES_DOMAIN_ENDPOINT:   ${ES_DOMAIN_ENDPOINT}
  ES_DOMAIN_INDEX_NAME: ${ES_INDEX_NAME}

ETX
```

インデックスを作成します。

```bash:コマンド:
curl -X PUT ${ES_DOMAIN_ENDPOINT}/${ES_INDEX_NAME}
```

```json:結果(例):
{"acknowledged":true}
```


3. データの投入
===============


3.1. 投入データの作成
---------------------

```bash:変数の設定:
FILE_INPUT="${ES_INDEX_NAME}-input.json" \
  && echo ${FILE_INPUT}
```

```bash:コマンド:
cat << EOF > ${FILE_INPUT}
{
  "field1":2,
  "@timestamp":"$(date +%Y-%m-%dT%H:%M:%S%z)"
}
EOF

cat ${FILE_INPUT}
```

JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。

```bash:コマンド:
jsonlint -q ${FILE_INPUT}
```

エラーが出力されなければOKです。


3.2. データの投入
-----------------

タイプ名/IDを決定します。

```bash:変数の設定:
ES_TYPE_NAME='testlog'
ES_RECORD_ID='1'
```

POST先のURLを組み立てます。

エンドポイント/インデックス名/タイプ名/IDとなります。

```bash:変数の設定:
ES_URL_POST="${ES_DOMAIN_ENDPOINT}/${ES_INDEX_NAME}/${ES_TYPE_NAME}/${ES_RECORD_ID}" \
 && echo ${ES_URL_POST}
```

```bash:変数の確認:
cat << ETX

  ES_URL_POST: ${ES_URL_POST}
  FILE_INPUT:  ${FILE_INPUT}

ETX
```

```bash:コマンド:
curl -X PUT ${ES_URL_POST} -d @"${FILE_INPUT}"
```

```json:結果(例):
{"_index":"handson-esdomain-20160411","_type":"testlog","_id":"1","_version":1,"
```


4. kibana
=========

Amazon ESのダッシュボードで得た Kibana のURLにアクセスします。

1. "Index name or pattern"に、以下を実行して表示される文字列を入力します。

```bash:コマンド:
echo ${ES_INDEX_NAME}
```

2. "Time-field name"に、"@timestamp"を入力します。

インデックスが正しく作成されていれば"Create"ボタンが表示されるので、クリックします。

インデックスのカラム一覧が表示されればOKです。

"Discover"の下にある"field1"をクリックすると、Countを表わすグラフが表示されます。


5. データの追記
===============

新しいデータを投入してみましょう。


5.1. 投入データの作成
---------------------

```bash:コマンド:
cat << EOF > ${FILE_INPUT}
{
  "field1":8,
  "@timestamp":"$(date +%Y-%m-%dT%H:%M:%S%z)"
}
EOF

cat ${FILE_INPUT}
```

JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。

```bash:コマンド:
jsonlint -q ${FILE_INPUT}
```

エラーが出力されなければOKです。


5.2. データの投入
-----------------

IDを更新します。

```bash:変数の設定:
ES_RECORD_ID='2'
```

POST先のURLを組み立てます。

```bash:変数の設定:
ES_URL_POST="${ES_DOMAIN_ENDPOINT}/${ES_INDEX_NAME}/${ES_TYPE_NAME}/${ES_RECORD_ID}" \
  && echo ${ES_URL_POST}
```

```bash:変数の確認:
cat << ETX

  ES_URL_POST: ${ES_URL_POST}
  FILE_INPUT:  ${FILE_INPUT}

ETX
```

```bash:コマンド:
curl -X PUT ${ES_URL_POST} -d @"${FILE_INPUT}"
```

```json:結果(例):
{"_index":"handson-esdomain-20160411","_type":"testlog","_id":"2","_version":1,"created":true}
```

"Discover"の下にある"field1"に新しいデータが表示されればOKです。


6. 検索
=======

GET先のURLを組み立てます。

```bash:変数の設定:
ES_URL_GET="${ES_DOMAIN_ENDPOINT}/${ES_INDEX_NAME}/${ES_TYPE_NAME}" \
  && echo ${ES_URL_GET}
```

```bash:変数の設定:
ES_SEARCH_WORD='8'
```

```bash:変数の確認:
cat << ETX

  ES_URL_GET:     ${ES_URL_GET}
  ES_SEARCH_WORD: ${ES_SEARCH_WORD}

ETX
```

```bash:コマンド:
curl -XGET "${ES_URL_GET}/_search?q=${ES_SEARCH_WORD}"
```

```json:結果(例):
{"took":14,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":0.11506981,"hits":[{"_index":"handson-esdomain-20160411","_type":"testlog","_id":"2","_score":0.11506981,"_source":{  "field1":8,  "@timestamp":"2016-04-11T17:30:28+0900"}}]}}
```

完了
====

以上で、Elasticsearch Serviceドメインへのデータの投入と検索が完了しました。