今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、CodeBuildのデバック方法についての日。

目次

とある日

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のコマンドがエラーになったことだけです。

ただなぜ、エラーになったのかはわかりません。

そのため、関連するエラーで検索・推測するしかないです。

よくあるエラーの場合はトラブルシュートし易いですが、以下のようなものの場合はかなり解決までに困難を極めます。

updraft.hatenadiary.com

このときは、2,3日ぐらいハマりました。

トラブルシュートする方法

先程の課題で述べたように、CodeBuildだとコマンドのエラー出力がログには出力されず、コマンドがエラーになったことだけわかります。

なので、このコマンドエラーをファイルに出力するようにして、finallycatするとなぜコマンドが失敗したのかログを見れるようになります。

(要点を抑えるだけの設定のため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が実行されたあとに実行されるコマンド

ポイント

標準エラー出力をファイルに出力する

「2>>」を追加することで標準エラー出力だけをリダイレクトできます。

mysql -u root sample_db < test.sql 2>> error.log

bash: 標準出力、標準エラー出力をファイル、画面それぞれに出力する方法 - Qiita

finallyで最後に出力する

commandscatをしない理由としては、commandsはエラーになった場合は中断されるので最後にログファイルを出力する処理があった場合は実行されないのでわかりません。

finallyの場合は、commandsのあとに実行されますし、必ず実行されるためエラーログを見ることができます。

phases/*/finally

オプションのブロック。finally ブロックに指定したコマンドは、commands ブロックのコマンドの実行後に実行されます。finally ブロックに指定したコマンドは、commands ブロックのコマンドが失敗した場合でも実行されます。例えば、commands ブロック内に 3 つのコマンドがあり、最初のコマンドが失敗した場合、CodeBuild は残りの 2 つのコマンドをスキップして finally ブロック内のコマンドを実行します。commands ブロックと finally ブロックのすべてのコマンドが正常に実行されると、フェーズは成功します。フェーズのいずれかのコマンドが失敗すると、フェーズは失敗します。

CodeBuild のビルド仕様に関するリファレンス - AWS CodeBuild

updraft.hatenadiary.com

CodeBuildは実行まで時間かかるのでトラシュしづらくてあまり好きじゃあないです。

参考資料

AWS CodeBuild のトラブルシューティング - AWS CodeBuild

mysqlコマンドのエラー出力をログに吐く #mysql - ジムには乗りたい