Redash on EC2の障害と復旧作業


EC2でホスティングしているRedashが停止しました。

ELBから告げられる 502 Bad Gateway のメッセージ

原因特定から復旧までのログを残します。

原因特定

ELBのログ調査

さっそく省略します。なぜなら、ALBのロギングが有効になっていなかったため。

次回以降に役立つよう、AWSの公式ドキュメントに従って、ALBのアクセスログをS3に保存するように設定しておきます。
https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#enable-access-logging

EC2インスタンスへの直接アクセス

踏み台サーバー経由で、EC2インスタンスの80番ポートにアクセスします。すると接続できない。
SecurityGroupに変更を加えた覚えはないので、EC2の中で問題が起きている可能性が高そうです。

curl -v  ip-**-**-**-**.ap-northeast-1.compute.internal:80
...
* Failed to connect to ip-**-**-**-**.ap-northeast-1.compute.internal port 80: Connection refused
* Closing connection 0
...

ちなみに、成功した場合のレスポンスはこんな感じです。

curl -v  ip-**-**-**-**.ap-northeast-1.compute.internal:80

< HTTP/1.1 302 FOUND
< Server: nginx/1.9.10
< Date: Tue, 12 Jan 2021 01:21:12 GMT
......

RedashへのSSHとプロセスの死活確認

Redashの入っているEC2インスタンスにSSHし、当該プロセスの死活確認をします。
ここで、そもそもRedash on EC2ってどうやって動いているんだっけ?という疑問に突き当たりました。

公式ドキュメントによれば docker-compose を利用しているとのこと。

What the script does is:

Install Docker and Docker Compose.
Download our recommended Docker Compose configuration and create initial configuration.
Start everything.

確認してみると...あれ、Dockerプロセスが死んでますね。

/opt/redash$ sudo docker ps
sudo: unable to resolve host ip-**-**-**-**: Resource temporarily unavailable
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

原因特定と復旧作業

原因特定

docker-composeプロセスを再起動するため、Redashのアップグレード手順を参考に再起動を実行すると、エラーが発生しました。


cd /opt/redash
docker-compose up -d

> INTERNAL ERROR: cannot create temporary directory

検索するとディスクの残量が少ないことが原因のよう。
https://stackoverflow.com/questions/40755494/docker-compose-internal-error-cannot-create-temporary-directory

アプリケーションレベルでは、Redashがクエリの実行結果をキャッシュしていることが原因のような気がします。
https://discuss.redash.io/t/redash-taking-high-disk-space/6777

そういえば limit句 なしでクエリを実行して、レスポンスがなかったのでブラウザのタブを閉じたような記憶が...
(PostgresDBの中を覗けば明らかになると思いますが、今回はそこまでしません)

復旧作業

QiitaAWSのドキュメントに従い、EBSのボリュームの追加とデバイス・ファイルシステムへの割り当ての増加を行いました。

反省

EC2のディスク・メモリの逼迫はデフォルトのメトリクスに出てこないので、必ず追加設定するような仕組み作りがしたいところですね。