はじめる前に
- 必須AWS アカウントを持っていること
- 必須マネジメントコンソールにサインインできること
- 必須S3バケットの作成、CodeBuildプロジェクトの作成経験
- あると良いCloudWatch Logsを見たことがある
※ このハンズオンは すべてコンソールだけで完結します。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
※ リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
ビルドは、コマンドの打ち間違いや存在しないファイルの参照など、さまざまな理由で失敗します。失敗そのものは珍しいことではありませんが、「どこで」「なぜ」失敗したのかを早く特定できるかどうかで、調査にかかる時間は大きく変わります。
今回はあえて失敗するbuildspec.ymlを用意してビルドを実行し、CodeBuildのフェーズ詳細とCloudWatch Logsのビルドログから原因を特定したうえで、修正して再実行する一連の流れを体験します。
ビルドが失敗すると、どこに記録が残るの?
ビルドの実行結果(成功・失敗)と、どのフェーズで失敗したかは、CodeBuildのビルド履歴の中に残ります。コマンドの詳しい実行結果やエラーメッセージは、CodeBuildが自動的に送っているCloudWatch Logsのログに残ります。
フェーズ詳細だけ見れば十分で、ログまで見る必要はないのでは?
フェーズ詳細で分かるのは「どのフェーズで失敗したか」までです。「具体的にどのコマンドが、どんなエラーメッセージで失敗したか」を知るには、CloudWatch Logsのログを開く必要があります。
あえて失敗するビルドを実行し、フェーズ詳細でどのフェーズが失敗したかを確認したうえで、CloudWatch Logsのビルドログからエラーメッセージの該当行を見つけ、原因に対応する修正を行って再実行し、Succeededになることを確認する。
見える情報の違い
フェーズ詳細だけを見る場合と、CloudWatch Logsまで見る場合とで、分かる情報の深さが変わります。
フェーズ詳細だけ見る
「BUILDフェーズが失敗した」ということは分かりますが、具体的にどのコマンドが、どんなメッセージでエラーになったのかまでは分かりません。
CloudWatch Logsまで見る
実行された各コマンドの出力がそのまま記録されており、エラーメッセージの正確な文言や、失敗したコマンドそのものを特定できます。
要件
以下の要件を満たし、失敗の調査から修正までの一連の流れを体験してください。
| No | 要件 |
|---|---|
| 1 | あえて失敗する内容のbuildspec.ymlを含むZIPを用意し、S3の入力用バケットにアップロードする。 |
| 2 | CodeBuildプロジェクトを1つ作成し(ソース:Amazon S3、環境:マネージド型イメージ、サービスロール:新規作成)、ビルドを実行する。 |
| 3 | ビルドのステータスが「Failed」になり、フェーズ詳細でどのフェーズが失敗したかを確認する。 |
| 4 | CloudWatch Logsのビルドログを開き、エラーメッセージの該当行を見つける。 |
| 5 | 原因に対応する形でbuildspec.ymlを修正し、ZIPを再アップロードしてビルドを再実行し、ステータスが「Succeeded」に変わることを確認する。 |
構築の進め方
「あえて失敗するソースを準備する」→「実行して失敗を確認する」→「ログで原因を特定し、修正する」という順番で進めます。
- フェーズ1 — あえて失敗するソースを準備する
-
マネジメントコンソールにサインインし、リージョンを合わせる
ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。
-
あえて失敗するbuildspec.ymlを作成し、ZIPにまとめる
次の内容で
buildspec.ymlを作成します。catコマンドが、存在しないファイルを読み込もうとする内容です。version: 0.2 phases: build: commands: - echo "ビルドを開始します" - cat does-not-exist.txtこのファイル1つだけをZIPにまとめます(他のファイルは不要です)。
-
S3バケットを作成し、ZIPをアップロードする
入力用のS3バケットを1つ作成し(名前は一意に、例:
codebuild-debug-input-yourname)、手順2で作成したZIPをアップロードします。 - フェーズ2 — 実行して失敗を確認する
-
CodeBuildプロジェクトを作成し、ビルドを実行する
CodeBuildコンソールで、ソースプロバイダーに「Amazon S3」を選び、手順3のバケットとZIPのオブジェクトキーを指定してプロジェクトを作成します。環境はマネージド型イメージ・Amazon Linux・Standardのままでよく、Artifactsは「No artifacts」のままで構いません。プロジェクトを作成したら「ビルドを開始」を選びます。
-
フェーズ詳細でステータスを確認する
ビルドが完了すると、ステータスが「Failed」になります。フェーズ詳細の一覧で、どのフェーズ(おそらく
BUILD)に失敗のマークが付いているかを確認します。 - フェーズ3 — ログで原因を特定し、修正する
-
CloudWatch Logsのビルドログを開く
ビルド詳細ページの「ビルドログ」を確認し、「View entire log(ログ全体を表示)」からCloudWatch Logsのログストリームを開きます。ログの末尾付近に、実行したコマンドとエラーメッセージが記録されています。
[Container] ビルドを開始します cat: does-not-exist.txt: No such file or directory -
buildspec.ymlを修正し、再実行する
原因(存在しないファイルを参照していること)に対応する形で、
cat does-not-exist.txtの行を削除(または存在するファイルを参照する内容に変更)し、ZIPを作り直して同じS3バケットにアップロードします。CodeBuildプロジェクトの設定でオブジェクトキーが同じであれば、再度「ビルドを開始」するだけで新しい内容が反映されます。これがゴール最初は何が起きているのか分からなかった失敗が、ログを見て原因が特定でき、修正後にSucceededへ変わる——この一連の流れを確認できたら、このハンズオンの目的は達成です。
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直すか」の手がかりとして使ってください。
「Failedとは表示されるが、どこで失敗したのか見つけられない」
フェーズ詳細の一覧を上から順に見て、ステータス列に失敗を示す表示がどの行に付いているかを見直しましょう。
「ログの量が多くて、エラー箇所を見つけられない」
エラーは多くの場合、ログの末尾近く(処理が止まった直前)に現れます。「Filter events(イベントのフィルター)」機能でキーワードを絞り込む方法も見直してみましょう。
完了チェック
要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。次を順に確かめましょう。
- 最初のビルドの履歴で、ステータスが「Failed」になっている。
- フェーズ詳細で、
BUILDフェーズに失敗のマークが付いている。 - CloudWatch Logsのログに、
No such file or directoryのようなエラーメッセージが表示されている。 - 修正後に再実行したビルドの履歴で、ステータスが「Succeeded」に変わっている。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- ログを見る習慣がない場合、原因の特定にどれくらい時間がかかりそうでしょうか。
ヒント
エラーメッセージを読まずに、コードを推測だけで直そうとした場合との違いを考えてみましょう。 - 同じような失敗が何度も起きる場合、どのような対策が考えられるでしょうか。
ヒント
毎回ログを見て直す方法と、最初からミスが起きにくい仕組みにしておく方法、それぞれの手間を比べてみましょう。 - ビルドが失敗したことに、人が気づかずに放置されてしまうと、どんな問題が起こり得るでしょうか。
ヒント
失敗を自動的に知らせる仕組みがない場合、誰がいつ気づくのかを考えてみましょう(このハンズオンでは扱っていない発展的な内容です)。
後片づけ
作成したリソースを順番に削除します。
- CodeBuildプロジェクトを削除する:CodeBuildコンソールのプロジェクト一覧から削除します。
- CloudWatch Logsのロググループを削除する:プロジェクトを削除してもログは自動的には消えません。不要であれば、CloudWatch Logsコンソールから該当のロググループ(
/aws/codebuild/プロジェクト名)を削除します。 - 自動作成されたIAMロールを削除する:プロジェクト作成時に新規作成したサービスロールが残っている場合は、IAMコンソールから削除します。
- S3バケットを空にして削除する:入力用バケットの中身を削除してから、バケット本体を削除します。
コストに関する注意: CodeBuild は、ビルドの実行時間(分)に応じて課金されます。失敗したビルドも、実行された時間分は課金の対象です。CloudWatch Logs は、ログの取り込み量と保存量に応じて課金されます。少量のログであれば料金はごく小さく済みますが、ロググループを削除せずに放置すると蓄積され続けるため、不要になったら削除しましょう。S3の保存容量・リクエストにも別途料金がかかりますが、少量であれば無料利用枠の範囲内に収まることが多いです。最新の料金は AWS の公式料金ページで確認してください。