Amazon Elasticsearch Serviceを最小構成で作ってみた

※最小構成（コスト的に）で構築する手順を書いていますが、注意が必要なので前置きが長いです。まずは作ってから考えたい人はスクロールして前置きを読み飛ばしてください
※構造を理解するために書いたものです。一部予想図で書いています
※Elasticsearchの具体的な操作方法は知りません。環境構築するためのお話です

# Amazon Elasticsearch Service（AmazonES）の位置づけ
Elasticsearch は、Elastic社が中心となって開発しているオープンソース製品名。
AmazonESは、このオープンソースをSaaSとして利用できるようにしたもの。

AWSの他のサービスと比べて、癖が強い感じがするので、癖の部分を”ポイント”としてまとめますた。
そのうえで、最小構成でAmazonESドメインを構築する手順を記載します。

## ポイント１：通信経路について

管理コンソールのドメイン作成ウィザードで、以下の選択があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/a3ac2e5f-1e2d-dd54-9c68-3ba2e8aa7034.png)

”VPCアクセス”とは、自分が作成したVPC内にインスタンスが作成されるわけではなく、VPCピアリングによって、Saas環境とプライベートIPで接続できる。という意味っぽい。
見えないところに↓のような環境が構築されるのだと思われる（あくまでも予想図）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/a7ff28a4-d161-003d-0f78-985bbdc9a544.png)

※VPCアクセスで設定したときは、自AWSアカウント側には**プライベートIPをもつネットワークインターフェイスのみ**ができている。VPCエンドポイントオブジェクトはできていない（隠している？？（陰謀論））


## ポイント２：ツールごとの操作範疇

CloudFormation / AWSCLI / AWSSDK は、AmazonESドメイン構築等、環境に関する部分のみ操作できる
Elasticsearch本体に対してのデータ操作関連は、HTTPSで行う。ポイント１の通信経路を経由して利用できるということになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/d4c807f2-c8ca-1757-e0bc-f659921ab35d.png)

なお、REST APIを使う場合は
接続先ホストは、”エンドポイント”
利用可能なAPIは [Open Distro for Elasticsearch](https://opendistro.github.io/for-elasticsearch-docs/)を使う事になる（多分、本家Elasticsearch APIからの派生したもの）


## ポイント３：インスタンスタイプと機能制限

[サポートされるインスタンスタイプ](https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/aes-supported-instance-types.html)
とりあえずお試しで使ってみたくて、インスタンスタイプを最弱である  **t2.small.elasticsearch** を 選択した場合は、「きめ細かい」と言われるアクセス方法が使えないので注意

Kibanaで使える機能も変わってくる様子

|きめ細かい無|きめ細かい有|
|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/f2f6acbc-e081-00dd-28e2-cb6db06e7db9.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/e022f15d-a6b3-a2d3-1f93-33d60971c043.png)|

## ポイント４：アクセス権限について

AmazonESドメインに対するアクセス制限は、以下のように３段階で考えるのが吉
（まくまでも予想図です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/4fe63a36-069e-6dbf-8b43-ddac01ad58ef.png)

1. 通信経路による制限 → VPCの中・外の２択。
2. 利用許可制限 → Elasticsearch側で許可するユーザ・ロール・IPアドレスが指定できる
3. きめ細やかな設定 → Kibanaにより指定可能

### 1.通信経路
ポイント１の通り
VPC経由の方が安全ですわな

### 2.利用許可
#### IAMでポリシーを決定する必要はない
ポイント２の通り、環境構築の場合はAWS側で。データ操作はElasticsearchで。という分類となる。
つまり、データ操作を行う場合は、IAMでポリシーを設定する必要はない。（というかできない）
Elasticsearchにとっては、”誰が（IAMuser）・何か(IAMrole)”が判ればよい程度となる。

#### Elasticsearch側の認可（利用許可）
[ここ](https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/es-ac.html)
・誰、もしくはどのリソースからのアクセスを許可するか→IAMリソースのARNによって指定
・どこからのアクセスを許可するか→IPアドレスで指定
・誰なら何が使えるとかも設定可能

ドメイン新規作成時の「アクセスポリシー」か、ドメイン作成後の「アクセスポリシーの変更」で設定できる


### 3.きめ細かな
[ここ](https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/fgac.html#fgac-access-control)に記載されている通り、要するにKibana内でARNごとに、具体的な操作まで指定できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/f7ec2195-d09d-f290-de22-6d605b429c1d.png)

Role MappingsにIAM User・RoleのARNを指定する事で接続許可される。
ここから先は、Kibana側の範疇になるので略


# 最小構成でのドメイン作成

ゴール：最小構成（コストが安い。という意味で）ドメインを作成し、自分のPCからKibanaが操作できること。

### Step 1

デプロイタイプ：開発およびテスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/6e4eb435-d590-ffe4-6def-c30f38279ee5.png)

### Step 2

ドメイン名とインスタンスタイプを指定します。
ドメイン名は適当に。インスタンスタイプは最安のt2.small.elasticsearch

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/1bcb3917-1fcb-b13a-1106-938fc2437531.png)
以下、デフォルト

### Step 3

パブリックアクセスを指定します。インターネット経由でElasticsearchとKibanaにアクセスするという意味です。
インターネット経由なので、何らかの制限をしておく必要があります→ドメインアクセスポリシーで縛ります
（ちなみにVPC内からアクセスできるのなら、ドメインアクセスポリシー設定は不要です。この例では”自分のPCでアクセスできること”をゴールとしているので。。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/cd6517b5-efe0-e4d9-8a10-d9744d315e7c.png)

t系のインスタンスタイプだと、「細かい…」が有効化できないので、ドメインアクセスポリシーで個別指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/528e9b50-4bdc-b085-6b5c-b7edebdbae1a.png)

ドメインアクセスポリシーで、アクセス許可するIPアドレスを指定します。
例として、192.168.100.100/32としていますが、グローバルIPを指定しないといけないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/74a21c3c-6d57-cbbf-c0f3-31ee1b6e57b3.png)
もしくは、JSONで定義できるのなら、[ここ](https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/es-ac.html)を参考に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/3c7983d4-9e45-4f87-6d88-f4a79b7cf309.png)



### 完成後
管理コンソールに、出力されている Kibana のURLにブラウザでアクセスしてみます。
Kibanaのログイン画面なしで、直接ログイン後画面になります。（IPアドレスでしか制限していないからですね）（怖）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/6789c666-f7f9-6c8e-8843-60d0864b6346.png)

試していないが、RESTAPIもパスワード無でいけてしまう気がする。。
接続できない場合は、ドメインアクセスポリシーで設定したIPアドレスが間違っているとか。






## まとめ
という事で、最小構成だとセキュリティ面がかなり心配。少なくともKibanaログインにユーザアカウントくらいは使いたい。
となるので、
t2.small.elasticsearchを使ってテストする場合は、あくまでも機能面の調査となると思われます。