docker-composeでElasticSearch6.2を構築してECSにデプロイするまで(後編)

<img width="693" alt="画像 2018-07-06 14.10.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/429986c6-5ce6-3f49-5cb6-d13a79167360.png">

## はじめに

皆さん、どうもです。[ｋ．ｓ．ロジャース](https://www.wantedly.com/companies/ks-rogers)のやすもんです。
最近は2018/7/20の欅坂のライブチケットが当選しウッキウキですw
前回構築したDockerのES環境をECSにデプロイしてみましょう
前編：[ローカル構築編](https://qiita.com/yasumon/items/2ee09bde35c19e29495b)
後編：ECS構築編<-イマココ
AWSの登録とかIAMの払い出しとか細かい設定は完了している前提で進めます！
それでは、早速いってみましょう！

## S3にインデックスを保存する設定をDockerfileに盛り込む
予めS3のフル権限を与えたIAMを作成し、アクセスキーをDockerfileに記述
(今回はテストなので、アクセスキーべた書き仕様ですが運用するなら環境変数に登録しようね)

```
# ElasticDocker
FROM docker.elastic.co/elasticsearch/elasticsearch:6.2.4

MAINTAINER Kenji Yasumoto <yasumoto@ks-rogers.co.jp>

RUN wget http://dl.embulk.org/embulk-latest.jar -O /usr/local/bin/embulk
RUN chmod +x /usr/local/bin/embulk
RUN embulk gem install embulk-input-mysql embulk-output-elasticsearch

RUN bin/elasticsearch-plugin install analysis-kuromoji
RUN bin/elasticsearch-plugin install repository-s3
RUN echo "{AWSアクセスキー}" | bin/elasticsearch-keystore add --stdin s3.client.default.access_key
RUN echo "{AWSシークレットキー}" | bin/elasticsearch-keystore add --stdin s3.client.default.secret_key
```

docker buildしましょう

```
$ docker build -t es:latest ./
```

## ECSにDockerイメージのレポジトリを作成

ECSのレポジトリに行きます
<img width="633" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/c944b863-a662-69a2-d883-312dff6b94f1.png">

<img width="633" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/d0272d31-f6bb-a65a-4bdc-4cfab1cf1616.png">

余談ですが、Fargateの東京リージョンが正式ローンチされましたね

<img width="657" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/66002c76-d216-a800-b199-4831a46c8e85.png">

リポジトリ名を入れて次のステップへ

<img width="624" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/e8707e9f-679a-64c2-c675-b30405dee236.png">

こんな感じで作成が成功し、下部に`docker login`コマンドや`push`コマンドが表示されます

<img width="596" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/8eb71f12-0964-174c-eaba-df47cf8d0326.png">

## ECSにDockerイメージをpush
IAMにてECS周りのアクセス権を与えたユーザを作成し、払い出されたアクセスキーとシークレットキーをローカルのPCに`aws configure`で登録しておく

ECRにログインする

```
$ aws ecr get-login --no-include-email --region ap-northeast-1 
docker login -u AWS -p {
...アクセスキーに応じて払い出されるPASS...
}
```

上記の払い出されたdocker loginコマンドをコピペして実行

```
$ docker login -u AWS -p {
...アクセスキーに応じて払い出されるPASS...
}
```

`Login Succeeded`と出たらOK

Dockerイメージ名を変更し、pushする

```
$ docker tag es:latest {docker pushコマンドで表示されているECRのURI}:latest

$ docker push {docker pushコマンドで表示されているECRのURI}:latest
The push refers to ...
52eab7c8b116: Pushed 
000ab98e2152: Pushed 
ff34e289ee58: Pushed 
cc8cc2cd6f22: Pushed 
c04a55c2bc3c: Pushed 
b5b592cc05af: Pushing   15.6MB/45.58MB
c31482ff08c8: Pushing  23.86MB/45.58MB
174558baba94: Pushing  9.728kB
411b4147070c: Pushing   7.68kB
81fb25ec558e: Pushing  548.9kB/158.7MB
4364cb436730: Waiting 
16b33258d165: Waiting 
43e653f84b79: Waiting 
```
上記のような感じでpushが始まります

push後、ECSのレポジトリの画面を更新すると、イメージが増えてるのがわかります。
<img width="1293" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/b9023a00-df96-d26d-f6a7-af2e7e1a2725.png">

kibanaのイメージもタグを変えてpush

```
$ docker tag docker.elastic.co/kibana/kibana:6.2.4  {docker pushコマンドで表示されているECRのURI}:kibana

$ docker push {docker pushコマンドで表示されているECRのURI}:kibana
The push refers to ...
c1ce33312cdf: Pushing  50.31MB/405.8MB
1c602b5d4992: Pushed 
ed0555212889: Pushing   7.68kB
4d13a9abeb20: Pushed 
4a934c11c8d4: Pushed 
5f601642a6aa: Waiting 
edc9c825df80: Waiting 
7e0785d9c464: Waiting 
43e653f84b79: Waiting 
```

再度確認
<img width="1287" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/4ec5e4c8-892e-dfb0-ef50-49fcaee97a82.png">

## ECSクラスタを起動
### ESの設定
簡単に言うとEC2インスタンスです。ぽちぽちっとやっちゃいましょう
<img width="1227" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/95d8731a-4fd4-a23c-869f-81ccf2d78d48.png">

EC2Linuxを選択
<img width="1348" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/22a7b900-a7b1-da80-3507-991e08ffde6e.png">

諸情報を入力
ちなみにt2.microだとリソース不足でESのコンテナが立ち上がりませんでした。
SSHキーは別途用意しておきましょう
<img width="1291" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/b43bcaf6-04f8-86da-74f0-4f43f4d56c13.png">

実運用ではVPCを別途構築してアタッチするのが良いですが、今回はそのままゴリッと
*今回はインバウンドルールを0.0.0.0/0にしていますが、セキュリティ的に悪いので自分のIPを指定しましょう*
<img width="903" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/35d0ad22-2695-8bbf-05cd-a46614bd659d.png">


作成を押して完了
<img width="889" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/7e9ca897-7c19-4fa6-a8a8-053dafbb082f.png">

クラスターが立ち上がるのをまちましょう

### kibanaの設定
最初はESと一緒
<img width="1227" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/95d8731a-4fd4-a23c-869f-81ccf2d78d48.png">

EC2Linuxを選択
<img width="1348" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/22a7b900-a7b1-da80-3507-991e08ffde6e.png">

kibanaはt2.microでいいかな
<img width="766" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/e6b01e4f-5d78-f634-1044-a76897297c19.png">

さっき作ったVPCに相乗りしましょう。
セキュリティグループは新しく作ってね
*今回はインバウンドルールを0.0.0.0/0にしていますが、セキュリティ的に悪いので自分のIPを指定しましょう*
<img width="1005" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/86426547-fb84-97e5-197f-2eeec0a2bd4e.png">

IAMロールはESを作ったときに自動で作成されるので、それを使いましょう
<img width="846" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/eb560bfa-8ffc-ccd0-bc15-fa4b54ca2306.png">

クラスターが立ち上がるのを待って確認
<img width="1229" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/949b76d4-53ec-aecc-ed11-d1529d56bbe1.png">

## タスク定義の作成
### ESの設定
基本は前編のdocker-composeを元に設定する
<img width="856" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/752b29b6-f292-f7d2-d8b5-f521be1fa16f.png">

EC2を選択
<img width="1288" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/d752458d-8ba3-39e8-8e8e-779d26a03025.png">

ココらへんはほぼデフォルト
<img width="916" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/e096e9e4-182d-f16d-ee91-4db72beea1a7.png">

コンテナ追加をクリック
<img width="923" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/a467ec73-e8de-9ce1-7629-a1b99f2c6904.png">

諸情報を入力
メモリ制限などは立ち上げたコンテナインスタンスに準ずる(今回はt2.smallなので1900割当)
<img width="940" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/6cfa6786-4bf3-fea0-59d3-c879376de551.png">

環境変数などを設定
<img width="954" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/db21646f-adf7-e110-9542-175f0f9c11b1.png">

ulimitを設定
docker-composeではmemlockだけでよかったが、ECSで立ち上げる場合はNOFILEも設定する
<img width="901" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/5a48a2bc-6e4c-a81f-8523-a2dc8205405a.png">

作成して完了
<img width="971" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/a252b37e-b779-ffad-22c4-c784a9446f84.png">

### kibanaの設定
最初はほぼ同じ
<img width="856" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/752b29b6-f292-f7d2-d8b5-f521be1fa16f.png">

<img width="1288" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/d752458d-8ba3-39e8-8e8e-779d26a03025.png">

<img width="884" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/06b484ce-917d-aec7-aa3d-2083e291e8b0.png">

<img width="923" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/a467ec73-e8de-9ce1-7629-a1b99f2c6904.png">

諸情報を入力
メモリ制限などは立ち上げたコンテナインスタンスに準ずる(今回はt2.microなので900割当)
<img width="937" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/86203305-0ce5-400b-e30a-a710c0216cdd.png">

環境変数を設定
<img width="906" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/7c02e07d-9c3d-96d5-6929-c6d2fcadb07d.png">

作成して完了
<img width="971" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/a252b37e-b779-ffad-22c4-c784a9446f84.png">

タスク定義が作成されているのを確認
<img width="880" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/12d01301-7738-6f39-c4bb-48b5505bb60a.png">

## ESインスタンスの設定を行う
SSHでESインスタンスへログインする
(ESは9200ポートしか開けてないと思うので、このときだけ22番ポートをセキュリティグループに追加する)

ログインできたら以下を実行しておく、これを実行しておかないとESコンテナが立ち上がらずハマってしまいます。。。

```
sudo sysctl -w vm.max_map_count=262144
```

※補足
せっかくのECSなのにSSHしてるなんてセンス無いよ><
という方は以下を参考に`sudo sysctl -w vm.max_map_count=262144`コマンドを起動スクリプトに埋め込んでやってみてはどうでしょうか？今回は本筋とはずれますので割愛します。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/launch_container_instance.html
https://stackoverflow.com/questions/41792918/aws-container-service-set-max-map-count

## serviceを起動する
### ESのserviceを起動
作成したクラスタに入る
<img width="1312" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/46b31e79-8162-7b3f-d64a-3b006868ea63.png">

サービスの作成をクリック
<img width="1265" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/de7d9604-afab-eebf-d730-dae354bf070d.png">

諸情報を入力、今回はタスク1個なのでヘルスは0,100にしてます。(ココらへんの説明需要あるかな？ありそうであれば別で記事書くかも)
<img width="883" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/12bccfff-c820-486f-f6e3-a63c15a4e9d2.png">

次のステップへ
<img width="954" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/aecacb54-e2d8-fb60-e412-81c1fb5a8382.png">

今回はALBもASも利用しないので、スキップ
<img width="1077" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/eb7933a6-b10d-587f-76aa-a651489690d3.png">

<img width="973" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/cb413877-ec48-fb3e-1c11-f0ce1aa5ce0e.png">

サービスの確認
RUNNINGになっていればOK
<img width="1415" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/3725b592-c52d-1f56-d96f-8b32816f1b40.png">

ちなみに設定を間違っているとこんな感じで立ち上がっては死んでを繰り返します
<img width="807" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/4b96554b-fa90-ff48-26f9-3cad9f85b619.png">

curl投げてみる

```
$ curl -X GET http://{ESのIP}:9200/?pretty
{
  "name" : "3g4X5Co",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "0QzzJ1GyRKKOA9v1L1VDrA",
  "version" : {
    "number" : "6.2.4",
    "build_hash" : "ccec39f",
    "build_date" : "2018-04-12T20:37:28.497551Z",
    "build_snapshot" : false,
    "lucene_version" : "7.2.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

```

### 同じ要領でkibanaのserviceを立ち上げる
諸情報入力
<img width="841" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/b6fd6d39-1fc6-f6c4-d370-b298f362b000.png">

<img width="954" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/aecacb54-e2d8-fb60-e412-81c1fb5a8382.png">

ES同様ALBもASも利用しないので、スキップ
<img width="1077" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/eb7933a6-b10d-587f-76aa-a651489690d3.png">

<img width="973" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/cb413877-ec48-fb3e-1c11-f0ce1aa5ce0e.png">

サービスの確認
RUNNING担ってたらOK
<img width="1240" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/49e86ac2-5cc3-e436-6c6c-de74644f393f.png">

※kibanaは立ち上がりがすごく重いので5分くらい気長に待ちましょう。t2.microだと起動時にcpu使用率94%くらいまで跳ね上がりました

以下のURLにアクセスしてkibanaの画面に飛べるのを確認
http://{kibanaのIP}:5601

<img width="1524" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/a756b73f-d949-a893-dcf9-e25664c29853.png">

## データを投入して、確認してみる
[前編](https://qiita.com/yasumon/items/2ee09bde35c19e29495b#%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97mapping%E3%82%92%E8%A1%8C%E3%81%86)同様mappingのshellを作成し、実行

```
curl -X PUT $1':9200/test' -d '{
  "settings": {
    "index": {
      "analysis": {
        "tokenizer": {
          "kuromoji_user_dict": {
            "type": "kuromoji_tokenizer",
            "mode": "search",
            "discard_punctuation": "false"
          }
        },
        "analyzer": {
          "my_analyzer": {
            "type": "custom",
            "tokenizer": "kuromoji_user_dict",
            "filter": ["cjk_width"]
          }
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "id": {
          "type": "long"
        },
        "name": {
          "type": "text",
          "analyzer": "my_analyzer"
        },
        "url": {
          "type": "text"
        }
      }
    }
  }
}' -H 'Content-Type: application/json'

```

```
sh es-mapping.sh {ESのIP}
```

[前編](https://qiita.com/yasumon/items/2ee09bde35c19e29495b#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%82%8B)同様データを投入のShellを作成し(今回は割愛)、投入してみましょう

```
 sh import-data.sh {ESのIP}
```

curlを叩いて中身を確認

```
$ curl -X GET http://ESのIP:9200/test/_search?pretty
{
  "took" : 18,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 8,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "test",
        "_id" : "5",
        "_score" : 1.0,
        "_source" : {
          "id" : 5,
          "name" : "自分がフリーランスの人と契約する時に意識すること",
          "url" : "https://www.wantedly.com/companies/ks-rogers/post_articles/120559"
        }
      },
...{省略}
      {
        "_index" : "test",
        "_type" : "test",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "id" : 3,
          "name" : "非エンジニアが考えるエンジニアとの関わり方",
          "url" : "https://www.wantedly.com/companies/ks-rogers/post_articles/119827"
        }
      }
    ]
  }
}

```

## kibanaでデータ確認
[大筋はこちらを参照](https://qiita.com/yasumon/items/2ee09bde35c19e29495b#kibana%E3%81%AE%E7%A2%BA%E8%AA%8D)

インデックスを読み込ませて確認
<img width="1551" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/9b616457-8315-43a3-8123-715f9e11e6ac.png">

問題なくデータが見れますね

## 最後に
今回は[前回](https://qiita.com/yasumon/items/2ee09bde35c19e29495b)の内容に引き続き、実際に作ったDocker環境をECSにデプロイしてみました。

ECSで構築する際のハマりポイントなども解説にいれましたので、すんなり構築できるのではないでしょうか！？
ECSまだ使ったこと無いよー＞＜　て方でも、上から順番になぞっていけば構築できるようにかいてみましたので、これを機にDocker on ESをECSにデプロイして見てはいかがでしょうか？

#### Wantedlyでもブログ投稿してます
Techブログに加えて会社ブログなどもやっているので、気になった方はぜひ覗いてみてください。
https://www.wantedly.com/companies/ks-rogers