Elasticsearch
docker
kibana
ECS
docker-compose

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

画像 2018-07-06 14.10.11.png

はじめに

皆さん、どうもです。k.s.ロジャースのやすもんです。
最近は2018/7/20の欅坂のライブチケットが当選しウッキウキですw
前回構築したDockerのES環境をECSにデプロイしてみましょう
前編:ローカル構築編
後編: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のレポジトリに行きます
image.png

image.png

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

image.png

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

image.png

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

image.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のレポジトリの画面を更新すると、イメージが増えてるのがわかります。
image.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 

再度確認
image.png

ECSクラスタを起動

ESの設定

簡単に言うとEC2インスタンスです。ぽちぽちっとやっちゃいましょう
image.png

EC2Linuxを選択
image.png

諸情報を入力
ちなみにt2.microだとリソース不足でESのコンテナが立ち上がりませんでした。
SSHキーは別途用意しておきましょう
image.png

実運用ではVPCを別途構築してアタッチするのが良いですが、今回はそのままゴリッと
今回はインバウンドルールを0.0.0.0/0にしていますが、セキュリティ的に悪いので自分のIPを指定しましょう
image.png

作成を押して完了
image.png

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

kibanaの設定

最初はESと一緒
image.png

EC2Linuxを選択
image.png

kibanaはt2.microでいいかな
image.png

さっき作ったVPCに相乗りしましょう。
セキュリティグループは新しく作ってね
今回はインバウンドルールを0.0.0.0/0にしていますが、セキュリティ的に悪いので自分のIPを指定しましょう
image.png

IAMロールはESを作ったときに自動で作成されるので、それを使いましょう
image.png

クラスターが立ち上がるのを待って確認
image.png

タスク定義の作成

ESの設定

基本は前編のdocker-composeを元に設定する
image.png

EC2を選択
image.png

ココらへんはほぼデフォルト
image.png

コンテナ追加をクリック
image.png

諸情報を入力
メモリ制限などは立ち上げたコンテナインスタンスに準ずる(今回はt2.smallなので1900割当)
image.png

環境変数などを設定
image.png

ulimitを設定
docker-composeではmemlockだけでよかったが、ECSで立ち上げる場合はNOFILEも設定する
image.png

作成して完了
image.png

kibanaの設定

最初はほぼ同じ
image.png

image.png

image.png

image.png

諸情報を入力
メモリ制限などは立ち上げたコンテナインスタンスに準ずる(今回はt2.microなので900割当)
image.png

環境変数を設定
image.png

作成して完了
image.png

タスク定義が作成されているのを確認
image.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を起動

作成したクラスタに入る
image.png

サービスの作成をクリック
image.png

諸情報を入力、今回はタスク1個なのでヘルスは0,100にしてます。(ココらへんの説明需要あるかな?ありそうであれば別で記事書くかも)
image.png

次のステップへ
image.png

今回はALBもASも利用しないので、スキップ
image.png

image.png

サービスの確認
RUNNINGになっていればOK
image.png

ちなみに設定を間違っているとこんな感じで立ち上がっては死んでを繰り返します
image.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を立ち上げる

諸情報入力
image.png

image.png

ES同様ALBもASも利用しないので、スキップ
image.png

image.png

サービスの確認
RUNNING担ってたらOK
image.png

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

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

image.png

データを投入して、確認してみる

前編同様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}

前編同様データを投入の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でデータ確認

大筋はこちらを参照

インデックスを読み込ませて確認
image.png

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

最後に

今回は前回の内容に引き続き、実際に作ったDocker環境をECSにデプロイしてみました。

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

Wantedlyでもブログ投稿してます

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