 
はじめに
皆さん、どうもです。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イメージのレポジトリを作成
 
余談ですが、Fargateの東京リージョンが正式ローンチされましたね
 
リポジトリ名を入れて次のステップへ
 
こんな感じで作成が成功し、下部にdocker loginコマンドやpushコマンドが表示されます
 
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のレポジトリの画面を更新すると、イメージが増えてるのがわかります。

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 
ECSクラスタを起動
ESの設定
簡単に言うとEC2インスタンスです。ぽちぽちっとやっちゃいましょう

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

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

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

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

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

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

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

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

 
ちなみに設定を間違っているとこんな感じで立ち上がっては死んでを繰り返します

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を立ち上げる
 
 
※kibanaは立ち上がりがすごく重いので5分くらい気長に待ちましょう。t2.microだと起動時にcpu使用率94%くらいまで跳ね上がりました
以下のURLにアクセスしてkibanaの画面に飛べるのを確認
http://{kibanaのIP}:5601
 
データを投入して、確認してみる
前編同様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でデータ確認
問題なくデータが見れますね
最後に
今回は前回の内容に引き続き、実際に作ったDocker環境をECSにデプロイしてみました。
ECSで構築する際のハマりポイントなども解説にいれましたので、すんなり構築できるのではないでしょうか!?
ECSまだ使ったこと無いよー>< て方でも、上から順番になぞっていけば構築できるようにかいてみましたので、これを機にDocker on ESをECSにデプロイして見てはいかがでしょうか?
Wantedlyでもブログ投稿してます
Techブログに加えて会社ブログなどもやっているので、気になった方はぜひ覗いてみてください。
https://www.wantedly.com/companies/ks-rogers



















