Amazon Elasticsearch Serviceでcluster_block_exceptionが出てindexに書けなくなった場合の対処法

以前、自宅のElasticsearchをAmazon Elasticsearch Serviceに移した話を書いた。

www.yasuhisay.info

データは引越しせず新規のデータをAmazon Elasticsearch Serviceに放り込んでいくようにしていた(コストをめっちゃかけないと普通に動いてくれるのかちょっと不安だったので、最初は全部入れないようにした)。半年ほど経ったが、安定して運用できていたので元々あったデータもAmazon Elasticsearch Serviceに引っ越すことにした。schema(mapping)はどちらも同じなので、移行ツールを使ってデータの引っ越しをすることにした。

nmpでインストールして、inputを自宅のElasticsearch、outputをAmazon Elasticsearch Serviceに向けて動かす。

elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=http://staging.es.com:9200/my_index \
  --type=data

元気に引っ越しが始まったようだったので安心して寝たのだが、しばらくして様子を見に行ったら新規ドキュメントの追加ができなくなっており、上述のコマンドも以下のエラーで止まっていた。

{ _index: 'twitter_public_timeline',
  _type: 'tweet',
  _id: '841830783106990100',
  status: 403,
  error:
   { type: 'cluster_block_exception',
     reason: 'blocked by: [FORBIDDEN/8/index write (api)];' } }

cloudwatchに様子を見にいくと、disk fullになっており、やっちまったなーと思いながら不必要そうなドキュメントを削除。しかし、削除も403で怒られる…。調べてみるとどうやらディスクを増やすしかないようだ。

AWSのコンソールからEBS ボリュームサイズを35まで引き上げた(無料からは足が出る)。しばらくするとFreeStrageSpaceも0から余裕ができて、削除や新規のドキュメントの追加ができるようになった。AWSを普段から使っている人には慣れた操作かもしれないが、自分がメインで使っているサービスでなったのは初めてだったので、「なるほど、これが金の力で殴るってやつか」と妙な納得感が得られた。