目次
とある日
CodeBuildの「COMMAND_EXECUTION_ERROR」で詳細なエラーメッセージでないのでトラブルシュートがめちゃくちゃ大変なのでそれに対する対処法についてまとめた内容です。
[Container] 2018/03/21 04:39:31 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: docker tag demo:latest $REPOSITORY_URI:latest. Reason: exit status 1
CodeBuildトラブルシュートの課題
CodeBuildでコマンドの実行時エラーの場合は以下のようなログがCodeBuildのログに出力される。
[Container] 2018/03/21 04:39:31 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: docker tag demo:latest $REPOSITORY_URI:latest. Reason: exit status 1
このエラーからわかることは、docker tag demo
のコマンドがエラーになったことだけです。
ただなぜ、エラーになったのかはわかりません。
そのため、関連するエラーで検索・推測するしかないです。
よくあるエラーの場合はトラブルシュートし易いですが、以下のようなものの場合はかなり解決までに困難を極めます。
このときは、2,3日ぐらいハマりました。
トラブルシュートする方法
先程の課題で述べたように、CodeBuildだとコマンドのエラー出力がログには出力されず、コマンドがエラーになったことだけわかります。
なので、このコマンドエラーをファイルに出力するようにして、finallyでcat
するとなぜコマンドが失敗したのかログを見れるようになります。
(要点を抑えるだけの設定のためinstallにすべて書いてます)
version: 0.2 phases: install: commands: - echo Entered the install phase... - apt-get update -y - mysql -u root sample_db < test.sql 2>> error.log # デバックしたいコマンド finally: - cat error.log # install のcommandsが実行されたあとに実行されるコマンド
ポイント
- 標準エラー出力をファイルに出力する
finally
で最後に出力する
標準エラー出力をファイルに出力する
「2>>」を追加することで標準エラー出力だけをリダイレクトできます。
mysql -u root sample_db < test.sql 2>> error.log
bash: 標準出力、標準エラー出力をファイル、画面それぞれに出力する方法 - Qiita
finally
で最後に出力する
commands
でcatをしない理由としては、commands
はエラーになった場合は中断されるので最後にログファイルを出力する処理があった場合は実行されないのでわかりません。
finally
の場合は、commands
のあとに実行されますし、必ず実行されるためエラーログを見ることができます。
phases/*/finally
オプションのブロック。
finally
ブロックに指定したコマンドは、commands
ブロックのコマンドの実行後に実行されます。finally
ブロックに指定したコマンドは、commands
ブロックのコマンドが失敗した場合でも実行されます。例えば、commands
ブロック内に 3 つのコマンドがあり、最初のコマンドが失敗した場合、CodeBuild は残りの 2 つのコマンドをスキップしてfinally
ブロック内のコマンドを実行します。commands
ブロックとfinally
ブロックのすべてのコマンドが正常に実行されると、フェーズは成功します。フェーズのいずれかのコマンドが失敗すると、フェーズは失敗します。
〆
CodeBuildは実行まで時間かかるのでトラシュしづらくてあまり好きじゃあないです。